#!/usr/bin/python
+import datetime
import logging
import sqlalchemy
# Setup logging
log = logging.getLogger("pbs.sessions")
+SESSION_LIFETIME = datetime.timedelta(days=14)
+
class Sessions(base.Object):
async def create(self, user, address, user_agent=None):
"""
.select(Session)
.where(
Session.session_id == session_id,
- Session.valid_until >= sqlalchemy.func.current_timestamp(),
+ Session.expires_at > sqlalchemy.func.current_timestamp(),
)
)
"""
Deletes all sessions that are not valid any more
"""
+ stmt = (
+ sqlalchemy
+ .delete(
+ Session,
+ )
+ .where(
+ Session.expires_at <= sqlalchemy.func.current_timestamp(),
+ )
+ )
+
+ # Run the query
async with await self.db.transaction():
- await self.db.execute("DELETE FROM sessions WHERE valid_until < CURRENT_TIMESTAMP")
+ await self.db.execute(stmt)
class Session(database.Base):
created_at = Column(DateTime(timezone=False), nullable=False,
server_default=sqlalchemy.func.current_timestamp())
- # Valid Until
+ # Expires At
- valid_until = Column(DateTime(timezone=False), nullable=False,
- server_default=sqlalchemy.text("CURRENT_TIMESTAMP + INTERVAL '14 days'"))
+ expires_at = Column(DateTime(timezone=False), nullable=False,
+ server_default=sqlalchemy.func.current_timestamo() + SESSION_LIFETIME)
# Address
CREATE TABLE public.sessions (
id integer NOT NULL,
- session_id text NOT NULL,
- created_at timestamp without time zone DEFAULT now() NOT NULL,
- valid_until timestamp without time zone DEFAULT (now() + '7 days'::interval) NOT NULL,
+ session_id text DEFAULT gen_random_uuid() NOT NULL,
+ created_at timestamp without time zone DEFAULT CURRENT_TIMESTAMP NOT NULL,
+ expires_at timestamp without time zone NOT NULL,
user_id integer NOT NULL,
address inet,
user_agent text