initial commit

This commit is contained in:
garionion 2025-02-26 00:09:11 +01:00
parent 9efc8a209b
commit aabf45915a
48 changed files with 7400 additions and 0 deletions

9
database/sqlc.yaml Normal file
View file

@ -0,0 +1,9 @@
version: "2"
sql:
- engine: "sqlite"
queries: "./sqlite/query.sql"
schema: "./sqlite/schema.sql"
gen:
go:
package: "sqlite"
out: "./sqlite/generated"

View file

@ -0,0 +1,31 @@
// Code generated by sqlc. DO NOT EDIT.
// versions:
// sqlc v1.28.0
package sqlite
import (
"context"
"database/sql"
)
type DBTX interface {
ExecContext(context.Context, string, ...interface{}) (sql.Result, error)
PrepareContext(context.Context, string) (*sql.Stmt, error)
QueryContext(context.Context, string, ...interface{}) (*sql.Rows, error)
QueryRowContext(context.Context, string, ...interface{}) *sql.Row
}
func New(db DBTX) *Queries {
return &Queries{db: db}
}
type Queries struct {
db DBTX
}
func (q *Queries) WithTx(tx *sql.Tx) *Queries {
return &Queries{
db: tx,
}
}

View file

@ -0,0 +1,155 @@
// Code generated by sqlc. DO NOT EDIT.
// versions:
// sqlc v1.28.0
package sqlite
import (
"database/sql"
)
type Annotation struct {
ID int64
UserID int64
ObjectID sql.NullInt64
EventID sql.NullInt64
CheckInID sql.NullInt64
EventsObjectID sql.NullInt64
Text string
Datetime string
}
type CheckIn struct {
ID int64
UserID int64
CheckinEventID int64
EventID sql.NullInt64
ObjectID sql.NullInt64
CheckinStateID int64
Datetime string
}
type CheckInLog struct {
CheckInID int64
Username string
EventName string
ObjectName string
Datetime string
CheckinState string
}
type CheckinEvent struct {
ID int64
Name string
}
type CheckinState struct {
ID int64
Name string
}
type Event struct {
ID int64
UserID int64
Name string
Description sql.NullString
Location sql.NullString
StartDate string
EndDate string
}
type EventDetail struct {
EventID int64
EventName string
Description sql.NullString
Location sql.NullString
StartDate string
EndDate string
Organizer string
}
type EventsObject struct {
ID int64
EventID int64
ObjectID int64
}
type Object struct {
ID int64
StoragespaceID int64
Name string
Description sql.NullString
Serialnumber sql.NullString
Created sql.NullTime
}
type ObjectClass struct {
ID int64
ObjectClassParentID sql.NullInt64
Name string
}
type ObjectClassField struct {
ID int64
ObjectClassID int64
Name string
Type string
}
type ObjectFieldsContent struct {
ID int64
ObjectClassFieldID int64
Content string
}
type ObjectStorage struct {
ObjectID int64
ObjectName string
StorageLocation sql.NullString
}
type Picture struct {
ID int64
UserID int64
StoragespaceID sql.NullInt64
ObjectID sql.NullInt64
EventID sql.NullInt64
CheckInID sql.NullInt64
Path string
Description sql.NullString
Datetime string
}
type Storagespace struct {
ID int64
Parent sql.NullInt64
Location sql.NullString
}
type User struct {
ID int64
Username string
}
type UserSession struct {
ID int64
UserID int64
SessionToken string
CreatedAt string
ValidUntil string
Name sql.NullString
}
type UserSessionsView struct {
UserID int64
Username string
SessionToken string
CreatedAt string
ValidUntil string
}
type UserloginProvider struct {
ID int64
UserID int64
LoginStub string
}

View file

