(feat) Server is now running
Added DB schemas that are needed for the basics. Signed-off-by: Louis Hollingworth <louis@hollingworth.nl>
This commit is contained in:
parent
b330bea46d
commit
cf80d4b70d
20
Cargo.lock
generated
20
Cargo.lock
generated
|
@ -69,6 +69,7 @@ checksum = "3b829e4e32b91e643de6eafe82b1d90675f5874230191a4ffbc1b336dec4d6bf"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"async-trait",
|
"async-trait",
|
||||||
"axum-core",
|
"axum-core",
|
||||||
|
"axum-macros",
|
||||||
"bitflags 1.3.2",
|
"bitflags 1.3.2",
|
||||||
"bytes",
|
"bytes",
|
||||||
"futures-util",
|
"futures-util",
|
||||||
|
@ -110,6 +111,18 @@ dependencies = [
|
||||||
"tower-service",
|
"tower-service",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "axum-macros"
|
||||||
|
version = "0.3.8"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "cdca6a10ecad987bda04e95606ef85a5417dcaac1a78455242d72e031e2b6b62"
|
||||||
|
dependencies = [
|
||||||
|
"heck",
|
||||||
|
"proc-macro2",
|
||||||
|
"quote",
|
||||||
|
"syn",
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "backtrace"
|
name = "backtrace"
|
||||||
version = "0.3.69"
|
version = "0.3.69"
|
||||||
|
@ -193,6 +206,7 @@ dependencies = [
|
||||||
"iana-time-zone",
|
"iana-time-zone",
|
||||||
"js-sys",
|
"js-sys",
|
||||||
"num-traits",
|
"num-traits",
|
||||||
|
"serde",
|
||||||
"wasm-bindgen",
|
"wasm-bindgen",
|
||||||
"windows-targets",
|
"windows-targets",
|
||||||
]
|
]
|
||||||
|
@ -339,6 +353,12 @@ version = "0.28.0"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "6fb8d784f27acf97159b40fc4db5ecd8aa23b9ad5ef69cdd136d3bc80665f0c0"
|
checksum = "6fb8d784f27acf97159b40fc4db5ecd8aa23b9ad5ef69cdd136d3bc80665f0c0"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "heck"
|
||||||
|
version = "0.4.1"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "95505c38b4572b2d910cecb0281560f54b440a19336cbbcb27bf6ce6adc6f5a8"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "hermit-abi"
|
name = "hermit-abi"
|
||||||
version = "0.3.3"
|
version = "0.3.3"
|
||||||
|
|
|
@ -15,8 +15,8 @@ edition = "2021"
|
||||||
name = "fediblog"
|
name = "fediblog"
|
||||||
|
|
||||||
[dependencies]
|
[dependencies]
|
||||||
axum = "0.6.20"
|
axum = {version = "0.6.20", features = ["macros"]}
|
||||||
chrono = "0.4.31"
|
chrono = {version = "0.4.31", features = ["serde"]}
|
||||||
diesel = { version = "2.1.3", features = ["postgres", "extras", "uuid"] }
|
diesel = { version = "2.1.3", features = ["postgres", "extras", "uuid"] }
|
||||||
dotenvy = "0.15.7"
|
dotenvy = "0.15.7"
|
||||||
serde = { version = "1.0.189", features = ["derive"] }
|
serde = { version = "1.0.189", features = ["derive"] }
|
||||||
|
|
|
@ -6,11 +6,12 @@
|
||||||
CREATE EXTENSION IF NOT EXISTS "uuid-ossp";
|
CREATE EXTENSION IF NOT EXISTS "uuid-ossp";
|
||||||
|
|
||||||
CREATE TABLE users (
|
CREATE TABLE users (
|
||||||
id SERIAL PRIMARY KEY,
|
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
||||||
username VARCHAR NOT NULL,
|
username VARCHAR NOT NULL,
|
||||||
epost VARCHAR NOT NULL,
|
epost VARCHAR NOT NULL,
|
||||||
pass VARCHAR NOT NULL,
|
pass VARCHAR NOT NULL,
|
||||||
created_at TIMESTAMP NOT NULL DEFAULT NOW(),
|
created_at TIMESTAMP NOT NULL DEFAULT NOW(),
|
||||||
updated_at TIMESTAMP NOT NULL DEFAULT NOW()
|
updated_at TIMESTAMP NOT NULL DEFAULT NOW(),
|
||||||
|
main_fedi TEXT
|
||||||
);
|
);
|
||||||
SELECT diesel_manage_updated_at('users');
|
SELECT diesel_manage_updated_at('users');
|
||||||
|
|
|
@ -10,7 +10,7 @@ CREATE TABLE posts (
|
||||||
title VARCHAR NOT NULL,
|
title VARCHAR NOT NULL,
|
||||||
body TEXT NOT NULL,
|
body TEXT NOT NULL,
|
||||||
published BOOLEAN NOT NULL DEFAULT FALSE,
|
published BOOLEAN NOT NULL DEFAULT FALSE,
|
||||||
author INTEGER NOT NULL REFERENCES users(id),
|
user_id UUID NOT NULL REFERENCES users(id),
|
||||||
created_at TIMESTAMP NOT NULL DEFAULT NOW(),
|
created_at TIMESTAMP NOT NULL DEFAULT NOW(),
|
||||||
updated_at TIMESTAMP NOT NULL DEFAULT NOW()
|
updated_at TIMESTAMP NOT NULL DEFAULT NOW()
|
||||||
);
|
);
|
||||||
|
|
|
@ -9,7 +9,7 @@ CREATE TABLE blogs (
|
||||||
name VARCHAR NOT NULL,
|
name VARCHAR NOT NULL,
|
||||||
description TEXT NOT NULL,
|
description TEXT NOT NULL,
|
||||||
url TEXT NOT NULL,
|
url TEXT NOT NULL,
|
||||||
owner INTEGER NOT NULL REFERENCES users(id),
|
user_id UUID NOT NULL REFERENCES users(id),
|
||||||
created_at TIMESTAMP NOT NULL DEFAULT NOW(),
|
created_at TIMESTAMP NOT NULL DEFAULT NOW(),
|
||||||
updated_at TIMESTAMP NOT NULL DEFAULT NOW()
|
updated_at TIMESTAMP NOT NULL DEFAULT NOW()
|
||||||
);
|
);
|
||||||
|
|
8
migrations/2023-10-17-164429_posts_add_blog_ref/down.sql
Normal file
8
migrations/2023-10-17-164429_posts_add_blog_ref/down.sql
Normal file
|
@ -0,0 +1,8 @@
|
||||||
|
-- SPDX-FileCopyrightText: 2023 Louis Hollingworth <louis@hollingworth.nl>
|
||||||
|
--
|
||||||
|
-- SPDX-License-Identifier: AGPL-3.0-or-later
|
||||||
|
|
||||||
|
-- This file should undo anything in `up.sql`
|
||||||
|
|
||||||
|
ALTER TABLE posts
|
||||||
|
DROP COLUMN blog_id;
|
8
migrations/2023-10-17-164429_posts_add_blog_ref/up.sql
Normal file
8
migrations/2023-10-17-164429_posts_add_blog_ref/up.sql
Normal file
|
@ -0,0 +1,8 @@
|
||||||
|
-- SPDX-FileCopyrightText: 2023 Louis Hollingworth <louis@hollingworth.nl>
|
||||||
|
--
|
||||||
|
-- SPDX-License-Identifier: AGPL-3.0-or-later
|
||||||
|
|
||||||
|
-- Your SQL goes here
|
||||||
|
|
||||||
|
ALTER TABLE posts
|
||||||
|
ADD COLUMN blog_id INTEGER NOT NULL REFERENCES blogs(id);
|
|
@ -1,9 +1,8 @@
|
||||||
// SPDX-FileCopyrightText: 2023 Louis Hollingworth <louis@hollingworth.nl>
|
// SPDX-FileCopyrightText: 2023 Louis Hollingworth <louis@hollingworth.nl>
|
||||||
//
|
//
|
||||||
// SPDX-License-Identifier: AGPL-3.0-or-later
|
// SPDX-License-Identifier: AGPL-3.0-or-later
|
||||||
pub mod schema;
|
|
||||||
pub mod uuid;
|
|
||||||
pub mod models;
|
pub mod models;
|
||||||
|
pub mod schema;
|
||||||
use diesel::prelude::*;
|
use diesel::prelude::*;
|
||||||
|
|
||||||
pub fn establish_connection() -> diesel::pg::PgConnection {
|
pub fn establish_connection() -> diesel::pg::PgConnection {
|
||||||
|
@ -13,4 +12,3 @@ pub fn establish_connection() -> diesel::pg::PgConnection {
|
||||||
diesel::pg::PgConnection::establish(&database_url)
|
diesel::pg::PgConnection::establish(&database_url)
|
||||||
.unwrap_or_else(|_| panic!("Error connecting to {}", database_url))
|
.unwrap_or_else(|_| panic!("Error connecting to {}", database_url))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
15
src/main.rs
15
src/main.rs
|
@ -3,7 +3,18 @@
|
||||||
*
|
*
|
||||||
* SPDX-License-Identifier: AGPL-3.0-or-later
|
* SPDX-License-Identifier: AGPL-3.0-or-later
|
||||||
*/
|
*/
|
||||||
#![feature(trivial_bounds)]
|
use axum::{routing::get, Router};
|
||||||
|
|
||||||
fn main() {
|
#[tokio::main]
|
||||||
|
async fn main() {
|
||||||
|
let app = Router::new().route("/health", get(health_check));
|
||||||
|
|
||||||
|
axum::Server::bind(&"0.0.0.0:7654".parse().unwrap())
|
||||||
|
.serve(app.into_make_service())
|
||||||
|
.await
|
||||||
|
.unwrap();
|
||||||
|
}
|
||||||
|
|
||||||
|
async fn health_check() -> &'static str {
|
||||||
|
"Saluton, amiko! Looks like we are running!"
|
||||||
}
|
}
|
||||||
|
|
|
@ -3,10 +3,52 @@
|
||||||
// SPDX-License-Identifier: AGPL-3.0-or-later
|
// SPDX-License-Identifier: AGPL-3.0-or-later
|
||||||
|
|
||||||
use diesel::prelude::*;
|
use diesel::prelude::*;
|
||||||
|
use serde::{Deserialize, Serialize};
|
||||||
|
use uuid::Uuid;
|
||||||
|
|
||||||
#[derive(Queryable, Selectable)]
|
#[derive(Queryable, Selectable, Identifiable, Debug, PartialEq, Serialize, Deserialize)]
|
||||||
#[diesel(table_name = crate::schema::posts)]
|
#[diesel(table_name = crate::schema::users)]
|
||||||
#[diesel(check_for_backend(diesel::pg::Pg))]
|
#[diesel(check_for_backend(diesel::pg::Pg))]
|
||||||
pub struct User {
|
pub struct User {
|
||||||
pub id: i32,
|
pub id: Uuid,
|
||||||
|
pub username: String,
|
||||||
|
pub epost: String,
|
||||||
|
pub pass: String,
|
||||||
|
pub created_at: chrono::NaiveDateTime,
|
||||||
|
pub updated_at: chrono::NaiveDateTime,
|
||||||
|
pub main_fedi: Option<String>,
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(
|
||||||
|
Queryable, Selectable, Identifiable, Associations, Debug, PartialEq, Serialize, Deserialize,
|
||||||
|
)]
|
||||||
|
#[diesel(belongs_to(User))]
|
||||||
|
#[diesel(table_name = crate::schema::blogs)]
|
||||||
|
pub struct Blog {
|
||||||
|
pub id: isize,
|
||||||
|
pub slug: String,
|
||||||
|
pub name: String,
|
||||||
|
pub description: String,
|
||||||
|
pub url: String,
|
||||||
|
pub user_id: Uuid,
|
||||||
|
pub created_at: chrono::NaiveDateTime,
|
||||||
|
pub updated_at: chrono::NaiveDateTime,
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(
|
||||||
|
Queryable, Selectable, Identifiable, Associations, Debug, PartialEq, Serialize, Deserialize,
|
||||||
|
)]
|
||||||
|
#[diesel(belongs_to(User))]
|
||||||
|
#[diesel(belongs_to(Blog))]
|
||||||
|
#[diesel(table_name = crate::schema::posts)]
|
||||||
|
pub struct Post {
|
||||||
|
pub id: isize,
|
||||||
|
pub slug: String,
|
||||||
|
pub title: String,
|
||||||
|
pub body: String,
|
||||||
|
pub published: bool,
|
||||||
|
pub user_id: Uuid,
|
||||||
|
pub blog_id: isize,
|
||||||
|
pub created_at: chrono::NaiveDateTime,
|
||||||
|
pub updated_at: chrono::NaiveDateTime,
|
||||||
}
|
}
|
||||||
|
|
|
@ -11,7 +11,7 @@ diesel::table! {
|
||||||
name -> Varchar,
|
name -> Varchar,
|
||||||
description -> Text,
|
description -> Text,
|
||||||
url -> Text,
|
url -> Text,
|
||||||
owner -> Int4,
|
user_id -> Uuid,
|
||||||
created_at -> Timestamp,
|
created_at -> Timestamp,
|
||||||
updated_at -> Timestamp,
|
updated_at -> Timestamp,
|
||||||
}
|
}
|
||||||
|
@ -24,28 +24,27 @@ diesel::table! {
|
||||||
title -> Varchar,
|
title -> Varchar,
|
||||||
body -> Text,
|
body -> Text,
|
||||||
published -> Bool,
|
published -> Bool,
|
||||||
author -> Int4,
|
user_id -> Uuid,
|
||||||
created_at -> Timestamp,
|
created_at -> Timestamp,
|
||||||
updated_at -> Timestamp,
|
updated_at -> Timestamp,
|
||||||
|
blog_id -> Int4,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
diesel::table! {
|
diesel::table! {
|
||||||
users (id) {
|
users (id) {
|
||||||
id -> Int4,
|
id -> Uuid,
|
||||||
username -> Varchar,
|
username -> Varchar,
|
||||||
epost -> Varchar,
|
epost -> Varchar,
|
||||||
pass -> Varchar,
|
pass -> Varchar,
|
||||||
created_at -> Timestamp,
|
created_at -> Timestamp,
|
||||||
updated_at -> Timestamp,
|
updated_at -> Timestamp,
|
||||||
|
main_fedi -> Nullable<Text>,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
diesel::joinable!(blogs -> users (owner));
|
diesel::joinable!(blogs -> users (user_id));
|
||||||
diesel::joinable!(posts -> users (author));
|
diesel::joinable!(posts -> blogs (blog_id));
|
||||||
|
diesel::joinable!(posts -> users (user_id));
|
||||||
|
|
||||||
diesel::allow_tables_to_appear_in_same_query!(
|
diesel::allow_tables_to_appear_in_same_query!(blogs, posts, users,);
|
||||||
blogs,
|
|
||||||
posts,
|
|
||||||
users,
|
|
||||||
);
|
|
||||||
|
|
Loading…
Reference in a new issue