feat(docker): dockerized project

This commit is contained in:
antifallobst 2023-08-20 14:30:11 +02:00
parent 9f74df134c
commit 3a9a9fb2ca
Signed by: antifallobst
GPG Key ID: 2B4F402172791BAF
25 changed files with 575 additions and 2 deletions

3
.dockerignore Normal file
View File

@ -0,0 +1,3 @@
docs
target
README.md

View File

@ -0,0 +1,14 @@
{
"db_name": "PostgreSQL",
"query": "UPDATE Accounts SET verified=true WHERE id = $1;",
"describe": {
"columns": [],
"parameters": {
"Left": [
"Int8"
]
},
"nullable": []
},
"hash": "0d2502c392758afae3b433e952779320ad9dd95c29c0683e77862545bef11faa"
}

View File

@ -0,0 +1,76 @@
{
"db_name": "PostgreSQL",
"query": "SELECT\n id,\n username,\n email,\n salt,\n password,\n joined,\n verified as \"verified!: bool\",\n follows,\n followers,\n permissions\n FROM Accounts WHERE username = $1;",
"describe": {
"columns": [
{
"ordinal": 0,
"name": "id",
"type_info": "Int8"
},
{
"ordinal": 1,
"name": "username",
"type_info": "Varchar"
},
{
"ordinal": 2,
"name": "email",
"type_info": "Text"
},
{
"ordinal": 3,
"name": "salt",
"type_info": "Varchar"
},
{
"ordinal": 4,
"name": "password",
"type_info": "Varchar"
},
{
"ordinal": 5,
"name": "joined",
"type_info": "Timestamp"
},
{
"ordinal": 6,
"name": "verified!: bool",
"type_info": "Bool"
},
{
"ordinal": 7,
"name": "follows",
"type_info": "Int8Array"
},
{
"ordinal": 8,
"name": "followers",
"type_info": "Int8Array"
},
{
"ordinal": 9,
"name": "permissions",
"type_info": "Int8"
}
],
"parameters": {
"Left": [
"Text"
]
},
"nullable": [
false,
false,
false,
false,
false,
false,
false,
true,
true,
false
]
},
"hash": "0e894c84befe397687d4820ea313aa937cf76286e98f7e66c342fb87a3896265"
}

View File

@ -0,0 +1,34 @@
{
"db_name": "PostgreSQL",
"query": "SELECT * FROM VerificationTokens WHERE token = $1;",
"describe": {
"columns": [
{
"ordinal": 0,
"name": "token",
"type_info": "Varchar"
},
{
"ordinal": 1,
"name": "account",
"type_info": "Int8"
},
{
"ordinal": 2,
"name": "expire",
"type_info": "Timestamp"
}
],
"parameters": {
"Left": [
"Text"
]
},
"nullable": [
false,
false,
false
]
},
"hash": "1a96696cf2ad271f7001e89ec733ba8437c308bf6125cad5f483efadd02722cb"
}

View File

@ -0,0 +1,16 @@
{
"db_name": "PostgreSQL",
"query": "\n INSERT INTO VerificationTokens (token, account, expire) VALUES ($1, $2, $3);\n ",
"describe": {
"columns": [],
"parameters": {
"Left": [
"Varchar",
"Int8",
"Timestamp"
]
},
"nullable": []
},
"hash": "371fb1eff8cebe11d8527bda9ac27b2063cee27f9bad1b06cceaa3b95e93664c"
}

View File

@ -0,0 +1,14 @@
{
"db_name": "PostgreSQL",
"query": "DELETE FROM AuthTokens WHERE token = $1;",
"describe": {
"columns": [],
"parameters": {
"Left": [
"Text"
]
},
"nullable": []
},
"hash": "3b0db22c46875b6cc12eb1710ef7446a300e19a13e75cea465ed5bafa5169416"
}

View File

@ -0,0 +1,12 @@
{
"db_name": "PostgreSQL",
"query": "\n CREATE TABLE IF NOT EXISTS Projects (\n id SERIAL8 NOT NULL,\n name VARCHAR(32) NOT NULL,\n desription TEXT,\n created TIMESTAMP NOT NULL,\n members BIGINT[][] NOT NULL,\n PRIMARY KEY(id)\n );\n ",
"describe": {
"columns": [],
"parameters": {
"Left": []
},
"nullable": []
},
"hash": "5a65288ceaee7044d547a04600d50408249ae7f03356121968abf1039407ec3e"
}

