feat: initialize thoughts-frontend with Next.js, TypeScript, and ESLint
- Add ESLint configuration for Next.js and TypeScript support. - Create Next.js configuration file with standalone output option. - Initialize package.json with scripts for development, build, and linting. - Set up PostCSS configuration for Tailwind CSS. - Add SVG assets for UI components. - Create TypeScript configuration for strict type checking and module resolution.
This commit is contained in:
21
thoughts-backend/models/Cargo.toml
Normal file
21
thoughts-backend/models/Cargo.toml
Normal file
@@ -0,0 +1,21 @@
|
||||
[package]
|
||||
name = "models"
|
||||
version = "0.1.0"
|
||||
edition = "2021"
|
||||
publish = false
|
||||
|
||||
[lib]
|
||||
name = "models"
|
||||
path = "src/lib.rs"
|
||||
|
||||
[dependencies]
|
||||
serde = { workspace = true }
|
||||
serde_json = { workspace = true }
|
||||
sea-orm = { workspace = true, features = [
|
||||
"sqlx-postgres",
|
||||
"sqlx-sqlite",
|
||||
"runtime-tokio-rustls",
|
||||
"macros",
|
||||
] }
|
||||
validator = { workspace = true, features = ["derive"] }
|
||||
utoipa = { workspace = true }
|
13
thoughts-backend/models/README.md
Normal file
13
thoughts-backend/models/README.md
Normal file
@@ -0,0 +1,13 @@
|
||||
# models
|
||||
|
||||
No axum or api dependencies should be introduced into this folder.
|
||||
Only dependencies for modelling are allowed:
|
||||
|
||||
- serde (JSON serialization/deserialization)
|
||||
- SeaORM (domain models and database)
|
||||
- validator (parameter validation)
|
||||
- utoipa (openapi)
|
||||
|
||||
## SeaORM
|
||||
|
||||
Write migration files first, then generate models.
|
33
thoughts-backend/models/src/domains/blog.rs
Normal file
33
thoughts-backend/models/src/domains/blog.rs
Normal file
@@ -0,0 +1,33 @@
|
||||
//! `SeaORM` Entity, @generated by sea-orm-codegen 1.0.0
|
||||
|
||||
use sea_orm::entity::prelude::*;
|
||||
|
||||
#[derive(Clone, Debug, PartialEq, DeriveEntityModel, Eq)]
|
||||
#[sea_orm(table_name = "blog")]
|
||||
pub struct Model {
|
||||
#[sea_orm(primary_key)]
|
||||
pub id: i32,
|
||||
pub author_id: i32,
|
||||
pub title: String,
|
||||
pub content: String,
|
||||
}
|
||||
|
||||
#[derive(Copy, Clone, Debug, EnumIter, DeriveRelation)]
|
||||
pub enum Relation {
|
||||
#[sea_orm(
|
||||
belongs_to = "super::user::Entity",
|
||||
from = "Column::AuthorId",
|
||||
to = "super::user::Column::Id",
|
||||
on_update = "NoAction",
|
||||
on_delete = "Cascade"
|
||||
)]
|
||||
User,
|
||||
}
|
||||
|
||||
impl Related<super::user::Entity> for Entity {
|
||||
fn to() -> RelationDef {
|
||||
Relation::User.def()
|
||||
}
|
||||
}
|
||||
|
||||
impl ActiveModelBehavior for ActiveModel {}
|
6
thoughts-backend/models/src/domains/mod.rs
Normal file
6
thoughts-backend/models/src/domains/mod.rs
Normal file
@@ -0,0 +1,6 @@
|
||||
//! `SeaORM` Entity, @generated by sea-orm-codegen 1.0.0
|
||||
|
||||
pub mod prelude;
|
||||
|
||||
pub mod blog;
|
||||
pub mod user;
|
4
thoughts-backend/models/src/domains/prelude.rs
Normal file
4
thoughts-backend/models/src/domains/prelude.rs
Normal file
@@ -0,0 +1,4 @@
|
||||
//! `SeaORM` Entity, @generated by sea-orm-codegen 1.0.0
|
||||
|
||||
pub use super::blog::Entity as Blog;
|
||||
pub use super::user::Entity as User;
|
26
thoughts-backend/models/src/domains/user.rs
Normal file
26
thoughts-backend/models/src/domains/user.rs
Normal file
@@ -0,0 +1,26 @@
|
||||
//! `SeaORM` Entity, @generated by sea-orm-codegen 1.0.0
|
||||
|
||||
use sea_orm::entity::prelude::*;
|
||||
|
||||
#[derive(Clone, Debug, PartialEq, DeriveEntityModel, Eq)]
|
||||
#[sea_orm(table_name = "user")]
|
||||
pub struct Model {
|
||||
#[sea_orm(primary_key)]
|
||||
pub id: i32,
|
||||
#[sea_orm(unique)]
|
||||
pub username: String,
|
||||
}
|
||||
|
||||
#[derive(Copy, Clone, Debug, EnumIter, DeriveRelation)]
|
||||
pub enum Relation {
|
||||
#[sea_orm(has_many = "super::blog::Entity")]
|
||||
Blog,
|
||||
}
|
||||
|
||||
impl Related<super::blog::Entity> for Entity {
|
||||
fn to() -> RelationDef {
|
||||
Relation::Blog.def()
|
||||
}
|
||||
}
|
||||
|
||||
impl ActiveModelBehavior for ActiveModel {}
|
4
thoughts-backend/models/src/lib.rs
Normal file
4
thoughts-backend/models/src/lib.rs
Normal file
@@ -0,0 +1,4 @@
|
||||
pub mod domains;
|
||||
pub mod params;
|
||||
pub mod queries;
|
||||
pub mod schemas;
|
14
thoughts-backend/models/src/params/blog.rs
Normal file
14
thoughts-backend/models/src/params/blog.rs
Normal file
@@ -0,0 +1,14 @@
|
||||
use serde::Deserialize;
|
||||
use utoipa::ToSchema;
|
||||
use validator::Validate;
|
||||
|
||||
#[derive(Deserialize, Validate, ToSchema)]
|
||||
pub struct CreateBlogParams {
|
||||
pub author_id: u32,
|
||||
|
||||
#[validate(length(min = 2))]
|
||||
pub title: String,
|
||||
|
||||
#[validate(length(min = 2))]
|
||||
pub content: String,
|
||||
}
|
2
thoughts-backend/models/src/params/mod.rs
Normal file
2
thoughts-backend/models/src/params/mod.rs
Normal file
@@ -0,0 +1,2 @@
|
||||
pub mod blog;
|
||||
pub mod user;
|
9
thoughts-backend/models/src/params/user.rs
Normal file
9
thoughts-backend/models/src/params/user.rs
Normal file
@@ -0,0 +1,9 @@
|
||||
use serde::Deserialize;
|
||||
use utoipa::ToSchema;
|
||||
use validator::Validate;
|
||||
|
||||
#[derive(Deserialize, Validate, ToSchema)]
|
||||
pub struct CreateUserParams {
|
||||
#[validate(length(min = 2))]
|
||||
pub username: String,
|
||||
}
|
9
thoughts-backend/models/src/queries/blog.rs
Normal file
9
thoughts-backend/models/src/queries/blog.rs
Normal file
@@ -0,0 +1,9 @@
|
||||
use serde::Deserialize;
|
||||
use utoipa::IntoParams;
|
||||
|
||||
#[derive(Deserialize, Default, IntoParams)]
|
||||
#[into_params(style = Form, parameter_in = Query)]
|
||||
pub struct BlogQuery {
|
||||
#[param(nullable = true)]
|
||||
pub title: Option<String>,
|
||||
}
|
2
thoughts-backend/models/src/queries/mod.rs
Normal file
2
thoughts-backend/models/src/queries/mod.rs
Normal file
@@ -0,0 +1,2 @@
|
||||
pub mod blog;
|
||||
pub mod user;
|
9
thoughts-backend/models/src/queries/user.rs
Normal file
9
thoughts-backend/models/src/queries/user.rs
Normal file
@@ -0,0 +1,9 @@
|
||||
use serde::Deserialize;
|
||||
use utoipa::IntoParams;
|
||||
|
||||
#[derive(Deserialize, Default, IntoParams)]
|
||||
#[into_params(style = Form, parameter_in = Query)]
|
||||
pub struct UserQuery {
|
||||
#[param(nullable = true)]
|
||||
pub username: Option<String>,
|
||||
}
|
36
thoughts-backend/models/src/schemas/blog.rs
Normal file
36
thoughts-backend/models/src/schemas/blog.rs
Normal file
@@ -0,0 +1,36 @@
|
||||
use serde::Serialize;
|
||||
use utoipa::ToSchema;
|
||||
|
||||
use crate::domains::blog;
|
||||
|
||||
#[derive(Serialize, ToSchema)]
|
||||
pub struct BlogSchema {
|
||||
pub id: u32,
|
||||
pub title: String,
|
||||
pub content: String,
|
||||
pub author_id: u32,
|
||||
}
|
||||
|
||||
impl From<blog::Model> for BlogSchema {
|
||||
fn from(blog: blog::Model) -> Self {
|
||||
Self {
|
||||
id: blog.id as u32,
|
||||
title: blog.title,
|
||||
content: blog.content,
|
||||
author_id: blog.author_id as u32,
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#[derive(Serialize, ToSchema)]
|
||||
pub struct BlogListSchema {
|
||||
pub blogs: Vec<BlogSchema>,
|
||||
}
|
||||
|
||||
impl From<Vec<blog::Model>> for BlogListSchema {
|
||||
fn from(blogs: Vec<blog::Model>) -> Self {
|
||||
Self {
|
||||
blogs: blogs.into_iter().map(BlogSchema::from).collect(),
|
||||
}
|
||||
}
|
||||
}
|
2
thoughts-backend/models/src/schemas/mod.rs
Normal file
2
thoughts-backend/models/src/schemas/mod.rs
Normal file
@@ -0,0 +1,2 @@
|
||||
pub mod blog;
|
||||
pub mod user;
|
32
thoughts-backend/models/src/schemas/user.rs
Normal file
32
thoughts-backend/models/src/schemas/user.rs
Normal file
@@ -0,0 +1,32 @@
|
||||
use serde::Serialize;
|
||||
use utoipa::ToSchema;
|
||||
|
||||
use crate::domains::user;
|
||||
|
||||
#[derive(Serialize, ToSchema)]
|
||||
pub struct UserSchema {
|
||||
pub id: u32,
|
||||
pub username: String,
|
||||
}
|
||||
|
||||
impl From<user::Model> for UserSchema {
|
||||
fn from(user: user::Model) -> Self {
|
||||
Self {
|
||||
id: user.id as u32,
|
||||
username: user.username,
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#[derive(Serialize, ToSchema)]
|
||||
pub struct UserListSchema {
|
||||
pub users: Vec<UserSchema>,
|
||||
}
|
||||
|
||||
impl From<Vec<user::Model>> for UserListSchema {
|
||||
fn from(users: Vec<user::Model>) -> Self {
|
||||
Self {
|
||||
users: users.into_iter().map(UserSchema::from).collect(),
|
||||
}
|
||||
}
|
||||
}
|
Reference in New Issue
Block a user