From 0194ddf663fc5428c687a6efd3b489ff1bbc0ce4 Mon Sep 17 00:00:00 2001 From: Felix Ableitner Date: Wed, 15 Jan 2025 14:28:19 +0100 Subject: [PATCH] Also split up files in src/common.rs --- src/backend/api/article.rs | 34 +- src/backend/api/instance.rs | 7 +- src/backend/api/mod.rs | 6 +- src/backend/api/user.rs | 16 +- src/backend/config.rs | 2 +- src/backend/database/article.rs | 6 +- src/backend/database/conflict.rs | 7 +- src/backend/database/edit.rs | 5 +- src/backend/database/instance.rs | 6 +- src/backend/database/user.rs | 7 +- src/backend/federation/activities/accept.rs | 2 +- .../federation/activities/create_article.rs | 2 +- src/backend/federation/activities/follow.rs | 2 +- src/backend/federation/activities/mod.rs | 6 +- src/backend/federation/activities/reject.rs | 2 +- .../activities/update_local_article.rs | 2 +- .../activities/update_remote_article.rs | 6 +- src/backend/federation/objects/article.rs | 5 +- .../federation/objects/articles_collection.rs | 2 +- src/backend/federation/objects/edit.rs | 5 +- .../federation/objects/edits_collection.rs | 2 +- src/backend/federation/objects/instance.rs | 2 +- .../federation/objects/instance_collection.rs | 2 +- src/backend/federation/objects/user.rs | 2 +- src/backend/federation/routes.rs | 2 +- src/backend/mod.rs | 7 +- src/backend/utils/mod.rs | 7 +- src/common/article.rs | 193 ++++++++++ src/common/instance.rs | 93 +++++ src/common/mod.rs | 346 +----------------- src/common/user.rs | 88 +++++ src/common/validation.rs | 2 +- src/frontend/api.rs | 6 +- src/frontend/app.rs | 2 +- src/frontend/components/article_nav.rs | 2 +- src/frontend/components/edit_list.rs | 2 +- .../components/instance_follow_button.rs | 5 +- src/frontend/mod.rs | 2 +- src/frontend/pages/article/actions.rs | 5 +- src/frontend/pages/article/create.rs | 2 +- src/frontend/pages/article/edit.rs | 4 +- src/frontend/pages/article/list.rs | 2 +- src/frontend/pages/instance/details.rs | 2 +- src/frontend/pages/login.rs | 2 +- src/frontend/pages/mod.rs | 5 +- src/frontend/pages/register.rs | 2 +- src/frontend/pages/search.rs | 5 +- src/frontend/pages/user_edit_profile.rs | 2 +- src/frontend/pages/user_profile.rs | 2 +- tests/common.rs | 2 +- tests/test.rs | 22 +- 51 files changed, 504 insertions(+), 448 deletions(-) create mode 100644 src/common/article.rs create mode 100644 src/common/instance.rs create mode 100644 src/common/user.rs diff --git a/src/backend/api/article.rs b/src/backend/api/article.rs index ef36383..336fc77 100644 --- a/src/backend/api/article.rs +++ b/src/backend/api/article.rs @@ -11,25 +11,27 @@ use crate::{ utils::{error::MyResult, generate_article_version}, }, common::{ + article::{ + ApiConflict, + ApproveArticleForm, + ArticleView, + CreateArticleForm, + DbArticle, + DbEdit, + DeleteConflictForm, + EditArticleForm, + EditVersion, + ForkArticleForm, + GetArticleForm, + ListArticlesForm, + ProtectArticleForm, + SearchArticleForm, + }, + instance::DbInstance, + user::LocalUserView, utils::{extract_domain, http_protocol_str}, validation::can_edit_article, - ApiConflict, - ApproveArticleForm, - ArticleView, - CreateArticleForm, - DbArticle, - DbEdit, - DbInstance, - DeleteConflictForm, - EditArticleForm, - EditVersion, - ForkArticleForm, - GetArticleForm, - ListArticlesForm, - LocalUserView, - ProtectArticleForm, ResolveObject, - SearchArticleForm, }, }; use activitypub_federation::{config::Data, fetch::object_id::ObjectId}; diff --git a/src/backend/api/instance.rs b/src/backend/api/instance.rs index 7d2a91a..4c5b571 100644 --- a/src/backend/api/instance.rs +++ b/src/backend/api/instance.rs @@ -1,11 +1,8 @@ use crate::{ backend::{database::IbisData, federation::activities::follow::Follow, utils::error::MyResult}, common::{ - DbInstance, - FollowInstance, - GetInstance, - InstanceView, - LocalUserView, + instance::{DbInstance, FollowInstance, GetInstance, InstanceView}, + user::LocalUserView, ResolveObject, SuccessResponse, }, diff --git a/src/backend/api/mod.rs b/src/backend/api/mod.rs index 4789fbd..b77f6a9 100644 --- a/src/backend/api/mod.rs +++ b/src/backend/api/mod.rs @@ -18,7 +18,11 @@ use crate::{ database::IbisData, utils::error::MyResult, }, - common::{DbEdit, EditView, GetEditList, LocalUserView, SiteView}, + common::{ + article::{DbEdit, EditView, GetEditList}, + instance::SiteView, + user::LocalUserView, + }, }; use activitypub_federation::config::Data; use anyhow::anyhow; diff --git a/src/backend/api/user.rs b/src/backend/api/user.rs index b9a19d7..baa19b2 100644 --- a/src/backend/api/user.rs +++ b/src/backend/api/user.rs @@ -5,15 +5,17 @@ use crate::{ utils::error::MyResult, }, common::{ - DbArticle, - DbPerson, - GetUserForm, - LocalUserView, - LoginUserForm, + article::DbArticle, + user::{ + DbPerson, + GetUserForm, + LocalUserView, + LoginUserForm, + RegisterUserForm, + UpdateUserForm, + }, Notification, - RegisterUserForm, SuccessResponse, - UpdateUserForm, AUTH_COOKIE, }, }; diff --git a/src/backend/config.rs b/src/backend/config.rs index e5c2a64..ed1036a 100644 --- a/src/backend/config.rs +++ b/src/backend/config.rs @@ -1,4 +1,4 @@ -use crate::{backend::utils::error::MyResult, common::Options}; +use crate::{backend::utils::error::MyResult, common::instance::Options}; use config::Config; use doku::Document; use serde::Deserialize; diff --git a/src/backend/database/article.rs b/src/backend/database/article.rs index 8af70f0..4567983 100644 --- a/src/backend/database/article.rs +++ b/src/backend/database/article.rs @@ -8,11 +8,9 @@ use crate::{ utils::error::MyResult, }, common::{ + article::{ArticleView, DbArticle, EditVersion}, + instance::DbInstance, newtypes::{ArticleId, InstanceId}, - ArticleView, - DbArticle, - DbInstance, - EditVersion, }, }; use activitypub_federation::fetch::{collection_id::CollectionId, object_id::ObjectId}; diff --git a/src/backend/database/conflict.rs b/src/backend/database/conflict.rs index 5364d08..0b5c9bf 100644 --- a/src/backend/database/conflict.rs +++ b/src/backend/database/conflict.rs @@ -5,12 +5,9 @@ use crate::{ utils::{error::MyResult, generate_article_version}, }, common::{ + article::{ApiConflict, DbArticle, DbEdit, EditVersion}, newtypes::{ArticleId, ConflictId, PersonId}, - ApiConflict, - DbArticle, - DbEdit, - DbPerson, - EditVersion, + user::DbPerson, }, }; use activitypub_federation::config::Data; diff --git a/src/backend/database/edit.rs b/src/backend/database/edit.rs index db3c711..9010d7f 100644 --- a/src/backend/database/edit.rs +++ b/src/backend/database/edit.rs @@ -5,11 +5,8 @@ use crate::{ IbisData, }, common::{ + article::{DbArticle, DbEdit, EditVersion, EditView}, newtypes::{ArticleId, PersonId}, - DbArticle, - DbEdit, - EditVersion, - EditView, }, }; use activitypub_federation::fetch::object_id::ObjectId; diff --git a/src/backend/database/instance.rs b/src/backend/database/instance.rs index a3c16ae..e248789 100644 --- a/src/backend/database/instance.rs +++ b/src/backend/database/instance.rs @@ -10,7 +10,11 @@ use crate::{ }, utils::error::MyResult, }, - common::{newtypes::InstanceId, DbInstance, DbPerson, InstanceView}, + common::{ + instance::{DbInstance, InstanceView}, + newtypes::InstanceId, + user::DbPerson, + }, }; use activitypub_federation::{ config::Data, diff --git a/src/backend/database/user.rs b/src/backend/database/user.rs index 0b88237..1e7d4a4 100644 --- a/src/backend/database/user.rs +++ b/src/backend/database/user.rs @@ -7,13 +7,10 @@ use crate::{ utils::{error::MyResult, generate_keypair}, }, common::{ + instance::DbInstance, newtypes::PersonId, + user::{DbLocalUser, DbPerson, LocalUserView, UpdateUserForm}, utils::http_protocol_str, - DbInstance, - DbLocalUser, - DbPerson, - LocalUserView, - UpdateUserForm, }, }; use activitypub_federation::{config::Data, fetch::object_id::ObjectId}; diff --git a/src/backend/federation/activities/accept.rs b/src/backend/federation/activities/accept.rs index ceff950..fd8cb2b 100644 --- a/src/backend/federation/activities/accept.rs +++ b/src/backend/federation/activities/accept.rs @@ -7,7 +7,7 @@ use crate::{ generate_activity_id, }, }, - common::DbInstance, + common::instance::DbInstance, }; use activitypub_federation::{ config::Data, diff --git a/src/backend/federation/activities/create_article.rs b/src/backend/federation/activities/create_article.rs index 1ccfc11..28245c0 100644 --- a/src/backend/federation/activities/create_article.rs +++ b/src/backend/federation/activities/create_article.rs @@ -7,7 +7,7 @@ use crate::{ generate_activity_id, }, }, - common::{DbArticle, DbInstance}, + common::{article::DbArticle, instance::DbInstance}, }; use activitypub_federation::{ config::Data, diff --git a/src/backend/federation/activities/follow.rs b/src/backend/federation/activities/follow.rs index e312918..99df4e8 100644 --- a/src/backend/federation/activities/follow.rs +++ b/src/backend/federation/activities/follow.rs @@ -5,7 +5,7 @@ use crate::{ generate_activity_id, utils::error::{Error, MyResult}, }, - common::{DbInstance, DbPerson}, + common::{instance::DbInstance, user::DbPerson}, }; use activitypub_federation::{ config::Data, diff --git a/src/backend/federation/activities/mod.rs b/src/backend/federation/activities/mod.rs index aa7118a..4e9f52b 100644 --- a/src/backend/federation/activities/mod.rs +++ b/src/backend/federation/activities/mod.rs @@ -8,11 +8,9 @@ use crate::{ utils::error::Error, }, common::{ + article::{DbArticle, DbEdit, EditVersion}, + instance::DbInstance, newtypes::{EditId, PersonId}, - DbArticle, - DbEdit, - DbInstance, - EditVersion, }, }; use activitypub_federation::config::Data; diff --git a/src/backend/federation/activities/reject.rs b/src/backend/federation/activities/reject.rs index f24fbae..fe0cb1c 100644 --- a/src/backend/federation/activities/reject.rs +++ b/src/backend/federation/activities/reject.rs @@ -10,7 +10,7 @@ use crate::{ generate_activity_id, }, }, - common::{DbInstance, EditVersion}, + common::{article::EditVersion, instance::DbInstance}, }; use activitypub_federation::{ config::Data, diff --git a/src/backend/federation/activities/update_local_article.rs b/src/backend/federation/activities/update_local_article.rs index 874605c..7ba98d3 100644 --- a/src/backend/federation/activities/update_local_article.rs +++ b/src/backend/federation/activities/update_local_article.rs @@ -7,7 +7,7 @@ use crate::{ generate_activity_id, }, }, - common::{DbArticle, DbInstance}, + common::{article::DbArticle, instance::DbInstance}, }; use activitypub_federation::{ config::Data, diff --git a/src/backend/federation/activities/update_remote_article.rs b/src/backend/federation/activities/update_remote_article.rs index f18db28..5a9ecc4 100644 --- a/src/backend/federation/activities/update_remote_article.rs +++ b/src/backend/federation/activities/update_remote_article.rs @@ -11,7 +11,11 @@ use crate::{ generate_activity_id, }, }, - common::{validation::can_edit_article, DbArticle, DbEdit, DbInstance}, + common::{ + article::{DbArticle, DbEdit}, + instance::DbInstance, + validation::can_edit_article, + }, }; use activitypub_federation::{ config::Data, diff --git a/src/backend/federation/objects/article.rs b/src/backend/federation/objects/article.rs index f9e6f30..21ef3cd 100644 --- a/src/backend/federation/objects/article.rs +++ b/src/backend/federation/objects/article.rs @@ -4,7 +4,10 @@ use crate::{ federation::objects::edits_collection::DbEditCollection, utils::error::Error, }, - common::{DbArticle, DbInstance, EditVersion}, + common::{ + article::{DbArticle, EditVersion}, + instance::DbInstance, + }, }; use activitypub_federation::{ config::Data, diff --git a/src/backend/federation/objects/articles_collection.rs b/src/backend/federation/objects/articles_collection.rs index 016cad3..03b8ac6 100644 --- a/src/backend/federation/objects/articles_collection.rs +++ b/src/backend/federation/objects/articles_collection.rs @@ -4,7 +4,7 @@ use crate::{ federation::objects::article::ApubArticle, utils::error::{Error, MyResult}, }, - common::{utils::http_protocol_str, DbArticle}, + common::{article::DbArticle, utils::http_protocol_str}, }; use activitypub_federation::{ config::Data, diff --git a/src/backend/federation/objects/edit.rs b/src/backend/federation/objects/edit.rs index 6c8a64d..591363f 100644 --- a/src/backend/federation/objects/edit.rs +++ b/src/backend/federation/objects/edit.rs @@ -3,7 +3,10 @@ use crate::{ database::{edit::DbEditForm, IbisData}, utils::error::Error, }, - common::{DbArticle, DbEdit, DbPerson, EditVersion}, + common::{ + article::{DbArticle, DbEdit, EditVersion}, + user::DbPerson, + }, }; use activitypub_federation::{ config::Data, diff --git a/src/backend/federation/objects/edits_collection.rs b/src/backend/federation/objects/edits_collection.rs index 3e3a96c..69ae89f 100644 --- a/src/backend/federation/objects/edits_collection.rs +++ b/src/backend/federation/objects/edits_collection.rs @@ -1,6 +1,6 @@ use crate::{ backend::{database::IbisData, federation::objects::edit::ApubEdit, utils::error::Error}, - common::{DbArticle, DbEdit}, + common::article::{DbArticle, DbEdit}, }; use activitypub_federation::{ config::Data, diff --git a/src/backend/federation/objects/instance.rs b/src/backend/federation/objects/instance.rs index a9fbdf5..80ecaf4 100644 --- a/src/backend/federation/objects/instance.rs +++ b/src/backend/federation/objects/instance.rs @@ -5,7 +5,7 @@ use crate::{ federation::{objects::articles_collection::DbArticleCollection, send_activity}, utils::error::{Error, MyResult}, }, - common::{utils::extract_domain, DbInstance}, + common::{instance::DbInstance, utils::extract_domain}, }; use activitypub_federation::{ config::Data, diff --git a/src/backend/federation/objects/instance_collection.rs b/src/backend/federation/objects/instance_collection.rs index 70cc651..27e19d9 100644 --- a/src/backend/federation/objects/instance_collection.rs +++ b/src/backend/federation/objects/instance_collection.rs @@ -4,7 +4,7 @@ use crate::{ database::IbisData, utils::error::{Error, MyResult}, }, - common::{utils::http_protocol_str, DbInstance}, + common::{instance::DbInstance, utils::http_protocol_str}, }; use activitypub_federation::{ config::Data, diff --git a/src/backend/federation/objects/user.rs b/src/backend/federation/objects/user.rs index c53ea08..af374be 100644 --- a/src/backend/federation/objects/user.rs +++ b/src/backend/federation/objects/user.rs @@ -3,7 +3,7 @@ use crate::{ database::{user::DbPersonForm, IbisData}, utils::error::Error, }, - common::DbPerson, + common::user::DbPerson, }; use activitypub_federation::{ config::Data, diff --git a/src/backend/federation/routes.rs b/src/backend/federation/routes.rs index 0f85ecd..50134a8 100644 --- a/src/backend/federation/routes.rs +++ b/src/backend/federation/routes.rs @@ -21,7 +21,7 @@ use crate::{ }, utils::error::{Error, MyResult}, }, - common::{DbArticle, DbInstance, DbPerson}, + common::{article::DbArticle, instance::DbInstance, user::DbPerson}, }; use activitypub_federation::{ axum::{ diff --git a/src/backend/mod.rs b/src/backend/mod.rs index 1b65ed3..0913376 100644 --- a/src/backend/mod.rs +++ b/src/backend/mod.rs @@ -9,11 +9,10 @@ use crate::{ }, }, common::{ + article::{DbArticle, EditVersion}, + instance::DbInstance, + user::DbPerson, utils::http_protocol_str, - DbArticle, - DbInstance, - DbPerson, - EditVersion, MAIN_PAGE_NAME, }, }; diff --git a/src/backend/utils/mod.rs b/src/backend/utils/mod.rs index ddc1e4a..fbd99ab 100644 --- a/src/backend/utils/mod.rs +++ b/src/backend/utils/mod.rs @@ -1,6 +1,9 @@ use crate::{ backend::{database::IbisData, utils::error::MyResult}, - common::{utils, DbEdit, EditVersion}, + common::{ + article::{DbEdit, EditVersion}, + utils, + }, }; use activitypub_federation::{ config::Data, @@ -57,8 +60,8 @@ pub(super) fn generate_article_version( mod test { use super::*; use crate::common::{ + article::DbEdit, newtypes::{ArticleId, EditId, PersonId}, - DbEdit, }; use activitypub_federation::fetch::object_id::ObjectId; use chrono::Utc; diff --git a/src/common/article.rs b/src/common/article.rs new file mode 100644 index 0000000..097fca9 --- /dev/null +++ b/src/common/article.rs @@ -0,0 +1,193 @@ +use super::{ + instance::DbInstance, + newtypes::{ArticleId, ConflictId, EditId, InstanceId, PersonId}, + user::DbPerson, +}; +use chrono::{DateTime, Utc}; +use serde::{Deserialize, Serialize}; +use sha2::{Digest, Sha256}; +use uuid::Uuid; +#[cfg(feature = "ssr")] +use { + crate::backend::database::schema::{article, edit}, + activitypub_federation::fetch::object_id::ObjectId, + diesel::{Identifiable, Queryable, Selectable}, +}; + +/// Should be an enum Title/Id but fails due to https://github.com/nox/serde_urlencoded/issues/66 +#[derive(Deserialize, Serialize, Clone, Debug, Default)] +pub struct GetArticleForm { + pub title: Option, + pub domain: Option, + pub id: Option, +} + +#[derive(Deserialize, Serialize, Clone, Default, Debug)] +pub struct ListArticlesForm { + pub only_local: Option, + pub instance_id: Option, +} + +#[derive(Clone, Debug, Serialize, Deserialize, PartialEq)] +#[cfg_attr(feature = "ssr", derive(Queryable))] +#[cfg_attr(feature = "ssr", diesel(table_name = article, check_for_backend(diesel::pg::Pg)))] +pub struct ArticleView { + pub article: DbArticle, + pub instance: DbInstance, + pub latest_version: EditVersion, +} + +#[derive(Clone, Debug, Serialize, Deserialize, PartialEq)] +#[cfg_attr(feature = "ssr", derive(Queryable, Selectable, Identifiable))] +#[cfg_attr(feature = "ssr", diesel(table_name = article, check_for_backend(diesel::pg::Pg), belongs_to(DbInstance, foreign_key = instance_id)))] +pub struct DbArticle { + pub id: ArticleId, + pub title: String, + pub text: String, + #[cfg(feature = "ssr")] + pub ap_id: ObjectId, + #[cfg(not(feature = "ssr"))] + pub ap_id: String, + pub instance_id: InstanceId, + pub local: bool, + pub protected: bool, + pub approved: bool, + pub published: DateTime, +} + +#[derive(Deserialize, Serialize, Debug)] +pub struct CreateArticleForm { + pub title: String, + pub text: String, + pub summary: String, +} + +#[derive(Deserialize, Serialize, Debug)] +pub struct EditArticleForm { + /// Id of the article to edit + pub article_id: ArticleId, + /// Full, new text of the article. A diff against `previous_version` is generated on the backend + /// side to handle conflicts. + pub new_text: String, + /// What was changed + pub summary: String, + /// The version that this edit is based on, ie [DbArticle.latest_version] or + /// [ApiConflict.previous_version] + pub previous_version_id: EditVersion, + /// If you are resolving a conflict, pass the id to delete conflict from the database + pub resolve_conflict_id: Option, +} + +#[derive(Deserialize, Serialize, Debug)] +pub struct ProtectArticleForm { + pub article_id: ArticleId, + pub protected: bool, +} + +#[derive(Deserialize, Serialize, Debug)] +pub struct ForkArticleForm { + pub article_id: ArticleId, + pub new_title: String, +} + +#[derive(Deserialize, Serialize, Debug)] +pub struct ApproveArticleForm { + pub article_id: ArticleId, + pub approve: bool, +} + +#[derive(Deserialize, Serialize, Clone, Debug)] +pub struct SearchArticleForm { + pub query: String, +} + +/// Represents a single change to the article. +#[derive(Clone, Debug, Serialize, Deserialize, PartialEq)] +#[cfg_attr(feature = "ssr", derive(Queryable, Selectable))] +#[cfg_attr(feature = "ssr", diesel(table_name = edit, check_for_backend(diesel::pg::Pg)))] +pub struct DbEdit { + // TODO: we could use hash as primary key, but that gives errors on forking because + // the same edit is used for multiple articles + pub id: EditId, + #[serde(skip)] + pub creator_id: PersonId, + /// UUID built from sha224 hash of diff + pub hash: EditVersion, + #[cfg(feature = "ssr")] + pub ap_id: ObjectId, + #[cfg(not(feature = "ssr"))] + pub ap_id: String, + pub diff: String, + pub summary: String, + pub article_id: ArticleId, + /// First edit of an article always has `EditVersion::default()` here + pub previous_version_id: EditVersion, + pub published: DateTime, +} + +#[derive(Deserialize, Serialize, Clone, Debug, Default)] +pub struct GetEditList { + pub article_id: Option, + pub person_id: Option, +} + +#[derive(Clone, Debug, Serialize, Deserialize, PartialEq)] +#[cfg_attr(feature = "ssr", derive(Queryable))] +#[cfg_attr(feature = "ssr", diesel(check_for_backend(diesel::pg::Pg)))] +pub struct EditView { + pub edit: DbEdit, + pub article: DbArticle, + pub creator: DbPerson, +} + +/// The version hash of a specific edit. Generated by taking an SHA256 hash of the diff +/// and using the first 16 bytes so that it fits into UUID. +#[derive(Clone, Debug, Serialize, Deserialize, PartialEq, Eq, Hash)] +#[cfg_attr(feature = "ssr", derive(diesel_derive_newtype::DieselNewType))] +pub struct EditVersion(pub(crate) Uuid); + +impl EditVersion { + pub fn new(diff: &str) -> Self { + let mut sha256 = Sha256::new(); + sha256.update(diff); + let hash_bytes = sha256.finalize(); + let uuid = + Uuid::from_slice(&hash_bytes.as_slice()[..16]).expect("hash is correct size for uuid"); + EditVersion(uuid) + } + + pub fn hash(&self) -> String { + hex::encode(self.0.into_bytes()) + } +} + +impl Default for EditVersion { + fn default() -> Self { + EditVersion::new("") + } +} + +#[derive(Deserialize, Serialize, Debug)] +pub struct DeleteConflictForm { + pub conflict_id: ConflictId, +} + +#[derive(Clone, Debug, Serialize, Deserialize, PartialEq)] +pub struct ApiConflict { + pub id: ConflictId, + pub hash: EditVersion, + pub three_way_merge: String, + pub summary: String, + pub article: DbArticle, + pub previous_version_id: EditVersion, + pub published: DateTime, +} + +#[test] +fn test_edit_versions() { + let default = EditVersion::default(); + assert_eq!("e3b0c44298fc1c149afbf4c8996fb924", default.hash()); + + let version = EditVersion::new("test"); + assert_eq!("9f86d081884c7d659a2feaa0c55ad015", version.hash()); +} diff --git a/src/common/instance.rs b/src/common/instance.rs new file mode 100644 index 0000000..2690708 --- /dev/null +++ b/src/common/instance.rs @@ -0,0 +1,93 @@ +use super::{ + newtypes::InstanceId, + user::{DbPerson, LocalUserView}, +}; +use chrono::{DateTime, Utc}; +use serde::{Deserialize, Serialize}; +use smart_default::SmartDefault; +use url::Url; +#[cfg(feature = "ssr")] +use { + crate::backend::{ + database::schema::instance, + federation::objects::articles_collection::DbArticleCollection, + federation::objects::instance_collection::DbInstanceCollection, + }, + activitypub_federation::fetch::{collection_id::CollectionId, object_id::ObjectId}, + diesel::{Identifiable, Queryable, Selectable}, + doku::Document, +}; + +#[derive(Clone, Debug, Serialize, Deserialize, PartialEq)] +#[cfg_attr(feature = "ssr", derive(Queryable, Selectable, Identifiable))] +#[cfg_attr(feature = "ssr", diesel(table_name = instance, check_for_backend(diesel::pg::Pg)))] +pub struct DbInstance { + pub id: InstanceId, + pub domain: String, + #[cfg(feature = "ssr")] + pub ap_id: ObjectId, + #[cfg(not(feature = "ssr"))] + pub ap_id: String, + pub description: Option, + #[cfg(feature = "ssr")] + pub articles_url: Option>, + #[cfg(not(feature = "ssr"))] + pub articles_url: String, + pub inbox_url: String, + #[serde(skip)] + pub public_key: String, + #[serde(skip)] + pub private_key: Option, + pub last_refreshed_at: DateTime, + pub local: bool, + #[cfg(feature = "ssr")] + pub instances_url: Option>, +} + +impl DbInstance { + pub fn inbox_url(&self) -> Url { + Url::parse(&self.inbox_url).expect("can parse inbox url") + } +} + +#[derive(Clone, Debug, Serialize, Deserialize, PartialEq)] +#[cfg_attr(feature = "ssr", derive(Queryable))] +#[cfg_attr(feature = "ssr", diesel(table_name = article, check_for_backend(diesel::pg::Pg)))] +pub struct InstanceView { + pub instance: DbInstance, + pub followers: Vec, +} + +#[derive(Clone, Debug, Serialize, Deserialize, PartialEq, Eq, SmartDefault)] +#[serde(default)] +#[serde(deny_unknown_fields)] +#[cfg_attr(feature = "ssr", derive(Queryable, Document))] +#[cfg_attr(feature = "ssr", diesel(check_for_backend(diesel::pg::Pg)))] +pub struct Options { + /// Whether users can create new accounts + #[default = true] + #[cfg_attr(feature = "ssr", doku(example = "true"))] + pub registration_open: bool, + /// Whether admins need to approve new articles + #[default = false] + #[cfg_attr(feature = "ssr", doku(example = "false"))] + pub article_approval: bool, +} + +#[derive(Clone, Debug, Serialize, Deserialize, PartialEq, Default)] +#[cfg_attr(feature = "ssr", derive(Queryable))] +#[cfg_attr(feature = "ssr", diesel(check_for_backend(diesel::pg::Pg)))] +pub struct SiteView { + pub my_profile: Option, + pub config: Options, +} + +#[derive(Deserialize, Serialize, Debug)] +pub struct GetInstance { + pub id: Option, +} + +#[derive(Deserialize, Serialize, Debug)] +pub struct FollowInstance { + pub id: InstanceId, +} diff --git a/src/common/mod.rs b/src/common/mod.rs index 406d09d..a855285 100644 --- a/src/common/mod.rs +++ b/src/common/mod.rs @@ -1,25 +1,14 @@ +pub mod article; +pub mod instance; pub mod newtypes; +pub mod user; pub mod utils; pub mod validation; +use article::{ApiConflict, DbArticle}; use chrono::{DateTime, Utc}; -use newtypes::{ArticleId, ConflictId, EditId, InstanceId, PersonId}; use serde::{Deserialize, Serialize}; -use sha2::{Digest, Sha256}; -use smart_default::SmartDefault; use url::Url; -use uuid::Uuid; -#[cfg(feature = "ssr")] -use { - crate::backend::{ - database::schema::{article, edit, instance, local_user, person}, - federation::objects::articles_collection::DbArticleCollection, - federation::objects::instance_collection::DbInstanceCollection, - }, - activitypub_federation::fetch::{collection_id::CollectionId, object_id::ObjectId}, - diesel::{Identifiable, Queryable, Selectable}, - doku::Document, -}; pub const MAIN_PAGE_NAME: &str = "Main_Page"; @@ -28,231 +17,6 @@ pub static AUTH_COOKIE: &str = "auth"; #[derive(Clone, Debug)] pub struct Auth(pub Option); -/// Should be an enum Title/Id but fails due to https://github.com/nox/serde_urlencoded/issues/66 -#[derive(Deserialize, Serialize, Clone, Debug, Default)] -pub struct GetArticleForm { - pub title: Option, - pub domain: Option, - pub id: Option, -} - -#[derive(Deserialize, Serialize, Clone, Default, Debug)] -pub struct ListArticlesForm { - pub only_local: Option, - pub instance_id: Option, -} - -#[derive(Clone, Debug, Serialize, Deserialize, PartialEq)] -#[cfg_attr(feature = "ssr", derive(Queryable))] -#[cfg_attr(feature = "ssr", diesel(table_name = article, check_for_backend(diesel::pg::Pg)))] -pub struct ArticleView { - pub article: DbArticle, - pub instance: DbInstance, - pub latest_version: EditVersion, -} - -#[derive(Clone, Debug, Serialize, Deserialize, PartialEq)] -#[cfg_attr(feature = "ssr", derive(Queryable, Selectable, Identifiable))] -#[cfg_attr(feature = "ssr", diesel(table_name = article, check_for_backend(diesel::pg::Pg), belongs_to(DbInstance, foreign_key = instance_id)))] -pub struct DbArticle { - pub id: ArticleId, - pub title: String, - pub text: String, - #[cfg(feature = "ssr")] - pub ap_id: ObjectId, - #[cfg(not(feature = "ssr"))] - pub ap_id: String, - pub instance_id: InstanceId, - pub local: bool, - pub protected: bool, - pub approved: bool, - pub published: DateTime, -} - -/// Represents a single change to the article. -#[derive(Clone, Debug, Serialize, Deserialize, PartialEq)] -#[cfg_attr(feature = "ssr", derive(Queryable, Selectable))] -#[cfg_attr(feature = "ssr", diesel(table_name = edit, check_for_backend(diesel::pg::Pg)))] -pub struct DbEdit { - // TODO: we could use hash as primary key, but that gives errors on forking because - // the same edit is used for multiple articles - pub id: EditId, - #[serde(skip)] - pub creator_id: PersonId, - /// UUID built from sha224 hash of diff - pub hash: EditVersion, - #[cfg(feature = "ssr")] - pub ap_id: ObjectId, - #[cfg(not(feature = "ssr"))] - pub ap_id: String, - pub diff: String, - pub summary: String, - pub article_id: ArticleId, - /// First edit of an article always has `EditVersion::default()` here - pub previous_version_id: EditVersion, - pub published: DateTime, -} - -#[derive(Deserialize, Serialize, Clone, Debug, Default)] -pub struct GetEditList { - pub article_id: Option, - pub person_id: Option, -} - -#[derive(Clone, Debug, Serialize, Deserialize, PartialEq)] -#[cfg_attr(feature = "ssr", derive(Queryable))] -#[cfg_attr(feature = "ssr", diesel(check_for_backend(diesel::pg::Pg)))] -pub struct EditView { - pub edit: DbEdit, - pub article: DbArticle, - pub creator: DbPerson, -} - -/// The version hash of a specific edit. Generated by taking an SHA256 hash of the diff -/// and using the first 16 bytes so that it fits into UUID. -#[derive(Clone, Debug, Serialize, Deserialize, PartialEq, Eq, Hash)] -#[cfg_attr(feature = "ssr", derive(diesel_derive_newtype::DieselNewType))] -pub struct EditVersion(pub(crate) Uuid); - -impl EditVersion { - pub fn new(diff: &str) -> Self { - let mut sha256 = Sha256::new(); - sha256.update(diff); - let hash_bytes = sha256.finalize(); - let uuid = - Uuid::from_slice(&hash_bytes.as_slice()[..16]).expect("hash is correct size for uuid"); - EditVersion(uuid) - } - - pub fn hash(&self) -> String { - hex::encode(self.0.into_bytes()) - } -} - -impl Default for EditVersion { - fn default() -> Self { - EditVersion::new("") - } -} - -#[derive(Deserialize, Serialize, Clone, Debug)] -pub struct RegisterUserForm { - pub username: String, - pub password: String, -} - -#[derive(Deserialize, Serialize, Debug)] -pub struct LoginUserForm { - pub username: String, - pub password: String, -} - -#[derive(Clone, Debug, Serialize, Deserialize, PartialEq)] -#[cfg_attr(feature = "ssr", derive(Queryable))] -#[cfg_attr(feature = "ssr", diesel(check_for_backend(diesel::pg::Pg)))] -pub struct LocalUserView { - pub person: DbPerson, - pub local_user: DbLocalUser, - pub following: Vec, -} - -/// A user with account registered on local instance. -#[derive(Clone, Debug, Serialize, Deserialize, PartialEq)] -#[cfg_attr(feature = "ssr", derive(Queryable, Selectable, Identifiable))] -#[cfg_attr(feature = "ssr", diesel(table_name = local_user, check_for_backend(diesel::pg::Pg)))] -pub struct DbLocalUser { - pub id: InstanceId, - #[serde(skip)] - pub password_encrypted: String, - pub person_id: PersonId, - pub admin: bool, -} - -/// Federation related data from a local or remote user. -#[derive(Clone, Debug, Serialize, Deserialize, PartialEq)] -#[cfg_attr(feature = "ssr", derive(Queryable, Selectable, Identifiable))] -#[cfg_attr(feature = "ssr", diesel(table_name = person, check_for_backend(diesel::pg::Pg)))] -pub struct DbPerson { - pub id: PersonId, - pub username: String, - #[cfg(feature = "ssr")] - pub ap_id: ObjectId, - #[cfg(not(feature = "ssr"))] - pub ap_id: String, - pub inbox_url: String, - #[serde(skip)] - pub public_key: String, - #[serde(skip)] - pub private_key: Option, - #[serde(skip)] - pub last_refreshed_at: DateTime, - pub local: bool, - pub display_name: Option, - pub bio: Option, -} - -impl DbPerson { - pub fn inbox_url(&self) -> Url { - Url::parse(&self.inbox_url).expect("can parse inbox url") - } -} - -#[derive(Deserialize, Serialize, Debug)] -pub struct CreateArticleForm { - pub title: String, - pub text: String, - pub summary: String, -} - -#[derive(Deserialize, Serialize, Debug)] -pub struct EditArticleForm { - /// Id of the article to edit - pub article_id: ArticleId, - /// Full, new text of the article. A diff against `previous_version` is generated on the backend - /// side to handle conflicts. - pub new_text: String, - /// What was changed - pub summary: String, - /// The version that this edit is based on, ie [DbArticle.latest_version] or - /// [ApiConflict.previous_version] - pub previous_version_id: EditVersion, - /// If you are resolving a conflict, pass the id to delete conflict from the database - pub resolve_conflict_id: Option, -} - -#[derive(Deserialize, Serialize, Debug)] -pub struct ProtectArticleForm { - pub article_id: ArticleId, - pub protected: bool, -} - -#[derive(Deserialize, Serialize, Debug)] -pub struct ForkArticleForm { - pub article_id: ArticleId, - pub new_title: String, -} - -#[derive(Deserialize, Serialize, Debug)] -pub struct ApproveArticleForm { - pub article_id: ArticleId, - pub approve: bool, -} - -#[derive(Deserialize, Serialize, Debug)] -pub struct DeleteConflictForm { - pub conflict_id: ConflictId, -} - -#[derive(Deserialize, Serialize, Debug)] -pub struct GetInstance { - pub id: Option, -} - -#[derive(Deserialize, Serialize, Debug)] -pub struct FollowInstance { - pub id: InstanceId, -} - #[derive(Deserialize, Serialize, Debug)] pub struct SuccessResponse { success: bool, @@ -264,27 +28,11 @@ impl Default for SuccessResponse { } } -#[derive(Deserialize, Serialize, Clone, Debug)] -pub struct SearchArticleForm { - pub query: String, -} - #[derive(Deserialize, Serialize, Debug)] pub struct ResolveObject { pub id: Url, } -#[derive(Clone, Debug, Serialize, Deserialize, PartialEq)] -pub struct ApiConflict { - pub id: ConflictId, - pub hash: EditVersion, - pub three_way_merge: String, - pub summary: String, - pub article: DbArticle, - pub previous_version_id: EditVersion, - pub published: DateTime, -} - #[derive(Clone, Debug, Serialize, Deserialize)] pub enum Notification { EditConflict(ApiConflict), @@ -299,89 +47,3 @@ impl Notification { } } } - -#[derive(Clone, Debug, Serialize, Deserialize, PartialEq)] -#[cfg_attr(feature = "ssr", derive(Queryable, Selectable, Identifiable))] -#[cfg_attr(feature = "ssr", diesel(table_name = instance, check_for_backend(diesel::pg::Pg)))] -pub struct DbInstance { - pub id: InstanceId, - pub domain: String, - #[cfg(feature = "ssr")] - pub ap_id: ObjectId, - #[cfg(not(feature = "ssr"))] - pub ap_id: String, - pub description: Option, - #[cfg(feature = "ssr")] - pub articles_url: Option>, - #[cfg(not(feature = "ssr"))] - pub articles_url: String, - pub inbox_url: String, - #[serde(skip)] - pub public_key: String, - #[serde(skip)] - pub private_key: Option, - pub last_refreshed_at: DateTime, - pub local: bool, - #[cfg(feature = "ssr")] - pub instances_url: Option>, -} - -impl DbInstance { - pub fn inbox_url(&self) -> Url { - Url::parse(&self.inbox_url).expect("can parse inbox url") - } -} - -#[derive(Clone, Debug, Serialize, Deserialize, PartialEq)] -#[cfg_attr(feature = "ssr", derive(Queryable))] -#[cfg_attr(feature = "ssr", diesel(table_name = article, check_for_backend(diesel::pg::Pg)))] -pub struct InstanceView { - pub instance: DbInstance, - pub followers: Vec, -} - -#[derive(Deserialize, Serialize, Clone, Debug)] -pub struct GetUserForm { - pub name: String, - pub domain: Option, -} - -#[derive(Deserialize, Serialize, Clone, Debug)] -pub struct UpdateUserForm { - pub person_id: PersonId, - pub display_name: Option, - pub bio: Option, -} - -#[derive(Clone, Debug, Serialize, Deserialize, PartialEq, Eq, SmartDefault)] -#[serde(default)] -#[serde(deny_unknown_fields)] -#[cfg_attr(feature = "ssr", derive(Queryable, Document))] -#[cfg_attr(feature = "ssr", diesel(check_for_backend(diesel::pg::Pg)))] -pub struct Options { - /// Whether users can create new accounts - #[default = true] - #[cfg_attr(feature = "ssr", doku(example = "true"))] - pub registration_open: bool, - /// Whether admins need to approve new articles - #[default = false] - #[cfg_attr(feature = "ssr", doku(example = "false"))] - pub article_approval: bool, -} - -#[derive(Clone, Debug, Serialize, Deserialize, PartialEq, Default)] -#[cfg_attr(feature = "ssr", derive(Queryable))] -#[cfg_attr(feature = "ssr", diesel(check_for_backend(diesel::pg::Pg)))] -pub struct SiteView { - pub my_profile: Option, - pub config: Options, -} - -#[test] -fn test_edit_versions() { - let default = EditVersion::default(); - assert_eq!("e3b0c44298fc1c149afbf4c8996fb924", default.hash()); - - let version = EditVersion::new("test"); - assert_eq!("9f86d081884c7d659a2feaa0c55ad015", version.hash()); -} diff --git a/src/common/user.rs b/src/common/user.rs new file mode 100644 index 0000000..18a6284 --- /dev/null +++ b/src/common/user.rs @@ -0,0 +1,88 @@ +use super::{ + instance::DbInstance, + newtypes::{InstanceId, PersonId}, +}; +use chrono::{DateTime, Utc}; +use serde::{Deserialize, Serialize}; +use url::Url; +#[cfg(feature = "ssr")] +use { + crate::backend::database::schema::{local_user, person}, + activitypub_federation::fetch::object_id::ObjectId, + diesel::{Identifiable, Queryable, Selectable}, +}; + +#[derive(Deserialize, Serialize, Clone, Debug)] +pub struct RegisterUserForm { + pub username: String, + pub password: String, +} + +#[derive(Deserialize, Serialize, Debug)] +pub struct LoginUserForm { + pub username: String, + pub password: String, +} + +#[derive(Clone, Debug, Serialize, Deserialize, PartialEq)] +#[cfg_attr(feature = "ssr", derive(Queryable))] +#[cfg_attr(feature = "ssr", diesel(check_for_backend(diesel::pg::Pg)))] +pub struct LocalUserView { + pub person: DbPerson, + pub local_user: DbLocalUser, + pub following: Vec, +} + +/// A user with account registered on local instance. +#[derive(Clone, Debug, Serialize, Deserialize, PartialEq)] +#[cfg_attr(feature = "ssr", derive(Queryable, Selectable, Identifiable))] +#[cfg_attr(feature = "ssr", diesel(table_name = local_user, check_for_backend(diesel::pg::Pg)))] +pub struct DbLocalUser { + pub id: InstanceId, + #[serde(skip)] + pub password_encrypted: String, + pub person_id: PersonId, + pub admin: bool, +} + +/// Federation related data from a local or remote user. +#[derive(Clone, Debug, Serialize, Deserialize, PartialEq)] +#[cfg_attr(feature = "ssr", derive(Queryable, Selectable, Identifiable))] +#[cfg_attr(feature = "ssr", diesel(table_name = person, check_for_backend(diesel::pg::Pg)))] +pub struct DbPerson { + pub id: PersonId, + pub username: String, + #[cfg(feature = "ssr")] + pub ap_id: ObjectId, + #[cfg(not(feature = "ssr"))] + pub ap_id: String, + pub inbox_url: String, + #[serde(skip)] + pub public_key: String, + #[serde(skip)] + pub private_key: Option, + #[serde(skip)] + pub last_refreshed_at: DateTime, + pub local: bool, + pub display_name: Option, + pub bio: Option, +} + +impl DbPerson { + pub fn inbox_url(&self) -> Url { + Url::parse(&self.inbox_url).expect("can parse inbox url") + } +} + +#[derive(Deserialize, Serialize, Clone, Debug)] +pub struct GetUserForm { + pub name: String, + pub domain: Option, +} + +#[derive(Deserialize, Serialize, Clone, Debug)] +pub struct UpdateUserForm { + pub person_id: PersonId, + pub display_name: Option, + pub bio: Option, +} diff --git a/src/common/validation.rs b/src/common/validation.rs index 5413a7b..dcadf0a 100644 --- a/src/common/validation.rs +++ b/src/common/validation.rs @@ -1,4 +1,4 @@ -use crate::common::DbArticle; +use crate::common::article::DbArticle; use leptos::server_fn::error::ServerFnErrorErr; pub fn can_edit_article(article: &DbArticle, is_admin: bool) -> Result<(), ServerFnErrorErr> { diff --git a/src/frontend/api.rs b/src/frontend/api.rs index 1d647e2..7986188 100644 --- a/src/frontend/api.rs +++ b/src/frontend/api.rs @@ -1,12 +1,14 @@ use crate::common::{ - newtypes::{ArticleId, ConflictId}, + article::*, + instance::*, + newtypes::{ArticleId, ConflictId, PersonId}, + user::*, utils::http_protocol_str, *, }; use http::{Method, StatusCode}; use leptos::{prelude::ServerFnError, server_fn::error::NoCustomError}; use log::error; -use newtypes::PersonId; use serde::{Deserialize, Serialize}; use std::{fmt::Debug, sync::LazyLock}; use url::Url; diff --git a/src/frontend/app.rs b/src/frontend/app.rs index 8e6527f..4af89eb 100644 --- a/src/frontend/app.rs +++ b/src/frontend/app.rs @@ -1,5 +1,5 @@ use crate::{ - common::SiteView, + common::instance::SiteView, frontend::{ api::CLIENT, components::{nav::Nav, protected_route::IbisProtectedRoute}, diff --git a/src/frontend/components/article_nav.rs b/src/frontend/components/article_nav.rs index b55011a..ca72c42 100644 --- a/src/frontend/components/article_nav.rs +++ b/src/frontend/components/article_nav.rs @@ -1,5 +1,5 @@ use crate::{ - common::{validation::can_edit_article, ArticleView}, + common::{article::ArticleView, validation::can_edit_article}, frontend::{ app::{is_admin, is_logged_in}, article_path, diff --git a/src/frontend/components/edit_list.rs b/src/frontend/components/edit_list.rs index 8b08248..6fcec2d 100644 --- a/src/frontend/components/edit_list.rs +++ b/src/frontend/components/edit_list.rs @@ -1,5 +1,5 @@ use crate::{ - common::{utils::extract_domain, EditView}, + common::{article::EditView, utils::extract_domain}, frontend::{article_link, render_date_time, user_link}, }; use leptos::{either::Either, prelude::*}; diff --git a/src/frontend/components/instance_follow_button.rs b/src/frontend/components/instance_follow_button.rs index fb04b56..0dd5c45 100644 --- a/src/frontend/components/instance_follow_button.rs +++ b/src/frontend/components/instance_follow_button.rs @@ -1,5 +1,8 @@ use crate::{ - common::{newtypes::InstanceId, DbInstance, FollowInstance}, + common::{ + instance::{DbInstance, FollowInstance}, + newtypes::InstanceId, + }, frontend::{ api::CLIENT, app::{site, DefaultResource}, diff --git a/src/frontend/mod.rs b/src/frontend/mod.rs index 1bc34ed..7ccc32d 100644 --- a/src/frontend/mod.rs +++ b/src/frontend/mod.rs @@ -1,4 +1,4 @@ -use crate::common::{utils::extract_domain, DbArticle, DbPerson}; +use crate::common::{article::DbArticle, user::DbPerson, utils::extract_domain}; use chrono::{DateTime, Duration, Local, Utc}; use codee::string::FromToStringCodec; use leptos::prelude::*; diff --git a/src/frontend/pages/article/actions.rs b/src/frontend/pages/article/actions.rs index 1a0e101..58afc2e 100644 --- a/src/frontend/pages/article/actions.rs +++ b/src/frontend/pages/article/actions.rs @@ -1,5 +1,8 @@ use crate::{ - common::{newtypes::ArticleId, ForkArticleForm, ProtectArticleForm}, + common::{ + article::{ForkArticleForm, ProtectArticleForm}, + newtypes::ArticleId, + }, frontend::{ api::CLIENT, app::is_admin, diff --git a/src/frontend/pages/article/create.rs b/src/frontend/pages/article/create.rs index 5f21085..3e59e9b 100644 --- a/src/frontend/pages/article/create.rs +++ b/src/frontend/pages/article/create.rs @@ -1,5 +1,5 @@ use crate::{ - common::CreateArticleForm, + common::article::CreateArticleForm, frontend::{ api::CLIENT, app::{is_admin, site, DefaultResource}, diff --git a/src/frontend/pages/article/edit.rs b/src/frontend/pages/article/edit.rs index 4d82d75..43854df 100644 --- a/src/frontend/pages/article/edit.rs +++ b/src/frontend/pages/article/edit.rs @@ -1,9 +1,7 @@ use crate::{ common::{ + article::{ApiConflict, ArticleView, EditArticleForm}, newtypes::ConflictId, - ApiConflict, - ArticleView, - EditArticleForm, Notification, MAIN_PAGE_NAME, }, diff --git a/src/frontend/pages/article/list.rs b/src/frontend/pages/article/list.rs index a806495..bf60c05 100644 --- a/src/frontend/pages/article/list.rs +++ b/src/frontend/pages/article/list.rs @@ -1,5 +1,5 @@ use crate::{ - common::ListArticlesForm, + common::article::ListArticlesForm, frontend::{ api::CLIENT, app::DefaultResource, diff --git a/src/frontend/pages/instance/details.rs b/src/frontend/pages/instance/details.rs index 5cd98c0..4d2523c 100644 --- a/src/frontend/pages/instance/details.rs +++ b/src/frontend/pages/instance/details.rs @@ -1,5 +1,5 @@ use crate::{ - common::{utils::http_protocol_str, DbInstance, ListArticlesForm}, + common::{article::ListArticlesForm, instance::DbInstance, utils::http_protocol_str}, frontend::{ api::CLIENT, article_path, diff --git a/src/frontend/pages/login.rs b/src/frontend/pages/login.rs index f251b49..2fa06c0 100644 --- a/src/frontend/pages/login.rs +++ b/src/frontend/pages/login.rs @@ -1,5 +1,5 @@ use crate::{ - common::LoginUserForm, + common::user::LoginUserForm, frontend::{api::CLIENT, app::site, components::credentials::*}, }; use leptos::prelude::*; diff --git a/src/frontend/pages/mod.rs b/src/frontend/pages/mod.rs index 1e99b91..ff30315 100644 --- a/src/frontend/pages/mod.rs +++ b/src/frontend/pages/mod.rs @@ -1,5 +1,8 @@ use crate::{ - common::{ArticleView, EditView, GetArticleForm, MAIN_PAGE_NAME}, + common::{ + article::{ArticleView, EditView, GetArticleForm}, + MAIN_PAGE_NAME, + }, frontend::api::CLIENT, }; use leptos::prelude::*; diff --git a/src/frontend/pages/register.rs b/src/frontend/pages/register.rs index ee4f917..3eee667 100644 --- a/src/frontend/pages/register.rs +++ b/src/frontend/pages/register.rs @@ -1,5 +1,5 @@ use crate::{ - common::RegisterUserForm, + common::user::RegisterUserForm, frontend::{api::CLIENT, app::site, components::credentials::*}, }; use leptos::prelude::*; diff --git a/src/frontend/pages/search.rs b/src/frontend/pages/search.rs index 4dd54f7..c8aff95 100644 --- a/src/frontend/pages/search.rs +++ b/src/frontend/pages/search.rs @@ -1,5 +1,8 @@ use crate::{ - common::{DbArticle, DbInstance, SearchArticleForm}, + common::{ + article::{DbArticle, SearchArticleForm}, + instance::DbInstance, + }, frontend::{api::CLIENT, article_path, article_title}, }; use leptos::prelude::*; diff --git a/src/frontend/pages/user_edit_profile.rs b/src/frontend/pages/user_edit_profile.rs index e1133f2..76f0b03 100644 --- a/src/frontend/pages/user_edit_profile.rs +++ b/src/frontend/pages/user_edit_profile.rs @@ -1,5 +1,5 @@ use crate::{ - common::UpdateUserForm, + common::user::UpdateUserForm, frontend::{ api::CLIENT, app::{site, DefaultResource}, diff --git a/src/frontend/pages/user_profile.rs b/src/frontend/pages/user_profile.rs index 425da99..3e7159c 100644 --- a/src/frontend/pages/user_profile.rs +++ b/src/frontend/pages/user_profile.rs @@ -1,5 +1,5 @@ use crate::{ - common::GetUserForm, + common::user::GetUserForm, frontend::{ api::CLIENT, components::edit_list::EditList, diff --git a/tests/common.rs b/tests/common.rs index 1604677..93e73b5 100644 --- a/tests/common.rs +++ b/tests/common.rs @@ -6,7 +6,7 @@ use ibis::{ config::{IbisConfig, IbisConfigDatabase, IbisConfigFederation}, start, }, - common::{Options, RegisterUserForm}, + common::{instance::Options, user::RegisterUserForm}, frontend::api::ApiClient, }; use reqwest::ClientBuilder; diff --git a/tests/test.rs b/tests/test.rs index af873cc..71557a1 100644 --- a/tests/test.rs +++ b/tests/test.rs @@ -5,19 +5,19 @@ mod common; use crate::common::{TestData, TEST_ARTICLE_DEFAULT_TEXT}; use anyhow::Result; use ibis::common::{ + article::{ + ArticleView, + CreateArticleForm, + EditArticleForm, + ForkArticleForm, + GetArticleForm, + ListArticlesForm, + ProtectArticleForm, + SearchArticleForm, + }, + user::{GetUserForm, LoginUserForm, RegisterUserForm}, utils::extract_domain, - ArticleView, - CreateArticleForm, - EditArticleForm, - ForkArticleForm, - GetArticleForm, - GetUserForm, - ListArticlesForm, - LoginUserForm, Notification, - ProtectArticleForm, - RegisterUserForm, - SearchArticleForm, }; use pretty_assertions::{assert_eq, assert_ne}; use retry_future::{LinearRetryStrategy, RetryFuture, RetryPolicy};