@ -0,0 +1,452 @@
// Code generated by sqlc. DO NOT EDIT.
// versions:
// sqlc v1.28.0
// source: query.sql
package sqlite
import (
"context"
"database/sql"
)
const addAnnotation = `-- name: AddAnnotation :exec
INSERT INTO annotations (user_ID, object_ID, event_ID, check_in_ID, events_object_ID, text, datetime)
VALUES (?, ?, ?, ?, ?, ?, ?)
`
type AddAnnotationParams struct {
UserID int64
ObjectID sql.NullInt64
EventID sql.NullInt64
CheckInID sql.NullInt64
EventsObjectID sql.NullInt64
Text string
Datetime string
}
func (q *Queries) AddAnnotation(ctx context.Context, arg AddAnnotationParams) error {
_, err := q.db.ExecContext(ctx, addAnnotation,
arg.UserID,
arg.ObjectID,
arg.EventID,
arg.CheckInID,
arg.EventsObjectID,
arg.Text,
arg.Datetime,
)
return err
}
const addCheckIn = `-- name: AddCheckIn :exec
INSERT INTO check_in (user_ID, checkin_event_ID, event_ID, object_ID, checkin_state_ID, datetime)
VALUES (?, ?, ?, ?, ?, ?)
`
type AddCheckInParams struct {
UserID int64
CheckinEventID int64
EventID sql.NullInt64
ObjectID sql.NullInt64
CheckinStateID int64
Datetime string
}
func (q *Queries) AddCheckIn(ctx context.Context, arg AddCheckInParams) error {
_, err := q.db.ExecContext(ctx, addCheckIn,
arg.UserID,
arg.CheckinEventID,
arg.EventID,
arg.ObjectID,
arg.CheckinStateID,
arg.Datetime,
)
return err
}
const addObject = `-- name: AddObject :exec
INSERT INTO objects (storagespace_ID, Name, Description, Serialnumber, created)
VALUES (?, ?, ?, ?, CURRENT_TIMESTAMP)
`
type AddObjectParams struct {
StoragespaceID int64
Name string
Description sql.NullString
Serialnumber sql.NullString
}
func (q *Queries) AddObject(ctx context.Context, arg AddObjectParams) error {
_, err := q.db.ExecContext(ctx, addObject,
arg.StoragespaceID,
arg.Name,
arg.Description,
arg.Serialnumber,
)
return err
}
const addPicture = `-- name: AddPicture :exec
INSERT INTO pictures (user_ID, storagespace_ID, object_ID, event_ID, check_in_ID, Path, Description, datetime)
VALUES (?, ?, ?, ?, ?, ?, ?, ?)
`
type AddPictureParams struct {
UserID int64
StoragespaceID sql.NullInt64
ObjectID sql.NullInt64
EventID sql.NullInt64
CheckInID sql.NullInt64
Path string
Description sql.NullString
Datetime string
}
func (q *Queries) AddPicture(ctx context.Context, arg AddPictureParams) error {
_, err := q.db.ExecContext(ctx, addPicture,
arg.UserID,
arg.StoragespaceID,
arg.ObjectID,
arg.EventID,
arg.CheckInID,
arg.Path,
arg.Description,
arg.Datetime,
)
return err
}
const addUser = `-- name: AddUser :exec
INSERT INTO users (Username) VALUES (?)
`
func (q *Queries) AddUser(ctx context.Context, username string) error {
_, err := q.db.ExecContext(ctx, addUser, username)
return err
}
const addUserSession = `-- name: AddUserSession :exec
INSERT INTO user_sessions (user_ID, session_token, created_at, valid_until, name)
VALUES (?, ?, ?, ?, ?)
`
type AddUserSessionParams struct {
UserID int64
SessionToken string
CreatedAt string
ValidUntil string
Name sql.NullString
}
func (q *Queries) AddUserSession(ctx context.Context, arg AddUserSessionParams) error {
_, err := q.db.ExecContext(ctx, addUserSession,
arg.UserID,
arg.SessionToken,
arg.CreatedAt,
arg.ValidUntil,
arg.Name,
)
return err
}
const createEvent = `-- name: CreateEvent :exec
INSERT INTO events (user_ID, Name, Description, Location, Start_Date, End_Date)
VALUES (?, ?, ?, ?, ?, ?)
`
type CreateEventParams struct {
UserID int64
Name string
Description sql.NullString
Location sql.NullString
StartDate string
EndDate string
}
func (q *Queries) CreateEvent(ctx context.Context, arg CreateEventParams) error {
_, err := q.db.ExecContext(ctx, createEvent,
arg.UserID,
arg.Name,
arg.Description,
arg.Location,
arg.StartDate,
arg.EndDate,
)
return err
}
const getAllUsers = `-- name: GetAllUsers :many
SELECT id, username FROM users
`
func (q *Queries) GetAllUsers(ctx context.Context) ([]User, error) {
rows, err := q.db.QueryContext(ctx, getAllUsers)
if err != nil {
return nil, err
}
defer rows.Close()
var items []User
for rows.Next() {
var i User
if err := rows.Scan(&i.ID, &i.Username); err != nil {
return nil, err
}
items = append(items, i)
}
if err := rows.Close(); err != nil {
return nil, err
}
if err := rows.Err(); err != nil {
return nil, err
}
return items, nil
}
const getEventCheckIns = `-- name: GetEventCheckIns :many
SELECT check_in_id, username, event_name, object_name, datetime, checkin_state FROM check_in_log WHERE event_name = ?
`
func (q *Queries) GetEventCheckIns(ctx context.Context, eventName string) ([]CheckInLog, error) {
rows, err := q.db.QueryContext(ctx, getEventCheckIns, eventName)
if err != nil {
return nil, err
}
defer rows.Close()
var items []CheckInLog
for rows.Next() {
var i CheckInLog
if err := rows.Scan(
&i.CheckInID,
&i.Username,
&i.EventName,
&i.ObjectName,
&i.Datetime,
&i.CheckinState,
); err != nil {
return nil, err
}
items = append(items, i)
}
if err := rows.Close(); err != nil {
return nil, err
}
if err := rows.Err(); err != nil {
return nil, err
}
return items, nil
}
const getEventObjects = `-- name: GetEventObjects :many
SELECT objects.id, objects.storagespace_id, objects.name, objects.description, objects.serialnumber, objects.created FROM objects
JOIN events_objects ON objects.ID = events_objects.object_ID
WHERE events_objects.event_ID = ?
`
func (q *Queries) GetEventObjects(ctx context.Context, eventID int64) ([]Object, error) {
rows, err := q.db.QueryContext(ctx, getEventObjects, eventID)
if err != nil {
return nil, err
}
defer rows.Close()
var items []Object
for rows.Next() {
var i Object
if err := rows.Scan(
&i.ID,
&i.StoragespaceID,
&i.Name,
&i.Description,
&i.Serialnumber,
&i.Created,
); err != nil {
return nil, err
}
items = append(items, i)
}
if err := rows.Close(); err != nil {
return nil, err
}
if err := rows.Err(); err != nil {
return nil, err
}
return items, nil
}
const getEventPictures = `-- name: GetEventPictures :many
SELECT id, user_id, storagespace_id, object_id, event_id, check_in_id, path, description, datetime FROM pictures WHERE event_ID = ?
`
func (q *Queries) GetEventPictures(ctx context.Context, eventID sql.NullInt64) ([]Picture, error) {
rows, err := q.db.QueryContext(ctx, getEventPictures, eventID)
if err != nil {
return nil, err
}
defer rows.Close()
var items []Picture
for rows.Next() {
var i Picture
if err := rows.Scan(
&i.ID,
&i.UserID,
&i.StoragespaceID,
&i.ObjectID,
&i.EventID,
&i.CheckInID,
&i.Path,
&i.Description,
&i.Datetime,
); err != nil {
return nil, err
}
items = append(items, i)
}
if err := rows.Close(); err != nil {
return nil, err
}
if err := rows.Err(); err != nil {
return nil, err
}
return items, nil
}
const getObjectAnnotations = `-- name: GetObjectAnnotations :many
SELECT id, user_id, object_id, event_id, check_in_id, events_object_id, text, datetime FROM annotations WHERE object_ID = ?
`
func (q *Queries) GetObjectAnnotations(ctx context.Context, objectID sql.NullInt64) ([]Annotation, error) {
rows, err := q.db.QueryContext(ctx, getObjectAnnotations, objectID)
if err != nil {
return nil, err
}
defer rows.Close()
var items []Annotation
for rows.Next() {
var i Annotation
if err := rows.Scan(
&i.ID,
&i.UserID,
&i.ObjectID,
&i.EventID,
&i.CheckInID,
&i.EventsObjectID,
&i.Text,
&i.Datetime,
); err != nil {
return nil, err
}
items = append(items, i)
}
if err := rows.Close(); err != nil {
return nil, err
}
if err := rows.Err(); err != nil {
return nil, err
}
return items, nil
}
const getObjectsInStorage = `-- name: GetObjectsInStorage :many
SELECT object_id, object_name, storage_location FROM object_storage WHERE storage_location = ?
`
func (q *Queries) GetObjectsInStorage(ctx context.Context, storageLocation sql.NullString) ([]ObjectStorage, error) {
rows, err := q.db.QueryContext(ctx, getObjectsInStorage, storageLocation)
if err != nil {
return nil, err
}
defer rows.Close()
var items []ObjectStorage
for rows.Next() {
var i ObjectStorage
if err := rows.Scan(&i.ObjectID, &i.ObjectName, &i.StorageLocation); err != nil {
return nil, err
}
items = append(items, i)
}
if err := rows.Close(); err != nil {
return nil, err
}
if err := rows.Err(); err != nil {
return nil, err
}
return items, nil
}
const getUserByID = `-- name: GetUserByID :one
SELECT id, username FROM users WHERE ID = ?
`
func (q *Queries) GetUserByID(ctx context.Context, id int64) (User, error) {
row := q.db.QueryRowContext(ctx, getUserByID, id)
var i User
err := row.Scan(&i.ID, &i.Username)
return i, err
}
const getUserEvents = `-- name: GetUserEvents :many
SELECT event_id, event_name, description, location, start_date, end_date, organizer FROM event_details WHERE organizer = ?
`
func (q *Queries) GetUserEvents(ctx context.Context, organizer string) ([]EventDetail, error) {
rows, err := q.db.QueryContext(ctx, getUserEvents, organizer)
if err != nil {
return nil, err
}
defer rows.Close()
var items []EventDetail
for rows.Next() {
var i EventDetail
if err := rows.Scan(
&i.EventID,
&i.EventName,
&i.Description,
&i.Location,
&i.StartDate,
&i.EndDate,
&i.Organizer,
); err != nil {
return nil, err
}
items = append(items, i)
}
if err := rows.Close(); err != nil {
return nil, err
}
if err := rows.Err(); err != nil {
return nil, err
}
return items, nil
}
const getUserSessions = `-- name: GetUserSessions :many
SELECT user_id, username, session_token, created_at, valid_until FROM user_sessions_view WHERE user_ID = ?
`
func (q *Queries) GetUserSessions(ctx context.Context, userID int64) ([]UserSessionsView, error) {
rows, err := q.db.QueryContext(ctx, getUserSessions, userID)
if err != nil {
return nil, err
}
defer rows.Close()
var items []UserSessionsView
for rows.Next() {
var i UserSessionsView
if err := rows.Scan(
&i.UserID,
&i.Username,
&i.SessionToken,
&i.CreatedAt,
&i.ValidUntil,
); err != nil {
return nil, err
}
items = append(items, i)
}
if err := rows.Close(); err != nil {
return nil, err
}
if err := rows.Err(); err != nil {
return nil, err
}
return items, nil
}

