membership.create() checks for joinable and player limit; factory creates joinable lexicons by default

This commit is contained in:
Nikolai 2021-06-07 16:29:16 -07:00
parent 973d60008d
commit 5497ef4b0b
2 changed files with 25 additions and 1 deletions

View File

@ -5,6 +5,7 @@ Membership query interface
from sqlalchemy import select, func
from amanuensis.db import DbContext, Membership
from amanuensis.db.models import Lexicon
from amanuensis.errors import ArgumentError
@ -36,6 +37,27 @@ def create(
):
raise ArgumentError("User is already a member of lexicon")
# get reference to lexicon for next few checks
lex: Lexicon = db(
select(Lexicon)
.where(Lexicon.id == lexicon_id)
).scalar_one_or_none()
# Verify lexicon is joinable; current no Lexicons are joinable so this is commented out
if not lex.joinable:
raise ArgumentError("Can't join: Lexicon is not joinable")
# Verify lexicon is not full
if lex.player_limit:
if (
db(
select(func.count())
.where(Membership.lexicon_id == lexicon_id)
).scalar()
>= lex.player_limit
):
raise ArgumentError("Can't join: Lexicon is full")
new_membership = Membership(
user_id=user_id,
lexicon_id=lexicon_id,

View File

@ -49,7 +49,9 @@ def make_lexicon(db: DbContext):
}
state["nonce"] += 1
updated_kwargs = {**default_kwargs, **kwargs}
return lexiq.create(db, **updated_kwargs)
lex = lexiq.create(db, **updated_kwargs)
lex.joinable = True
return lex
return lexicon_factory