(data): Schema and object model.
This commit is contained in:
@@ -259,6 +259,31 @@ CREATE TABLE subscriber_events (
|
||||
);
|
||||
|
||||
|
||||
CREATE VIEW event_details AS
|
||||
SELECT
|
||||
events.event_id AS event_id,
|
||||
events.user_id AS user_id,
|
||||
events.document_id AS document_id,
|
||||
events.user_name AS user_name,
|
||||
events.event_type AS event_type,
|
||||
events.occurred_at AS occurred_at,
|
||||
events.created_at AS created_at,
|
||||
plain_events.message AS plain_message,
|
||||
raid_events.visitor_count AS raid_visitor_count,
|
||||
cheer_events.amount AS cheer_amount,
|
||||
cheer_events.cheer_type AS cheer_type,
|
||||
cheer_events.message AS cheer_message,
|
||||
subscriber_events.subscribed_length AS subscriber_length,
|
||||
subscriber_events.tier AS subscriber_tier,
|
||||
subscriber_events.message AS subscriber_message,
|
||||
FROM
|
||||
events
|
||||
LEFT JOIN plain_events USING (event_id)
|
||||
LEFT JOIN raid_events USING (event_id)
|
||||
LEFT JOIN cheer_events USING (event_id)
|
||||
LEFT JOIN subscriber_events USING (event_id)
|
||||
ORDER BY events.occurred_at ASC;
|
||||
|
||||
-- }}}
|
||||
|
||||
-- Specimens {{{
|
||||
|
||||
273
src/datamodels.py
Normal file
273
src/datamodels.py
Normal file
@@ -0,0 +1,273 @@
|
||||
from enum import Enum
|
||||
from data import Registry, RowModel, Table, RegisterEnum
|
||||
from data.columns import Integer, String, Timestamp, Column
|
||||
|
||||
|
||||
class EventType(Enum):
|
||||
SUBSCRIBER = 'subscriber',
|
||||
RAID = 'raid',
|
||||
CHEER = 'cheer',
|
||||
PLAIN = 'plain',
|
||||
|
||||
|
||||
class DataModel(Registry):
|
||||
_EventType = RegisterEnum(EventType, 'EventType')
|
||||
|
||||
class UserPreferences(RowModel):
|
||||
"""
|
||||
Schema
|
||||
------
|
||||
CREATE TABLE user_preferences (
|
||||
profileid INTEGER PRIMARY KEY REFERENCES user_profiles (profileid) ON DELETE CASCADE,
|
||||
twitch_name TEXT,
|
||||
preferences TEXT
|
||||
);
|
||||
"""
|
||||
_tablename_ = 'user_preferences'
|
||||
_cache_ = {}
|
||||
|
||||
profileid = Integer(primary=True)
|
||||
twitch_name = String()
|
||||
preferences = String()
|
||||
|
||||
class Dreamer(RowModel):
|
||||
"""
|
||||
Schema
|
||||
------
|
||||
CREATE VIEW dreamers AS
|
||||
SELECT
|
||||
user_profiles.profileid AS user_id,
|
||||
user_preferences.twitch_name AS name,
|
||||
profiles_twitch.userid AS twitch_id,
|
||||
user_preferences.preferences AS preferences,
|
||||
user_profiles.created_at AS created_at
|
||||
FROM
|
||||
user_profiles
|
||||
LEFT JOIN profiles_twitch USING (profileid)
|
||||
LEFT JOIN user_preferences USING (profileid);
|
||||
"""
|
||||
_tablename_ = ''
|
||||
_readonly_ = True
|
||||
|
||||
profileid = Integer(primary=True)
|
||||
name = String()
|
||||
twitch_id = Integer()
|
||||
preferences = String()
|
||||
created_at = Timestamp()
|
||||
|
||||
class Transaction(RowModel):
|
||||
"""
|
||||
Schema
|
||||
------
|
||||
CREATE TABLE user_wallet (
|
||||
transaction_id INTEGER GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
|
||||
user_id INTEGER NOT NULL REFERENCES user_profiles (profileid) ON DELETE CASCADE,
|
||||
amount INTEGER NOT NULL,
|
||||
description TEXT NOT NULL,
|
||||
reference TEXT,
|
||||
created_at TIMESTAMPTZ NOT NULL DEFAULT NOW()
|
||||
);
|
||||
"""
|
||||
_tablename_ = 'user_wallet'
|
||||
_cache_ = {}
|
||||
_immutable_ = True
|
||||
|
||||
transaction_id = Integer(primary=True)
|
||||
user_id = Integer()
|
||||
amount = Integer()
|
||||
description = String()
|
||||
reference = String()
|
||||
created_at = Timestamp()
|
||||
|
||||
|
||||
class StampType(RowModel):
|
||||
"""
|
||||
Schema
|
||||
------
|
||||
CREATE TABLE stamp_types (
|
||||
stamp_type_id INTEGER GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
|
||||
stamp_type_name TEXT UNIQUE NOT NULL,
|
||||
created_at TIMESTAMPTZ NOT NULL DEFAULT NOW()
|
||||
);
|
||||
"""
|
||||
_tablename_ = 'stamp_types'
|
||||
_cache_ = {}
|
||||
|
||||
stamp_type_id = Integer(primary=True)
|
||||
stamp_type_name = String()
|
||||
created_at = Timestamp()
|
||||
|
||||
class Document(RowModel):
|
||||
"""
|
||||
Schema
|
||||
------
|
||||
CREATE TABLE documents (
|
||||
document_id INTEGER GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
|
||||
document_data VARCHAR NOT NULL,
|
||||
seal INTEGER NOT NULL,
|
||||
metadata TEXT
|
||||
);
|
||||
"""
|
||||
_tablename_ = 'documents'
|
||||
_cache_ = {}
|
||||
|
||||
document_id = Integer(primary=True)
|
||||
document_data = Column()
|
||||
seal = Integer()
|
||||
metadata = String()
|
||||
|
||||
class DocumentStamp(RowModel):
|
||||
"""
|
||||
Schema
|
||||
------
|
||||
CREATE TABLE document_stamps (
|
||||
stamp_id INTEGER GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
|
||||
document_id INTEGER NOT NULL REFERENCES documents (document_id) ON DELETE CASCADE,
|
||||
stamp_type INTEGER NOT NULL REFERENCES stamp_types (stamp_type_id) ON DELETE CASCADE,
|
||||
position_x INTEGER NOT NULL,
|
||||
position_y INTEGER NOT NULL,
|
||||
rotation REAL NOT NULL DEFAULT 0,
|
||||
created_at TIMESTAMPTZ NOT NULL DEFAULT NOW()
|
||||
);
|
||||
"""
|
||||
_tablename_ = 'document_stamps'
|
||||
_cache_ = {}
|
||||
|
||||
stamp_id = Integer(primary=True)
|
||||
document_id = Integer()
|
||||
stamp_type = Integer()
|
||||
position_x = Integer()
|
||||
position_y = Integer()
|
||||
rotation: Column[float] = Column()
|
||||
created_at = Timestamp()
|
||||
|
||||
class Events(RowModel):
|
||||
"""
|
||||
Schema
|
||||
------
|
||||
CREATE TABLE events (
|
||||
event_id INTEGER GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
|
||||
user_id INTEGER NOT NULL REFERENCES user_profiles (profileid) ON DELETE CASCADE,
|
||||
document_id INTEGER REFERENCES documents (document_id) ON DELETE SET NULL,
|
||||
user_name TEXT,
|
||||
event_type EventType NOT NULL,
|
||||
occurred_at TIMESTAMPTZ NOT NULL,
|
||||
created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
|
||||
UNIQUE (event_id, event_type)
|
||||
);
|
||||
"""
|
||||
_tablename_ = 'events'
|
||||
_cache_ = {}
|
||||
|
||||
event_id = Integer(primary=True)
|
||||
user_id = Integer()
|
||||
document_id = Integer()
|
||||
user_name = String()
|
||||
event_type: Column[EventType] = Column()
|
||||
occured_at = Timestamp()
|
||||
created_at = Timestamp()
|
||||
|
||||
plain_events = Table('plain_events')
|
||||
raid_events = Table('raid_events')
|
||||
cheer_events = Table('cheer_events')
|
||||
subscriber_events = Table('subscriber_events')
|
||||
|
||||
class EventDetails(RowModel):
|
||||
"""
|
||||
Schema
|
||||
------
|
||||
CREATE TABLE plain_events (
|
||||
event_id integer PRIMARY KEY,
|
||||
event_type EventType NOT NULL DEFAULT 'plain' CHECK (event_type = 'plain'),
|
||||
message TEXT NOT NULL,
|
||||
FOREIGN KEY (event_id, event_type) REFERENCES events (event_id, event_type)
|
||||
);
|
||||
|
||||
CREATE TABLE raid_events (
|
||||
event_id integer PRIMARY KEY,
|
||||
event_type EventType NOT NULL DEFAULT 'raid' CHECK (event_type = 'raid'),
|
||||
visitor_count INTEGER NOT NULL,
|
||||
FOREIGN KEY (event_id, event_type) REFERENCES events (event_id, event_type)
|
||||
);
|
||||
|
||||
CREATE TABLE cheer_events (
|
||||
event_id integer PRIMARY KEY,
|
||||
event_type EventType NOT NULL DEFAULT 'cheer' CHECK (event_type = 'cheer'),
|
||||
amount INTEGER NOT NULL,
|
||||
cheer_type TEXT,
|
||||
message TEXT,
|
||||
FOREIGN KEY (event_id, event_type) REFERENCES events (event_id, event_type)
|
||||
);
|
||||
|
||||
CREATE TABLE subscriber_events (
|
||||
event_id integer PRIMARY KEY,
|
||||
event_type EventType NOT NULL DEFAULT 'subscriber' CHECK (event_type = 'subscriber'),
|
||||
subscribed_length INTEGER NOT NULL,
|
||||
tier INTEGER NOT NULL,
|
||||
message TEXT,
|
||||
FOREIGN KEY (event_id, event_type) REFERENCES events (event_id, event_type)
|
||||
);
|
||||
|
||||
CREATE VIEW event_details AS
|
||||
SELECT
|
||||
events.event_id AS event_id,
|
||||
events.user_id AS user_id,
|
||||
events.document_id AS document_id,
|
||||
events.user_name AS user_name,
|
||||
events.event_type AS event_type,
|
||||
events.occurred_at AS occurred_at,
|
||||
events.created_at AS created_at,
|
||||
plain_events.message AS plain_message,
|
||||
raid_events.visitor_count AS raid_visitor_count,
|
||||
cheer_events.amount AS cheer_amount,
|
||||
cheer_events.cheer_type AS cheer_type,
|
||||
cheer_events.message AS cheer_message,
|
||||
subscriber_events.subscribed_length AS subscriber_length,
|
||||
subscriber_events.tier AS subscriber_tier,
|
||||
subscriber_events.message AS subscriber_message,
|
||||
FROM
|
||||
events
|
||||
LEFT JOIN plain_events USING (event_id)
|
||||
LEFT JOIN raid_events USING (event_id)
|
||||
LEFT JOIN cheer_events USING (event_id)
|
||||
LEFT JOIN subscriber_events USING (event_id)
|
||||
ORDER BY events.occurred_at ASC;
|
||||
"""
|
||||
_tablename_ = 'event_details'
|
||||
_readonly_ = True
|
||||
|
||||
event_id = Integer(primary=True)
|
||||
user_id = Integer()
|
||||
document_id = Integer()
|
||||
user_name = String()
|
||||
event_type: Column[EventType] = Column()
|
||||
occurred_at = Timestamp()
|
||||
created_at = Timestamp()
|
||||
plain_message = String()
|
||||
raid_visitor_count = Integer()
|
||||
cheer_amount = Integer()
|
||||
cheer_type = String()
|
||||
cheer_message = String()
|
||||
subscriber_length = Integer()
|
||||
subscriber_tier = Integer()
|
||||
subscriber_message = String()
|
||||
|
||||
|
||||
class Specimen(RowModel):
|
||||
"""
|
||||
Schema
|
||||
------
|
||||
CREATE TABLE user_specimens (
|
||||
specimen_id INTEGER GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
|
||||
owner_id INTEGER NOT NULL REFERENCES user_profiles (profileid) ON DELETE CASCADE,
|
||||
born_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
|
||||
forgotten_at TIMESTAMPTZ
|
||||
);
|
||||
"""
|
||||
_tablename_ = 'user_specimens'
|
||||
_cache_ = {}
|
||||
|
||||
specimen_id = Integer(primary=True)
|
||||
owner_id = Integer(primary=True)
|
||||
born_at = Timestamp()
|
||||
forgotten_at = Timestamp()
|
||||
Reference in New Issue
Block a user