View file

@ -0,0 +1,144 @@
-- +goose Up
-- SQL in section 'Up' is executed when this migration is applied.
CREATE TABLE users
(
ID INTEGER PRIMARY KEY AUTOINCREMENT,
Username TEXT UNIQUE NOT NULL
);
CREATE TABLE userlogin_provider
(
ID INTEGER PRIMARY KEY AUTOINCREMENT,
user_ID INTEGER NOT NULL,
login_stub TEXT UNIQUE NOT NULL,
FOREIGN KEY (user_ID) REFERENCES users (ID)
);
CREATE TABLE user_sessions
(
ID INTEGER PRIMARY KEY AUTOINCREMENT,
user_ID INTEGER NOT NULL,
session_token TEXT UNIQUE NOT NULL,
created_at TEXT NOT NULL,
valid_until TEXT NOT NULL,
name TEXT,
FOREIGN KEY (user_ID) REFERENCES users (ID)
);
CREATE TABLE storagespace
(
ID INTEGER PRIMARY KEY AUTOINCREMENT,
Parent INTEGER,
Location TEXT,
FOREIGN KEY (Parent) REFERENCES storagespace (ID)
);
CREATE TABLE objects
(
ID INTEGER PRIMARY KEY AUTOINCREMENT,
storagespace_ID INTEGER NOT NULL,
Name TEXT NOT NULL,
Description TEXT,
Serialnumber TEXT UNIQUE,
created DATETIME DEFAULT CURRENT_TIMESTAMP,
FOREIGN KEY (storagespace_ID) REFERENCES storagespace (ID)
);
CREATE TABLE events
(
ID INTEGER PRIMARY KEY AUTOINCREMENT,
user_ID INTEGER NOT NULL,
Name TEXT NOT NULL,
Description TEXT,
Location TEXT,
Start_Date TEXT NOT NULL,
End_Date TEXT NOT NULL,
FOREIGN KEY (user_ID) REFERENCES users (ID)
);
CREATE TABLE pictures
(
ID INTEGER PRIMARY KEY AUTOINCREMENT,
user_ID INTEGER NOT NULL,
storagespace_ID INTEGER,
object_ID INTEGER,
event_ID INTEGER,
check_in_ID INTEGER,
Path TEXT NOT NULL,
Description TEXT,
datetime TEXT NOT NULL,
FOREIGN KEY (user_ID) REFERENCES users (ID),
FOREIGN KEY (storagespace_ID) REFERENCES storagespace (ID),
FOREIGN KEY (object_ID) REFERENCES objects (ID),
FOREIGN KEY (event_ID) REFERENCES events (ID),
FOREIGN KEY (check_in_ID) REFERENCES check_in (ID)
);
CREATE TABLE events_objects
(
ID INTEGER PRIMARY KEY AUTOINCREMENT,
event_ID INTEGER NOT NULL,
object_ID INTEGER NOT NULL,
FOREIGN KEY (event_ID) REFERENCES events (ID),
FOREIGN KEY (object_ID) REFERENCES objects (ID)
);
CREATE TABLE checkin_events
(
ID INTEGER PRIMARY KEY AUTOINCREMENT,
Name TEXT NOT NULL
);
CREATE TABLE checkin_states
(
ID INTEGER PRIMARY KEY AUTOINCREMENT,
Name TEXT NOT NULL
);
CREATE TABLE check_in
(
ID INTEGER PRIMARY KEY AUTOINCREMENT,
user_ID INTEGER NOT NULL,
checkin_event_ID INTEGER NOT NULL,
event_ID INTEGER,
object_ID INTEGER,
checkin_state_ID INTEGER NOT NULL,
datetime TEXT NOT NULL,
FOREIGN KEY (user_ID) REFERENCES users (ID),
FOREIGN KEY (checkin_event_ID) REFERENCES checkin_events (ID),
FOREIGN KEY (event_ID) REFERENCES events (ID),
FOREIGN KEY (object_ID) REFERENCES objects (ID),
FOREIGN KEY (checkin_state_ID) REFERENCES checkin_states (ID)
);
CREATE TABLE annotations
(
ID INTEGER PRIMARY KEY AUTOINCREMENT,
user_ID INTEGER NOT NULL,
object_ID INTEGER,
event_ID INTEGER,
check_in_ID INTEGER,
events_object_ID INTEGER,
text TEXT NOT NULL,
datetime TEXT NOT NULL,
FOREIGN KEY (user_ID) REFERENCES users (ID),
FOREIGN KEY (object_ID) REFERENCES objects (ID),
FOREIGN KEY (event_ID) REFERENCES events (ID),
FOREIGN KEY (check_in_ID) REFERENCES check_in (ID),
FOREIGN KEY (events_object_ID) REFERENCES events_objects (ID)
);
-- +goose Down
-- SQL in section 'Down' is executed when this migration is rolled back.
DROP TABLE IF EXISTS annotations;
DROP TABLE IF EXISTS check_in;
DROP TABLE IF EXISTS checkin_states;
DROP TABLE IF EXISTS checkin_events;
DROP TABLE IF EXISTS events_objects;
DROP TABLE IF EXISTS pictures;
DROP TABLE IF EXISTS events;
DROP TABLE IF EXISTS objects;
DROP TABLE IF EXISTS storagespace;
DROP TABLE IF EXISTS user_sessions;
DROP TABLE IF EXISTS userlogin_provider;
DROP TABLE IF EXISTS users;