View File

@ -0,0 +1,12 @@
{
"db_name": "PostgreSQL",
"query": "\n CREATE TABLE IF NOT EXISTS Accounts (\n id SERIAL8 NOT NULL,\n\t username VARCHAR(32) NOT NULL,\n email TEXT NOT NULL,\n\t salt VARCHAR(22) NOT NULL,\n\t password VARCHAR(96) NOT NULL,\n joined TIMESTAMP NOT NULL,\n verified BOOLEAN NOT NULL,\n follows BIGINT[],\n followers BIGINT[],\n permissions BIGINT NOT NULL,\n\t PRIMARY KEY(id)\n );\n ",
"describe": {
"columns": [],
"parameters": {
"Left": []
},
"nullable": []
},
"hash": "699dbb92baf5954e5457dbd2dfded021c2436e57112259a8b0e208e4aa7628ae"
}

View File

@ -0,0 +1,14 @@
{
"db_name": "PostgreSQL",
"query": "DELETE FROM VerificationTokens WHERE token = $1;",
"describe": {
"columns": [],
"parameters": {
"Left": [
"Text"
]
},
"nullable": []
},
"hash": "6c470deaeaf19e799df3889436de40b0c863578fbafd7096613cde631f4ed7f4"
}

View File

@ -0,0 +1,76 @@
{
"db_name": "PostgreSQL",
"query": "SELECT\n id,\n username,\n email,\n salt,\n password,\n joined,\n verified as \"verified!: bool\",\n follows,\n followers,\n permissions\n FROM Accounts WHERE id = $1;",
"describe": {
"columns": [
{
"ordinal": 0,
"name": "id",
"type_info": "Int8"
},
{
"ordinal": 1,
"name": "username",
"type_info": "Varchar"
},
{
"ordinal": 2,
"name": "email",
"type_info": "Text"
},
{
"ordinal": 3,
"name": "salt",
"type_info": "Varchar"
},
{
"ordinal": 4,
"name": "password",
"type_info": "Varchar"
},
{
"ordinal": 5,
"name": "joined",
"type_info": "Timestamp"
},
{
"ordinal": 6,
"name": "verified!: bool",
"type_info": "Bool"
},
{
"ordinal": 7,
"name": "follows",
"type_info": "Int8Array"
},
{
"ordinal": 8,
"name": "followers",
"type_info": "Int8Array"
},
{
"ordinal": 9,
"name": "permissions",
"type_info": "Int8"
}
],
"parameters": {
"Left": [
"Int8"
]
},
"nullable": [
false,
false,
false,
false,
false,
false,
false,
true,
true,
false
]
},
"hash": "7009cdfba0b6c8d7c8ed9d49bf91905d159c3bbfe0c8e78876a8cd2b952e28b5"
}

View File

@ -0,0 +1,76 @@
{
"db_name": "PostgreSQL",
"query": "SELECT\n id,\n username,\n email,\n salt,\n password,\n joined,\n verified as \"verified!: bool\",\n follows,\n followers,\n permissions\n FROM Accounts WHERE email = $1;",
"describe": {
"columns": [
{
"ordinal": 0,
"name": "id",
"type_info": "Int8"
},
{
"ordinal": 1,
"name": "username",
"type_info": "Varchar"
},
{
"ordinal": 2,
"name": "email",
"type_info": "Text"
},
{
"ordinal": 3,
"name": "salt",
"type_info": "Varchar"
},
{
"ordinal": 4,
"name": "password",
"type_info": "Varchar"
},
{
"ordinal": 5,
"name": "joined",
"type_info": "Timestamp"
},
{
"ordinal": 6,
"name": "verified!: bool",
"type_info": "Bool"
},
{
"ordinal": 7,
"name": "follows",
"type_info": "Int8Array"
},
{
"ordinal": 8,
"name": "followers",
"type_info": "Int8Array"
},
{
"ordinal": 9,
"name": "permissions",
"type_info": "Int8"
}
],
"parameters": {
"Left": [
"Text"
]
},
"nullable": [
false,
false,
false,
false,
false,
false,
false,
true,
true,
false
]
},
"hash": "71b834dfe4384a536257b888e293b046a70aefd4ac2dcbf3268e34c9576e903e"
}

