remove the notes model added by loco app template and everything related to it

This commit is contained in:
Douze Bé 2024-10-21 17:50:55 +02:00
parent c8e8dfae41
commit 652ead1c2b
20 changed files with 19 additions and 330 deletions

View file

@ -3,7 +3,6 @@
pub use sea_orm_migration::prelude::*; pub use sea_orm_migration::prelude::*;
mod m20220101_000001_users; mod m20220101_000001_users;
mod m20231103_114510_notes;
mod m20241016_181828_servers; mod m20241016_181828_servers;
mod m20241021_121449_bundles; mod m20241021_121449_bundles;
@ -16,7 +15,6 @@ impl MigratorTrait for Migrator {
fn migrations() -> Vec<Box<dyn MigrationTrait>> { fn migrations() -> Vec<Box<dyn MigrationTrait>> {
vec![ vec![
Box::new(m20220101_000001_users::Migration), Box::new(m20220101_000001_users::Migration),
Box::new(m20231103_114510_notes::Migration),
Box::new(m20241016_181828_servers::Migration), Box::new(m20241016_181828_servers::Migration),
Box::new(m20241021_121449_bundles::Migration), Box::new(m20241021_121449_bundles::Migration),
Box::new(m20241021_121806_services::Migration), Box::new(m20241021_121806_services::Migration),

View file

@ -1,34 +0,0 @@
use loco_rs::schema::table_auto_tz;
use sea_orm_migration::{prelude::*, schema::*};
#[derive(DeriveMigrationName)]
pub struct Migration;
#[async_trait::async_trait]
impl MigrationTrait for Migration {
async fn up(&self, manager: &SchemaManager) -> Result<(), DbErr> {
manager
.create_table(
table_auto_tz(Notes::Table)
.col(pk_auto(Notes::Id))
.col(string_null(Notes::Title))
.col(string_null(Notes::Content))
.to_owned(),
)
.await
}
async fn down(&self, manager: &SchemaManager) -> Result<(), DbErr> {
manager
.drop_table(Table::drop().table(Notes::Table).to_owned())
.await
}
}
#[derive(DeriveIden)]
enum Notes {
Table,
Id,
Title,
Content,
}

View file

@ -16,7 +16,7 @@ use sea_orm::DatabaseConnection;
use crate::{ use crate::{
controllers, initializers, controllers, initializers,
models::_entities::{notes, users}, models::_entities::{servers, bundles, services, bundles_services, users},
tasks, tasks,
workers::downloader::DownloadWorker, workers::downloader::DownloadWorker,
}; };
@ -53,7 +53,6 @@ impl Hooks for App {
.add_route(controllers::service::routes()) .add_route(controllers::service::routes())
.add_route(controllers::bundle::routes()) .add_route(controllers::bundle::routes())
.add_route(controllers::server::routes()) .add_route(controllers::server::routes())
.add_route(controllers::notes::routes())
.add_route(controllers::auth::routes()) .add_route(controllers::auth::routes())
.add_route(controllers::user::routes()) .add_route(controllers::user::routes())
} }
@ -69,13 +68,16 @@ impl Hooks for App {
async fn truncate(db: &DatabaseConnection) -> Result<()> { async fn truncate(db: &DatabaseConnection) -> Result<()> {
truncate_table(db, users::Entity).await?; truncate_table(db, users::Entity).await?;
truncate_table(db, notes::Entity).await?; truncate_table(db, bundles_services::Entity).await?;
truncate_table(db, services::Entity).await?;
truncate_table(db, bundles::Entity).await?;
truncate_table(db, servers::Entity).await?;
Ok(()) Ok(())
} }
async fn seed(db: &DatabaseConnection, base: &Path) -> Result<()> { async fn seed(db: &DatabaseConnection, base: &Path) -> Result<()> {
db::seed::<users::ActiveModel>(db, &base.join("users.yaml").display().to_string()).await?; db::seed::<users::ActiveModel>(db, &base.join("users.yaml").display().to_string()).await?;
db::seed::<notes::ActiveModel>(db, &base.join("notes.yaml").display().to_string()).await?; // ToDo: add seeds for other entities
Ok(()) Ok(())
} }
} }

View file

@ -1,5 +1,4 @@
pub mod auth; pub mod auth;
pub mod notes;
pub mod user; pub mod user;
pub mod server; pub mod server;

View file

@ -1,75 +0,0 @@
#![allow(clippy::missing_errors_doc)]
#![allow(clippy::unnecessary_struct_initialization)]
#![allow(clippy::unused_async)]
use axum::debug_handler;
use loco_rs::prelude::*;
use serde::{Deserialize, Serialize};
use crate::models::_entities::notes::{ActiveModel, Entity, Model};
#[derive(Clone, Debug, Serialize, Deserialize)]
pub struct Params {
pub title: Option<String>,
pub content: Option<String>,
}
impl Params {
fn update(&self, item: &mut ActiveModel) {
item.title = Set(self.title.clone());
item.content = Set(self.content.clone());
}
}
async fn load_item(ctx: &AppContext, id: i32) -> Result<Model> {
let item = Entity::find_by_id(id).one(&ctx.db).await?;
item.ok_or_else(|| Error::NotFound)
}
#[debug_handler]
pub async fn list(State(ctx): State<AppContext>) -> Result<Response> {
format::json(Entity::find().all(&ctx.db).await?)
}
#[debug_handler]
pub async fn add(State(ctx): State<AppContext>, Json(params): Json<Params>) -> Result<Response> {
let mut item = ActiveModel {
..Default::default()
};
params.update(&mut item);
let item = item.insert(&ctx.db).await?;
format::json(item)
}
#[debug_handler]
pub async fn update(
Path(id): Path<i32>,
State(ctx): State<AppContext>,
Json(params): Json<Params>,
) -> Result<Response> {
let item = load_item(&ctx, id).await?;
let mut item = item.into_active_model();
params.update(&mut item);
let item = item.update(&ctx.db).await?;
format::json(item)
}
#[debug_handler]
pub async fn remove(Path(id): Path<i32>, State(ctx): State<AppContext>) -> Result<Response> {
load_item(&ctx, id).await?.delete(&ctx.db).await?;
format::empty()
}
#[debug_handler]
pub async fn get_one(Path(id): Path<i32>, State(ctx): State<AppContext>) -> Result<Response> {
format::json(load_item(&ctx, id).await?)
}
pub fn routes() -> Routes {
Routes::new()
.prefix("api/notes")
.add("/", get(list))
.add("/", post(add))
.add("/:id", get(get_one))
.add("/:id", delete(remove))
.add("/:id", post(update))
}

View file

@ -1,11 +0,0 @@
---
- id: 1
title: Loco note 1
content: Loco note 1 content
created_at: "2023-11-12T12:34:56.789Z"
updated_at: "2023-11-12T12:34:56.789Z"
- id: 2
title: Loco note 2
content: Loco note 2 content
created_at: "2023-11-12T12:34:56.789Z"
updated_at: "2023-11-12T12:34:56.789Z"

View file

@ -1,17 +1,10 @@
--- ---
- id: 1 - id: 1
pid: 11111111-1111-1111-1111-111111111111 pid: 11111111-1111-1111-1111-111111111111
email: user1@example.com email: test@nixin.local.com
password: "$argon2id$v=19$m=19456,t=2,p=1$ETQBx4rTgNAZhSaeYZKOZg$eYTdH26CRT6nUJtacLDEboP0li6xUwUF/q5nSlQ8uuc" password: "$argon2id$v=19$m=19456,t=2,p=1$ETQBx4rTgNAZhSaeYZKOZg$eYTdH26CRT6nUJtacLDEboP0li6xUwUF/q5nSlQ8uuc"
api_key: lo-95ec80d7-cb60-4b70-9b4b-9ef74cb88758 api_key: lo-95ec80d7-cb60-4b70-9b4b-9ef74cb88758
name: user1 name: test
created_at: "2023-11-12T12:34:56.789Z"
updated_at: "2023-11-12T12:34:56.789Z"
- id: 2
pid: 22222222-2222-2222-2222-222222222222
email: user2@example.com
password: "$argon2id$v=19$m=19456,t=2,p=1$ETQBx4rTgNAZhSaeYZKOZg$eYTdH26CRT6nUJtacLDEboP0li6xUwUF/q5nSlQ8uuc"
api_key: lo-153561ca-fa84-4e1b-813a-c62526d0a77e
name: user2
created_at: "2023-11-12T12:34:56.789Z" created_at: "2023-11-12T12:34:56.789Z"
updated_at: "2023-11-12T12:34:56.789Z" updated_at: "2023-11-12T12:34:56.789Z"

View file

@ -4,7 +4,6 @@ pub mod prelude;
pub mod bundles; pub mod bundles;
pub mod bundles_services; pub mod bundles_services;
pub mod notes;
pub mod servers; pub mod servers;
pub mod services; pub mod services;
pub mod users; pub mod users;

View file

@ -1,18 +0,0 @@
//! `SeaORM` Entity, @generated by sea-orm-codegen 1.1.0
use sea_orm::entity::prelude::*;
use serde::{Deserialize, Serialize};
#[derive(Clone, Debug, PartialEq, DeriveEntityModel, Eq, Serialize, Deserialize)]
#[sea_orm(table_name = "notes")]
pub struct Model {
pub created_at: DateTimeWithTimeZone,
pub updated_at: DateTimeWithTimeZone,
#[sea_orm(primary_key)]
pub id: i32,
pub title: Option<String>,
pub content: Option<String>,
}
#[derive(Copy, Clone, Debug, EnumIter, DeriveRelation)]
pub enum Relation {}

View file

@ -2,7 +2,6 @@
pub use super::bundles::Entity as Bundles; pub use super::bundles::Entity as Bundles;
pub use super::bundles_services::Entity as BundlesServices; pub use super::bundles_services::Entity as BundlesServices;
pub use super::notes::Entity as Notes;
pub use super::servers::Entity as Servers; pub use super::servers::Entity as Servers;
pub use super::services::Entity as Services; pub use super::services::Entity as Services;
pub use super::users::Entity as Users; pub use super::users::Entity as Users;

View file

@ -1,5 +1,4 @@
pub mod _entities; pub mod _entities;
pub mod notes;
pub mod users; pub mod users;
pub mod servers; pub mod servers;
pub mod bundles; pub mod bundles;

View file

@ -1,7 +0,0 @@
use sea_orm::entity::prelude::*;
use super::_entities::notes::ActiveModel;
impl ActiveModelBehavior for ActiveModel {
// extend activemodel below (keep comment for generators)
}

View file

@ -23,9 +23,9 @@ async fn can_register() {
configure_insta!(); configure_insta!();
testing::request::<App, _, _>(|request, ctx| async move { testing::request::<App, _, _>(|request, ctx| async move {
let email = "test@loco.com"; let email = "test@nixin.local";
let payload = serde_json::json!({ let payload = serde_json::json!({
"name": "loco", "name": "test",
"email": email, "email": email,
"password": "12341234" "password": "12341234"
}); });
@ -57,9 +57,9 @@ async fn can_login_with_verify(#[case] test_name: &str, #[case] password: &str)
configure_insta!(); configure_insta!();
testing::request::<App, _, _>(|request, ctx| async move { testing::request::<App, _, _>(|request, ctx| async move {
let email = "test@loco.com"; let email = "test@nixin.local";
let register_payload = serde_json::json!({ let register_payload = serde_json::json!({
"name": "loco", "name": "test",
"email": email, "email": email,
"password": "12341234" "password": "12341234"
}); });
@ -107,10 +107,10 @@ async fn can_login_without_verify() {
configure_insta!(); configure_insta!();
testing::request::<App, _, _>(|request, _ctx| async move { testing::request::<App, _, _>(|request, _ctx| async move {
let email = "test@loco.com"; let email = "test@nixin.local";
let password = "12341234"; let password = "12341234";
let register_payload = serde_json::json!({ let register_payload = serde_json::json!({
"name": "loco", "name": "test",
"email": email, "email": email,
"password": password "password": password
}); });

View file

@ -1,4 +1,3 @@
mod auth; mod auth;
mod notes;
mod prepare_data; mod prepare_data;
mod user; mod user;

View file

@ -1,123 +0,0 @@
use insta::{assert_debug_snapshot, with_settings};
use loco_rs::testing;
use nixin_farm_ssr::{app::App, models::_entities::notes::Entity};
use sea_orm::entity::prelude::*;
use serial_test::serial;
// TODO: see how to dedup / extract this to app-local test utils
// not to framework, because that would require a runtime dep on insta
macro_rules! configure_insta {
($($expr:expr),*) => {
let mut settings = insta::Settings::clone_current();
settings.set_prepend_module_to_snapshot(false);
settings.set_snapshot_suffix("notes_request");
let _guard = settings.bind_to_scope();
};
}
#[tokio::test]
#[serial]
async fn can_get_notes() {
configure_insta!();
testing::request::<App, _, _>(|request, ctx| async move {
testing::seed::<App>(&ctx.db).await.unwrap();
let notes = request.get("/api/notes").await;
with_settings!({
filters => {
let mut combined_filters = testing::CLEANUP_DATE.to_vec();
combined_filters.extend(vec![(r#"\"id\\":\d+"#, r#""id\":ID"#)]);
combined_filters
}
}, {
assert_debug_snapshot!(
(notes.status_code(), notes.text())
);
});
})
.await;
}
#[tokio::test]
#[serial]
async fn can_add_note() {
configure_insta!();
testing::request::<App, _, _>(|request, _ctx| async move {
let payload = serde_json::json!({
"title": "loco",
"content": "loco note test",
});
let add_note_request = request.post("/api/notes").json(&payload).await;
with_settings!({
filters => {
let mut combined_filters = testing::CLEANUP_DATE.to_vec();
combined_filters.extend(vec![(r#"\"id\\":\d+"#, r#""id\":ID"#)]);
combined_filters
}
}, {
assert_debug_snapshot!(
(add_note_request.status_code(), add_note_request.text())
);
});
})
.await;
}
#[tokio::test]
#[serial]
async fn can_get_note() {
configure_insta!();
testing::request::<App, _, _>(|request, ctx| async move {
testing::seed::<App>(&ctx.db).await.unwrap();
let add_note_request = request.get("/api/notes/1").await;
with_settings!({
filters => {
let mut combined_filters = testing::CLEANUP_DATE.to_vec();
combined_filters.extend(vec![(r#"\"id\\":\d+"#, r#""id\":ID"#)]);
combined_filters
}
}, {
assert_debug_snapshot!(
(add_note_request.status_code(), add_note_request.text())
);
});
})
.await;
}
#[tokio::test]
#[serial]
async fn can_delete_note() {
configure_insta!();
testing::request::<App, _, _>(|request, ctx| async move {
testing::seed::<App>(&ctx.db).await.unwrap();
let count_before_delete = Entity::find().all(&ctx.db).await.unwrap().len();
let delete_note_request = request.delete("/api/notes/1").await;
with_settings!({
filters => {
let mut combined_filters = testing::CLEANUP_DATE.to_vec();
combined_filters.extend(vec![(r#"\"id\\":\d+"#, r#""id\":ID"#)]);
combined_filters
}
}, {
assert_debug_snapshot!(
(delete_note_request.status_code(), delete_note_request.text())
);
});
let count_after_delete = Entity::find().all(&ctx.db).await.unwrap().len();
assert_eq!(count_after_delete, count_before_delete - 1);
})
.await;
}

View file

@ -2,8 +2,9 @@ use axum::http::{HeaderName, HeaderValue};
use loco_rs::{app::AppContext, TestServer}; use loco_rs::{app::AppContext, TestServer};
use nixin_farm_ssr::{models::users, views::auth::LoginResponse}; use nixin_farm_ssr::{models::users, views::auth::LoginResponse};
const USER_EMAIL: &str = "test@loco.com"; const USER_NAME: &str = "test";
const USER_PASSWORD: &str = "1234"; const USER_EMAIL: &str = "test@nixin.local";
const USER_PASSWORD: &str = "Test";
pub struct LoggedInUser { pub struct LoggedInUser {
pub user: users::Model, pub user: users::Model,
@ -12,7 +13,7 @@ pub struct LoggedInUser {
pub async fn init_user_login(request: &TestServer, ctx: &AppContext) -> LoggedInUser { pub async fn init_user_login(request: &TestServer, ctx: &AppContext) -> LoggedInUser {
let register_payload = serde_json::json!({ let register_payload = serde_json::json!({
"name": "loco", "name": USER_NAME,
"email": USER_EMAIL, "email": USER_EMAIL,
"password": USER_PASSWORD "password": USER_PASSWORD
}); });

View file

@ -1,8 +0,0 @@
---
source: tests/requests/notes.rs
expression: "(add_note_request.status_code(), add_note_request.text())"
---
(
200,
"{\"created_at\":\"DATEZ\",\"updated_at\":\"DATEZ\",\"id\":ID,\"title\":\"loco\",\"content\":\"loco note test\"}",
)

View file

@ -1,8 +0,0 @@
---
source: tests/requests/notes.rs
expression: "(delete_note_request.status_code(), delete_note_request.text())"
---
(
200,
"",
)

View file

@ -1,8 +0,0 @@
---
source: tests/requests/notes.rs
expression: "(add_note_request.status_code(), add_note_request.text())"
---
(
200,
"{\"created_at\":\"DATEZ\",\"updated_at\":\"DATEZ\",\"id\":ID,\"title\":\"Loco note 1\",\"content\":\"Loco note 1 content\"}",
)

View file

@ -1,8 +0,0 @@
---
source: tests/requests/notes.rs
expression: "(notes.status_code(), notes.text())"
---
(
200,
"[{\"created_at\":\"DATEZ\",\"updated_at\":\"DATEZ\",\"id\":ID,\"title\":\"Loco note 1\",\"content\":\"Loco note 1 content\"},{\"created_at\":\"DATEZ\",\"updated_at\":\"DATEZ\",\"id\":ID,\"title\":\"Loco note 2\",\"content\":\"Loco note 2 content\"}]",
)