55
database/sqlite/query.sql Normal file
View file

@ -0,0 +1,55 @@
-- name: GetAllUsers :many
SELECT * FROM users;
-- name: GetUserByID :one
SELECT * FROM users WHERE ID = ?;
-- name: AddUser :exec
INSERT INTO users (Username) VALUES (?);
-- name: GetUserSessions :many
SELECT * FROM user_sessions_view WHERE user_ID = ?;
-- name: AddUserSession :exec
INSERT INTO user_sessions (user_ID, session_token, created_at, valid_until, name)
VALUES (?, ?, ?, ?, ?);
-- name: GetObjectsInStorage :many
SELECT * FROM object_storage WHERE storage_location = ?;
-- name: GetUserEvents :many
SELECT * FROM event_details WHERE organizer = ?;
-- name: GetEventObjects :many
SELECT objects.* FROM objects
JOIN events_objects ON objects.ID = events_objects.object_ID
WHERE events_objects.event_ID = ?;
-- name: AddObject :exec
INSERT INTO objects (storagespace_ID, Name, Description, Serialnumber, created)
VALUES (?, ?, ?, ?, CURRENT_TIMESTAMP);
-- name: CreateEvent :exec
INSERT INTO events (user_ID, Name, Description, Location, Start_Date, End_Date)
VALUES (?, ?, ?, ?, ?, ?);
-- name: GetEventCheckIns :many
SELECT * FROM check_in_log WHERE event_name = ?;
-- name: AddCheckIn :exec
INSERT INTO check_in (user_ID, checkin_event_ID, event_ID, object_ID, checkin_state_ID, datetime)
VALUES (?, ?, ?, ?, ?, ?);
-- name: GetObjectAnnotations :many
SELECT * FROM annotations WHERE object_ID = ?;
-- name: AddAnnotation :exec
INSERT INTO annotations (user_ID, object_ID, event_ID, check_in_ID, events_object_ID, text, datetime)
VALUES (?, ?, ?, ?, ?, ?, ?);
-- name: GetEventPictures :many
SELECT * FROM pictures WHERE event_ID = ?;
-- name: AddPicture :exec
INSERT INTO pictures (user_ID, storagespace_ID, object_ID, event_ID, check_in_ID, Path, Description, datetime)
VALUES (?, ?, ?, ?, ?, ?, ?, ?);

