diff --git a/src/github.com/matrix-org/dendrite/clientapi/storage/access_tokens_table.go b/src/github.com/matrix-org/dendrite/clientapi/storage/access_tokens_table.go new file mode 100644 index 000000000..fe804443e --- /dev/null +++ b/src/github.com/matrix-org/dendrite/clientapi/storage/access_tokens_table.go @@ -0,0 +1,30 @@ +package storage + +import ( + "database/sql" +) + +const accessTokensSchema = ` +CREATE TABLE IF NOT EXISTS access_tokens ( + id BIGINT PRIMARY KEY, + user_id TEXT NOT NULL, + device_id TEXT, + token TEXT NOT NULL, + -- Timestamp (ms) when this access token was last used. + last_used BIGINT, + UNIQUE(token) +); + +CREATE INDEX access_tokens_device_id ON access_tokens (user_id, device_id) ; +` + +type accessTokenStatements struct { +} + +func (s *accessTokenStatements) prepare(db *sql.DB) (err error) { + _, err = db.Exec(accessTokensSchema) + if err != nil { + return + } + return +} diff --git a/src/github.com/matrix-org/dendrite/clientapi/storage/sql.go b/src/github.com/matrix-org/dendrite/clientapi/storage/sql.go new file mode 100644 index 000000000..91092e42c --- /dev/null +++ b/src/github.com/matrix-org/dendrite/clientapi/storage/sql.go @@ -0,0 +1,37 @@ +package storage + +import ( + "database/sql" +) + +type statements struct { + userIPStatements + accessTokenStatements + usersStatements +} + +func (s *statements) prepare(db *sql.DB) error { + var err error + + if err = s.prepareUserStatements(db); err != nil { + return err + } + + return nil +} + +func (s *statements) prepareUserStatements(db *sql.DB) error { + var err error + + if err = s.accessTokenStatements.prepare(db); err != nil { + return err + } + if err = s.userIPStatements.prepare(db); err != nil { + return err + } + if err = s.usersStatements.prepare(db); err != nil { + return err + } + + return nil +} diff --git a/src/github.com/matrix-org/dendrite/clientapi/storage/users_ips_table.go b/src/github.com/matrix-org/dendrite/clientapi/storage/users_ips_table.go new file mode 100644 index 000000000..26f2f5b80 --- /dev/null +++ b/src/github.com/matrix-org/dendrite/clientapi/storage/users_ips_table.go @@ -0,0 +1,30 @@ +package storage + +import ( + "database/sql" +) + +const userIPsSchema = ` +CREATE TABLE IF NOT EXISTS user_ips ( + user_id TEXT NOT NULL, + access_token TEXT NOT NULL, + device_id TEXT, + ip TEXT NOT NULL, + user_agent TEXT NOT NULL, + last_seen BIGINT NOT NULL +); + +CREATE INDEX user_ips_user_ip ON user_ips(user_id, access_token, ip); +CREATE INDEX user_ips_device_id ON user_ips (user_id, device_id, last_seen); +` + +type userIPStatements struct { +} + +func (s *userIPStatements) prepare(db *sql.DB) (err error) { + _, err = db.Exec(userIPsSchema) + if err != nil { + return + } + return +} diff --git a/src/github.com/matrix-org/dendrite/clientapi/storage/users_table.go b/src/github.com/matrix-org/dendrite/clientapi/storage/users_table.go new file mode 100644 index 000000000..f7c9c6b05 --- /dev/null +++ b/src/github.com/matrix-org/dendrite/clientapi/storage/users_table.go @@ -0,0 +1,34 @@ +package storage + +import ( + "database/sql" +) + +const usersSchema = ` +CREATE TABLE IF NOT EXISTS users ( + user_id TEXT NOT NULL, + -- bcrypt hash of the users password. Can be null for passwordless users like + -- application service users. + password_hash TEXT, + -- Timestamp (ms) when this user was registered on the server. + created_at BIGINT, + -- The ID of the application service which created this user, if applicable. + appservice_id TEXT, + -- Flag which if set indicates this user is a server administrator. + is_admin SMALLINT DEFAULT 0 NOT NULL, + -- Flag which if set indicates this user is a guest. + is_guest SMALLINT DEFAULT 0 NOT NULL, + UNIQUE(user_id) +); +` + +type usersStatements struct { +} + +func (s *usersStatements) prepare(db *sql.DB) (err error) { + _, err = db.Exec(usersSchema) + if err != nil { + return + } + return +}