Skip to main content

Like Groups model

StatusImplementation
✅ Shippedsrc/infra/db/schema/like-group.schema.ts

A like group is the application a user (and optional friends) submits to attend an event. See Approval algorithm for the threshold logic and side effects.

like_groups

ColumnTypeNotes
idUUID PKdefaultRandom()
event_idUUID FK → events.id ON DELETE CASCADE
creator_idUUID FK → auth.users.id
member_keytextCanonical sorted member IDs for uniqueness
chat_idUUID FK → chats.idnullable; populated on approved
statusenum like_group_statuspending, approved, rejected, expired
created_attimestamptz
CREATE TYPE like_group_status AS ENUM (
'pending', 'approved', 'rejected', 'expired'
);

CREATE INDEX like_groups_event_idx ON like_groups (event_id);
CREATE INDEX like_groups_status_idx ON like_groups (status);

-- Unique pending group composition per event
CREATE UNIQUE INDEX like_groups_pending_uniq
ON like_groups (event_id, member_key)
WHERE status = 'pending';

like_group_members

ColumnType
group_idUUID FK → like_groups.id ON DELETE CASCADE
user_idUUID FK → auth.users.id
created_attimestamptz
CREATE UNIQUE INDEX like_group_members_uniq
ON like_group_members (group_id, user_id);
CREATE INDEX like_group_members_user_idx ON like_group_members (user_id);

"One pending group per (event, user)"

Enforced via the member_key column on like_groups. The key is a canonical sorted string of all member UUIDs, and a partial unique index ensures no duplicate pending group compositions per event.

like_group_approvals

ColumnTypeNotes
idUUID PK
group_idUUID FK → like_groups.id ON DELETE CASCADE
author_idUUID FK → auth.users.idMust be an event author at time of approval
decisionenumconsent (approve) or refuse (reject)
created_attimestamptz
CREATE TYPE approval_decision AS ENUM ('consent', 'refuse');

CREATE INDEX like_group_approvals_group_idx ON like_group_approvals (group_id);
CREATE UNIQUE INDEX like_group_approvals_uniq
ON like_group_approvals (group_id, author_id);

The threshold check uses min(consentThreshold, eligible_organizers) and runs in the service layer, inside the same transaction that flips like_groups.status and creates the chat — see Approval algorithm.

like_group_audit

Append-only audit log for approval decisions.

ColumnTypeNotes
idUUID PK
group_idUUID FK → like_groups.id
actor_idUUID FK → auth.users.idWho made the decision
decisionenumconsent or refuse
resulting_statusenum like_group_statusStatus after decision
created_attimestamptz

Relationship overview