View File

@ -0,0 +1,18 @@
{
"db_name": "PostgreSQL",
"query": "INSERT INTO Accounts (username, email, salt, password, joined, verified, permissions) VALUES ($1, $2, $3, $4, $5, false, 0);",
"describe": {
"columns": [],
"parameters": {
"Left": [
"Varchar",
"Text",
"Varchar",
"Varchar",
"Timestamp"
]
},
"nullable": []
},
"hash": "8b37c356c1df9961b47359a56f69b658adafa9c58b79e6dd867f6e4f62fbd144"
}

View File

@ -0,0 +1,34 @@
{
"db_name": "PostgreSQL",
"query": "SELECT * FROM AuthTokens WHERE account = $1;",
"describe": {
"columns": [
{
"ordinal": 0,
"name": "token",
"type_info": "Varchar"
},
{
"ordinal": 1,
"name": "account",
"type_info": "Int8"
},
{
"ordinal": 2,
"name": "expire",
"type_info": "Timestamp"
}
],
"parameters": {
"Left": [
"Int8"
]
},
"nullable": [
false,
false,
false
]
},
"hash": "994b743e8d80be58b6b41f4fd0f7daae3b3c34aa59093878a7d20a2598269a34"
}

View File

@ -0,0 +1,14 @@
{
"db_name": "PostgreSQL",
"query": "DELETE FROM Accounts WHERE id = $1;",
"describe": {
"columns": [],
"parameters": {
"Left": [
"Int8"
]
},
"nullable": []
},
"hash": "af7d6e7978039e8493371a2f520d0e3b4494401e59650c06b6332557d51e5452"
}

View File

@ -0,0 +1,34 @@
{
"db_name": "PostgreSQL",
"query": "SELECT * FROM AuthTokens WHERE token = $1;",
"describe": {
"columns": [
{
"ordinal": 0,
"name": "token",
"type_info": "Varchar"
},
{
"ordinal": 1,
"name": "account",
"type_info": "Int8"
},
{
"ordinal": 2,
"name": "expire",
"type_info": "Timestamp"
}
],
"parameters": {
"Left": [
"Text"
]
},
"nullable": [
false,
false,
false
]
},
"hash": "bae0e81b05f7f2118beac49a2691e8a8466ed37c2c22e5d40d9aeb7da0f7ce59"
}

View File

@ -0,0 +1,14 @@
{
"db_name": "PostgreSQL",
"query": "DELETE FROM AuthTokens WHERE account = $1;",
"describe": {
"columns": [],
"parameters": {
"Left": [
"Int8"
]
},
"nullable": []
},
"hash": "d703f0f7593a46686b6b2d44bdaa3f9adcfd54c3fce5a7a35c87aba3937e794c"
}

View File

@ -0,0 +1,16 @@
{
"db_name": "PostgreSQL",
"query": "\n INSERT INTO AuthTokens (token, account, expire) VALUES ($1, $2, $3);\n ",
"describe": {
"columns": [],
"parameters": {
"Left": [
"Varchar",
"Int8",
"Timestamp"
]
},
"nullable": []
},
"hash": "d71ba18cd27ffc0b3ec7d6fb3e00fb0d56d2e02f4aba71e090ac0451b50cf56b"
}

View File

@ -0,0 +1,12 @@
{
"db_name": "PostgreSQL",
"query": "\n CREATE TABLE IF NOT EXISTS VerificationTokens (\n token VARCHAR(32) NOT NULL,\n account SERIAL8 NOT NULL,\n expire TIMESTAMP NOT NULL\n );\n ",
"describe": {
"columns": [],
"parameters": {
"Left": []
},
"nullable": []
},
"hash": "d7aa893f2cd4154c72883bf50a031bdd1083c402c2409388f522767bbcdc2806"
}

View File