191
database/sqlite/schema.sql Normal file
View file

@ -0,0 +1,191 @@
CREATE TABLE users
(
ID INTEGER PRIMARY KEY AUTOINCREMENT,
Username TEXT UNIQUE NOT NULL
);
CREATE TABLE userlogin_provider
(
ID INTEGER PRIMARY KEY AUTOINCREMENT,
user_ID INTEGER NOT NULL,
login_stub TEXT UNIQUE NOT NULL,
FOREIGN KEY (user_ID) REFERENCES users (ID)
);
CREATE TABLE user_sessions
(
ID INTEGER PRIMARY KEY AUTOINCREMENT,
user_ID INTEGER NOT NULL,
session_token TEXT UNIQUE NOT NULL,
created_at TEXT NOT NULL,
valid_until TEXT NOT NULL,
name TEXT,
FOREIGN KEY (user_ID) REFERENCES users (ID)
);
CREATE TABLE storagespace
(
ID INTEGER PRIMARY KEY AUTOINCREMENT,
Parent INTEGER,
Location TEXT,
FOREIGN KEY (Parent) REFERENCES storagespace (ID)
);
CREATE TABLE objects
(
ID INTEGER PRIMARY KEY AUTOINCREMENT,
storagespace_ID INTEGER NOT NULL,
Name TEXT NOT NULL,
Description TEXT,
Serialnumber TEXT UNIQUE,
created DATETIME DEFAULT CURRENT_TIMESTAMP,
FOREIGN KEY (storagespace_ID) REFERENCES storagespace (ID)
);
CREATE TABLE events
(
ID INTEGER PRIMARY KEY AUTOINCREMENT,
user_ID INTEGER NOT NULL,
Name TEXT NOT NULL,
Description TEXT,
Location TEXT,
Start_Date TEXT NOT NULL,
End_Date TEXT NOT NULL,
FOREIGN KEY (user_ID) REFERENCES users (ID)
);
CREATE TABLE pictures
(
ID INTEGER PRIMARY KEY AUTOINCREMENT,
user_ID INTEGER NOT NULL,
storagespace_ID INTEGER,
object_ID INTEGER,
event_ID INTEGER,
check_in_ID INTEGER,
Path TEXT NOT NULL,
Description TEXT,
datetime TEXT NOT NULL,
FOREIGN KEY (user_ID) REFERENCES users (ID),
FOREIGN KEY (storagespace_ID) REFERENCES storagespace (ID),
FOREIGN KEY (object_ID) REFERENCES objects (ID),
FOREIGN KEY (event_ID) REFERENCES events (ID),
FOREIGN KEY (check_in_ID) REFERENCES check_in (ID)
);
CREATE TABLE events_objects
(
ID INTEGER PRIMARY KEY AUTOINCREMENT,
event_ID INTEGER NOT NULL,
object_ID INTEGER NOT NULL,
FOREIGN KEY (event_ID) REFERENCES events (ID),
FOREIGN KEY (object_ID) REFERENCES objects (ID)
);
CREATE TABLE checkin_events
(
ID INTEGER PRIMARY KEY AUTOINCREMENT,
Name TEXT NOT NULL
);
CREATE TABLE checkin_states
(
ID INTEGER PRIMARY KEY AUTOINCREMENT,
Name TEXT NOT NULL
);
CREATE TABLE check_in
(
ID INTEGER PRIMARY KEY AUTOINCREMENT,
user_ID INTEGER NOT NULL,
checkin_event_ID INTEGER NOT NULL,
event_ID INTEGER,
object_ID INTEGER,
checkin_state_ID INTEGER NOT NULL,
datetime TEXT NOT NULL,
FOREIGN KEY (user_ID) REFERENCES users (ID),
FOREIGN KEY (checkin_event_ID) REFERENCES checkin_events (ID),
FOREIGN KEY (event_ID) REFERENCES events (ID),
FOREIGN KEY (object_ID) REFERENCES objects (ID),
FOREIGN KEY (checkin_state_ID) REFERENCES checkin_states (ID)
);
CREATE TABLE annotations
(
ID INTEGER PRIMARY KEY AUTOINCREMENT,
user_ID INTEGER NOT NULL,
object_ID INTEGER,
event_ID INTEGER,
check_in_ID INTEGER,
events_object_ID INTEGER,
text TEXT NOT NULL,
datetime TEXT NOT NULL,
FOREIGN KEY (user_ID) REFERENCES users (ID),
FOREIGN KEY (object_ID) REFERENCES objects (ID),
FOREIGN KEY (event_ID) REFERENCES events (ID),
FOREIGN KEY (check_in_ID) REFERENCES check_in (ID),
FOREIGN KEY (events_object_ID) REFERENCES events_objects (ID)
);
CREATE TABLE object_class
(
ID INTEGER PRIMARY KEY AUTOINCREMENT,
object_class_parent_ID INTEGER,
Name TEXT NOT NULL,
FOREIGN KEY (object_class_parent_ID) REFERENCES object_class (ID)
);
CREATE TABLE object_class_fields
(
ID INTEGER PRIMARY KEY AUTOINCREMENT,
object_class_ID INTEGER NOT NULL,
Name TEXT NOT NULL,
Type TEXT NOT NULL,
FOREIGN KEY (object_class_ID) REFERENCES object_class (ID)
);
CREATE TABLE object_fields_content
(
ID INTEGER PRIMARY KEY AUTOINCREMENT,
object_class_field_ID INTEGER NOT NULL,
Content TEXT NOT NULL,
FOREIGN KEY (object_class_field_ID) REFERENCES object_class_fields (ID)
);
-- Views for useful relations
CREATE VIEW user_sessions_view AS
SELECT users.ID AS user_ID,
users.Username,
user_sessions.session_token,
user_sessions.created_at,
user_sessions.valid_until
FROM users
JOIN user_sessions ON users.ID = user_sessions.user_ID;
CREATE VIEW event_details AS
SELECT events.ID AS event_ID,
events.Name AS event_name,
events.Description,
events.Location,
events.Start_Date,
events.End_Date,
users.Username AS organizer
FROM events
JOIN users ON events.user_ID = users.ID;
CREATE VIEW object_storage AS
SELECT objects.ID AS object_ID, objects.Name AS object_name, storagespace.Location AS storage_location
FROM objects
JOIN storagespace ON objects.storagespace_ID = storagespace.ID;
CREATE VIEW check_in_log AS
SELECT check_in.ID AS check_in_ID,
users.Username,
events.Name AS event_name,
objects.Name AS object_name,
check_in.datetime,
checkin_states.Name AS checkin_state
FROM check_in
JOIN users ON check_in.user_ID = users.ID
JOIN events ON check_in.event_ID = events.ID
JOIN objects ON check_in.object_ID = objects.ID
JOIN checkin_states ON check_in.checkin_state_ID = checkin_states.ID;