Models and schemas for users and auth tokens
This commit is contained in:
@@ -0,0 +1 @@
|
|||||||
|
{"name":"sbt","version":"1.12.13","bspVersion":"2.1.0-M1","languages":["scala"],"argv":["/usr/lib/jvm/java-21-openjdk-amd64/bin/java","-Xms100m","-Xmx100m","-classpath","/home/artemiy/.local/share/JetBrains/IntelliJIdea2026.1/Scala/launcher/sbt-launch.jar","-Dsbt.script=/home/artemiy/.local/bin/sbt","xsbt.boot.Boot","-bsp"]}
|
||||||
@@ -5,3 +5,6 @@
|
|||||||
# virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml
|
# virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml
|
||||||
hs_err_pid*
|
hs_err_pid*
|
||||||
|
|
||||||
|
/project/project/target/
|
||||||
|
/project/target
|
||||||
|
/target
|
||||||
@@ -0,0 +1,7 @@
|
|||||||
|
package models
|
||||||
|
|
||||||
|
import java.time.Instant
|
||||||
|
|
||||||
|
case class User(id: Option[Int], username: String, gid: String, passwordDigest: Option[String])
|
||||||
|
|
||||||
|
case class AuthToken(id: Option[Int], userId: Int, token: String, createdAt: Instant, expiresAt: Instant)
|
||||||
@@ -0,0 +1,34 @@
|
|||||||
|
package schemas
|
||||||
|
|
||||||
|
import slick.jdbc.PostgresProfile.api._
|
||||||
|
import models._
|
||||||
|
import slick.lifted.ProvenShape
|
||||||
|
import slick.model.ForeignKeyAction.Cascade
|
||||||
|
|
||||||
|
import java.time.Instant
|
||||||
|
|
||||||
|
class UsersTable(tag: Tag) extends Table[User](tag, "users") {
|
||||||
|
def id = column[Int]("id", O.PrimaryKey, O.AutoInc)
|
||||||
|
def gid = column[String]("gid", O.Unique)
|
||||||
|
def username = column[String]("username", O.Unique)
|
||||||
|
def passwordDigest = column[Option[String]]("password_digest")
|
||||||
|
|
||||||
|
override def * : ProvenShape[User] = (id.?, username, gid, passwordDigest).mapTo[User]
|
||||||
|
}
|
||||||
|
|
||||||
|
lazy val Users = TableQuery[UsersTable]
|
||||||
|
|
||||||
|
class AuthTokensTable(tag: Tag) extends Table[AuthToken](tag, "auth_tokens") {
|
||||||
|
|
||||||
|
def id = column[Int]("id", O.PrimaryKey, O.AutoInc)
|
||||||
|
def userId = column[Int]("user_id")
|
||||||
|
def token = column[String]("token")
|
||||||
|
def createdAt = column[Instant]("created_at")
|
||||||
|
def expiresAt = column[Instant]("expires_at")
|
||||||
|
|
||||||
|
override def * : ProvenShape[AuthToken] = (id.?, userId, token, createdAt, expiresAt).mapTo[AuthToken]
|
||||||
|
|
||||||
|
def user = foreignKey("users", userId, Users)(_.id, onDelete = Cascade)
|
||||||
|
}
|
||||||
|
|
||||||
|
lazy val AuthTokens = TableQuery[AuthTokensTable]
|
||||||
@@ -5,11 +5,19 @@ version := "1.0-SNAPSHOT"
|
|||||||
|
|
||||||
lazy val root = (project in file(".")).enablePlugins(PlayScala)
|
lazy val root = (project in file(".")).enablePlugins(PlayScala)
|
||||||
|
|
||||||
scalaVersion := "2.13.18"
|
scalaVersion := "3.8.4"
|
||||||
|
|
||||||
libraryDependencies += guice
|
libraryDependencies += guice
|
||||||
libraryDependencies += "org.scalatestplus.play" %% "scalatestplus-play" % "7.0.2" % Test
|
libraryDependencies += "org.scalatestplus.play" %% "scalatestplus-play" % "7.0.2" % Test
|
||||||
|
|
||||||
|
// Source: https://mvnrepository.com/artifact/org.postgresql/postgresql
|
||||||
|
libraryDependencies += "org.postgresql" % "postgresql" % "42.7.13"
|
||||||
|
|
||||||
|
// Source: https://mvnrepository.com/artifact/org.playframework/play-slick
|
||||||
|
libraryDependencies += "org.playframework" %% "play-slick" % "6.2.0"
|
||||||
|
// Source: https://mvnrepository.com/artifact/org.playframework/play-slick-evolutions
|
||||||
|
libraryDependencies += "org.playframework" %% "play-slick-evolutions" % "6.2.0"
|
||||||
|
|
||||||
// Adds additional packages into Twirl
|
// Adds additional packages into Twirl
|
||||||
//TwirlKeys.templateImports += "me.artemis.controllers._"
|
//TwirlKeys.templateImports += "me.artemis.controllers._"
|
||||||
|
|
||||||
|
|||||||
@@ -0,0 +1,8 @@
|
|||||||
|
name: 'neon-vertigo-api'
|
||||||
|
services:
|
||||||
|
db:
|
||||||
|
image: "postgres:18"
|
||||||
|
env_file:
|
||||||
|
- db.env
|
||||||
|
ports:
|
||||||
|
- "5432:5432"
|
||||||
@@ -1 +1,15 @@
|
|||||||
# https://www.playframework.com/documentation/latest/Configuration
|
# https://www.playframework.com/documentation/latest/Configuration
|
||||||
|
|
||||||
|
slick.dbs.default = {
|
||||||
|
profile = "slick.jdbc.PostgresProfile$"
|
||||||
|
db = {
|
||||||
|
dataSourceClass = "org.postgresql.ds.PGSimpleDataSource"
|
||||||
|
properties = {
|
||||||
|
serverName = "localhost"
|
||||||
|
portNumber = "5432"
|
||||||
|
databaseName = ${POSTGRES_DB}
|
||||||
|
user = ${POSTGRES_USER}
|
||||||
|
password = ${POSTGRES_PASSWORD}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,26 @@
|
|||||||
|
-- Users and tokens
|
||||||
|
|
||||||
|
-- !Ups
|
||||||
|
|
||||||
|
CREATE TABLE users (
|
||||||
|
id BIGINT PRIMARY KEY GENERATED BY DEFAULT AS IDENTITY,
|
||||||
|
username VARCHAR UNIQUE NOT NULL,
|
||||||
|
gid VARCHAR UNIQUE NOT NULL,
|
||||||
|
password_digest VARCHAR
|
||||||
|
);
|
||||||
|
|
||||||
|
CREATE TABLE auth_tokens (
|
||||||
|
id BIGINT PRIMARY KEY GENERATED BY DEFAULT AS IDENTITY,
|
||||||
|
user_id BIGINT NOT NULL REFERENCES users(id) ON DELETE CASCADE,
|
||||||
|
token VARCHAR NOT NULL,
|
||||||
|
created_at TIMESTAMP NOT NULL,
|
||||||
|
expires_at TIMESTAMP NOT NULL
|
||||||
|
);
|
||||||
|
|
||||||
|
CREATE INDEX idx_auth_tokens_user_id_expires_at ON auth_tokens (user_id, expires_at);
|
||||||
|
|
||||||
|
-- !Downs
|
||||||
|
|
||||||
|
DROP INDEX idx_auth_tokens_user_id_expires_at;
|
||||||
|
DROP TABLE auth_tokens;
|
||||||
|
DROP TABLE users;
|
||||||
Reference in New Issue
Block a user