@ -0,0 +1,34 @@
{
"db_name": "PostgreSQL",
"query": "SELECT * FROM VerificationTokens WHERE account = $1;",
"describe": {
"columns": [
{
"ordinal": 0,
"name": "token",
"type_info": "Varchar"
},
{
"ordinal": 1,
"name": "account",
"type_info": "Int8"
},
{
"ordinal": 2,
"name": "expire",
"type_info": "Timestamp"
}
],
"parameters": {
"Left": [
"Int8"
]
},
"nullable": [
false,
false,
false
]
},
"hash": "d89d2c78b57727c5fcdc45dcb7ae9fc3ea098706d958721495dafbe40628251a"
}

View File

@ -0,0 +1,12 @@
{
"db_name": "PostgreSQL",
"query": "\n CREATE TABLE IF NOT EXISTS AuthTokens (\n token VARCHAR(32) NOT NULL,\n account SERIAL8 NOT NULL,\n expire TIMESTAMP NOT NULL\n );\n ",
"describe": {
"columns": [],
"parameters": {
"Left": []
},
"nullable": []
},
"hash": "f77dc2bcb3826a98bebee9bbcb3117953f781bd3f3f2afe6fd0b266da541df8c"
}

31
Dockerfile Normal file
View File

@ -0,0 +1,31 @@
FROM rust:latest as build
RUN apt-get update; \
apt-get install -y libclang-dev automake autoconf
# 1. Create a new empty shell project
RUN USER=root cargo new --bin nerdcult_api
WORKDIR /nerdcult_api
# 2. Copy our manifests
COPY ./Cargo.lock ./Cargo.lock
COPY ./Cargo.toml ./Cargo.toml
# 3. Build only the dependencies to cache them
RUN cargo build --release
RUN rm src/*.rs
# 4. Now that the dependency is built, copy your source code
COPY ./src ./src
COPY .sqlx .sqlx
# 5. Build for release.
RUN rm ./target/release/deps/nerdcult_api*
RUN SQLX_OFFLINE=true cargo build --release
FROM debian:bookworm-slim
COPY --from=build /nerdcult_api/target/release/nerdcult_api /bin/nerdcult_api
CMD ["/bin/nerdcult_api"]

View File

@ -13,6 +13,8 @@ The token for this can be aquired using the `/account/authenticate` endpoint.
- [X] `/tokens` - [X] `/tokens`
- [ ] `/follows` - [ ] `/follows`
- [ ] `/followers` - [ ] `/followers`
- [ ] `/deactivate`
- [ ] `/activate`
- `/user/` - `/user/`
- [ ] `/info` - [ ] `/info`
- [ ] `/follow` - [ ] `/follow`

View File

@ -61,7 +61,7 @@ async fn authenticate(
} }
#[delete("/account/delete")] #[delete("/account/delete")]
async fn delete(data: web::Data<ApiState>, auth: BearerAuth) -> impl Responder { async fn delete(data: web::Data<ApiState>, auth: BearerAuth, body: web::Json<data::DeleteRequest>) -> impl Responder {
match handlers::delete(&data.pool, auth.token().to_string()).await { match handlers::delete(&data.pool, auth.token().to_string()).await {
Ok(resp) => match resp { Ok(resp) => match resp {
data::DeleteResponse::Success => HttpResponse::Ok().finish(), data::DeleteResponse::Success => HttpResponse::Ok().finish(),

View File

@ -54,6 +54,11 @@ pub enum AuthenticateResponse {
Blocked, Blocked,
} }
#[derive(Debug, Deserialize)]
pub struct DeleteRequest {
reaseon: String,
}
#[derive(Debug)] #[derive(Debug)]
pub enum DeleteResponse { pub enum DeleteResponse {
Success, Success,

View File

@ -81,7 +81,7 @@ pub async fn start(port: u16, pool: PgPool) -> Result<()> {
.service(account::calls::tokens_get) .service(account::calls::tokens_get)
.app_data(web::Data::new(ApiState { pool: pool.clone() })) .app_data(web::Data::new(ApiState { pool: pool.clone() }))
}) })
.bind(("127.0.0.1", port))? .bind(("0.0.0.0", port))?
.run() .run()
.await; .await;