implement marks
This commit is contained in:
parent
352c118fb7
commit
43c678a9a4
10 changed files with 246 additions and 11 deletions
|
|
@ -1,4 +1,4 @@
|
||||||
use crate::types::{entity, game};
|
use crate::types::game;
|
||||||
|
|
||||||
use eva::{array, data, str};
|
use eva::{array, data, str};
|
||||||
|
|
||||||
|
|
@ -8,18 +8,34 @@ pub struct TextEntry<I> {
|
||||||
pub text: str::CompactString,
|
pub text: str::CompactString,
|
||||||
}
|
}
|
||||||
|
|
||||||
pub mod add {
|
pub mod add_tag {
|
||||||
use super::*;
|
use super::*;
|
||||||
|
|
||||||
#[data]
|
#[data]
|
||||||
pub enum Args {
|
pub struct Args {
|
||||||
Tag(str::CompactString),
|
pub tag: str::CompactString,
|
||||||
Badge(str::CompactString),
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#[data]
|
#[data]
|
||||||
pub struct Ok {
|
pub struct Ok {
|
||||||
pub id: entity::Id,
|
pub id: game::Tag,
|
||||||
|
}
|
||||||
|
|
||||||
|
#[data(error, display("_"))]
|
||||||
|
pub enum Err {}
|
||||||
|
}
|
||||||
|
|
||||||
|
pub mod add_badge {
|
||||||
|
use super::*;
|
||||||
|
|
||||||
|
#[data]
|
||||||
|
pub struct Args {
|
||||||
|
pub badge: str::CompactString,
|
||||||
|
}
|
||||||
|
|
||||||
|
#[data]
|
||||||
|
pub struct Ok {
|
||||||
|
pub id: game::Badge,
|
||||||
}
|
}
|
||||||
|
|
||||||
#[data(error, display("_"))]
|
#[data(error, display("_"))]
|
||||||
|
|
@ -48,7 +64,7 @@ pub mod list_badges {
|
||||||
|
|
||||||
#[data]
|
#[data]
|
||||||
pub struct Args {
|
pub struct Args {
|
||||||
pub query: str::CompactString,
|
pub query: Option<str::CompactString>,
|
||||||
}
|
}
|
||||||
|
|
||||||
#[data]
|
#[data]
|
||||||
|
|
@ -65,7 +81,7 @@ pub mod list_tags {
|
||||||
|
|
||||||
#[data]
|
#[data]
|
||||||
pub struct Args {
|
pub struct Args {
|
||||||
pub query: str::CompactString,
|
pub query: Option<str::CompactString>,
|
||||||
}
|
}
|
||||||
|
|
||||||
#[data]
|
#[data]
|
||||||
|
|
|
||||||
|
|
@ -29,4 +29,8 @@ impl<S: IsSession> Session<S> {project!{
|
||||||
fn messages() -> messages::Messages;
|
fn messages() -> messages::Messages;
|
||||||
|
|
||||||
fn authz() -> authz::Authentication;
|
fn authz() -> authz::Authentication;
|
||||||
|
|
||||||
|
fn tags() -> marks::Tags;
|
||||||
|
fn genres() -> marks::Genres;
|
||||||
|
fn badges() -> marks::Badges;
|
||||||
}}
|
}}
|
||||||
|
|
|
||||||
27
core/src/service/marks.rs
Normal file
27
core/src/service/marks.rs
Normal file
|
|
@ -0,0 +1,27 @@
|
||||||
|
use eva::auto_impl;
|
||||||
|
|
||||||
|
use crate::{
|
||||||
|
requests::marks::{add_badge, add_tag, list_badges, list_genres, list_tags},
|
||||||
|
service::CallStep,
|
||||||
|
};
|
||||||
|
|
||||||
|
#[auto_impl(&mut)]
|
||||||
|
pub trait Genres: Send + Sync {
|
||||||
|
fn list(
|
||||||
|
&mut self,
|
||||||
|
) -> impl CallStep<list_genres::Args, Ok = list_genres::Ok, Err = list_genres::Err>;
|
||||||
|
}
|
||||||
|
|
||||||
|
#[auto_impl(&mut)]
|
||||||
|
pub trait Badges: Send + Sync {
|
||||||
|
fn list(
|
||||||
|
&mut self,
|
||||||
|
) -> impl CallStep<list_badges::Args, Ok = list_badges::Ok, Err = list_badges::Err>;
|
||||||
|
fn add(&mut self) -> impl CallStep<add_badge::Args, Ok = add_badge::Ok, Err = add_badge::Err>;
|
||||||
|
}
|
||||||
|
|
||||||
|
#[auto_impl(&mut)]
|
||||||
|
pub trait Tags: Send + Sync {
|
||||||
|
fn list(&mut self) -> impl CallStep<list_tags::Args, Ok = list_tags::Ok, Err = list_tags::Err>;
|
||||||
|
fn add(&mut self) -> impl CallStep<add_tag::Args, Ok = add_tag::Ok, Err = add_tag::Err>;
|
||||||
|
}
|
||||||
|
|
@ -6,6 +6,8 @@ pub use self::api_looks::Session;
|
||||||
|
|
||||||
mod api_looks;
|
mod api_looks;
|
||||||
|
|
||||||
|
pub mod marks;
|
||||||
|
|
||||||
pub mod boards;
|
pub mod boards;
|
||||||
pub mod messages;
|
pub mod messages;
|
||||||
pub mod threads;
|
pub mod threads;
|
||||||
|
|
@ -33,6 +35,9 @@ trait_set! {
|
||||||
+ games::Games
|
+ games::Games
|
||||||
+ users::Users
|
+ users::Users
|
||||||
+ authz::Authentication
|
+ authz::Authentication
|
||||||
|
+ marks::Tags
|
||||||
|
+ marks::Genres
|
||||||
|
+ marks::Badges
|
||||||
;
|
;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -4,7 +4,7 @@ version = "0.1.0"
|
||||||
edition = "2024"
|
edition = "2024"
|
||||||
|
|
||||||
[features]
|
[features]
|
||||||
default = ["server", "client"]
|
default = []
|
||||||
client = ["dep:reqwest"]
|
client = ["dep:reqwest"]
|
||||||
server = [
|
server = [
|
||||||
"dep:axum",
|
"dep:axum",
|
||||||
|
|
|
||||||
45
http/src/client/marks.rs
Normal file
45
http/src/client/marks.rs
Normal file
|
|
@ -0,0 +1,45 @@
|
||||||
|
use super::*;
|
||||||
|
|
||||||
|
use crate::requests::marks as requests;
|
||||||
|
|
||||||
|
use viendesu_core::requests::marks::{add_badge, add_tag, list_badges, list_genres, list_tags};
|
||||||
|
|
||||||
|
impl Genres for HttpClient {
|
||||||
|
fn list(
|
||||||
|
&mut self,
|
||||||
|
) -> impl CallStep<list_genres::Args, Ok = list_genres::Ok, Err = list_genres::Err> {
|
||||||
|
self.do_call(Method::GET, |list_genres::Args {}| {
|
||||||
|
("/genres".into(), requests::ListGenres {})
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl Tags for HttpClient {
|
||||||
|
fn list(&mut self) -> impl CallStep<list_tags::Args, Ok = list_tags::Ok, Err = list_tags::Err> {
|
||||||
|
self.do_call(Method::GET, |list_tags::Args { query }| {
|
||||||
|
("/tags".into(), requests::ListTags { query })
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
fn add(&mut self) -> impl CallStep<add_tag::Args, Ok = add_tag::Ok, Err = add_tag::Err> {
|
||||||
|
self.do_call(Method::POST, |add_tag::Args { tag }| {
|
||||||
|
("/tags".into(), requests::AddTag { text: tag })
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl Badges for HttpClient {
|
||||||
|
fn list(
|
||||||
|
&mut self,
|
||||||
|
) -> impl CallStep<list_badges::Args, Ok = list_badges::Ok, Err = list_badges::Err> {
|
||||||
|
self.do_call(Method::GET, |list_badges::Args { query }| {
|
||||||
|
("/badges".into(), requests::ListBadges { query })
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
fn add(&mut self) -> impl CallStep<add_badge::Args, Ok = add_badge::Ok, Err = add_badge::Err> {
|
||||||
|
self.do_call(Method::POST, |add_badge::Args { badge }| {
|
||||||
|
("/badges".into(), requests::AddBadge { text: badge })
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -10,8 +10,15 @@ use viendesu_core::{
|
||||||
errors::{self, Aux},
|
errors::{self, Aux},
|
||||||
requests::Response,
|
requests::Response,
|
||||||
service::{
|
service::{
|
||||||
CallStep, Session, SessionMaker, authors::Authors, authz::Authentication, boards::Boards,
|
CallStep, Session, SessionMaker,
|
||||||
games::Games, messages::Messages, threads::Threads, users::Users,
|
authors::Authors,
|
||||||
|
authz::Authentication,
|
||||||
|
boards::Boards,
|
||||||
|
games::Games,
|
||||||
|
marks::{Badges, Genres, Tags},
|
||||||
|
messages::Messages,
|
||||||
|
threads::Threads,
|
||||||
|
users::Users,
|
||||||
},
|
},
|
||||||
types::session,
|
types::session,
|
||||||
};
|
};
|
||||||
|
|
@ -28,6 +35,8 @@ mod authors;
|
||||||
mod games;
|
mod games;
|
||||||
mod users;
|
mod users;
|
||||||
|
|
||||||
|
mod marks;
|
||||||
|
|
||||||
struct DoRequest<'c, P> {
|
struct DoRequest<'c, P> {
|
||||||
client: &'c mut HttpClient,
|
client: &'c mut HttpClient,
|
||||||
method: Method,
|
method: Method,
|
||||||
|
|
|
||||||
48
http/src/requests/marks.rs
Normal file
48
http/src/requests/marks.rs
Normal file
|
|
@ -0,0 +1,48 @@
|
||||||
|
use eva::{data, str::CompactString};
|
||||||
|
|
||||||
|
use crate::requests::status_code;
|
||||||
|
|
||||||
|
use viendesu_core::requests::marks as reqs;
|
||||||
|
|
||||||
|
#[data]
|
||||||
|
pub struct AddBadge {
|
||||||
|
pub text: CompactString,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl_req!(AddBadge => [reqs::add_badge::Ok; reqs::add_badge::Err]);
|
||||||
|
status_code::direct!(reqs::add_badge::Ok => CREATED);
|
||||||
|
status_code::map!(reqs::add_badge::Err => []);
|
||||||
|
|
||||||
|
#[data]
|
||||||
|
pub struct AddTag {
|
||||||
|
pub text: CompactString,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl_req!(AddTag => [reqs::add_tag::Ok; reqs::add_tag::Err]);
|
||||||
|
status_code::direct!(reqs::add_tag::Ok => CREATED);
|
||||||
|
status_code::map!(reqs::add_tag::Err => []);
|
||||||
|
|
||||||
|
#[data]
|
||||||
|
pub struct ListGenres {}
|
||||||
|
|
||||||
|
impl_req!(ListGenres => [reqs::list_genres::Ok; reqs::list_genres::Err]);
|
||||||
|
status_code::direct!(reqs::list_genres::Ok => OK);
|
||||||
|
status_code::map!(reqs::list_genres::Err => []);
|
||||||
|
|
||||||
|
#[data]
|
||||||
|
pub struct ListTags {
|
||||||
|
pub query: Option<CompactString>,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl_req!(ListTags => [reqs::list_tags::Ok; reqs::list_tags::Err]);
|
||||||
|
status_code::direct!(reqs::list_tags::Ok => OK);
|
||||||
|
status_code::map!(reqs::list_tags::Err => []);
|
||||||
|
|
||||||
|
#[data]
|
||||||
|
pub struct ListBadges {
|
||||||
|
pub query: Option<CompactString>,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl_req!(ListBadges => [reqs::list_badges::Ok; reqs::list_badges::Err]);
|
||||||
|
status_code::direct!(reqs::list_badges::Ok => OK);
|
||||||
|
status_code::map!(reqs::list_badges::Err => []);
|
||||||
|
|
@ -24,6 +24,7 @@ macro_rules! impl_req {
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub mod marks;
|
||||||
pub mod users;
|
pub mod users;
|
||||||
|
|
||||||
pub mod authors;
|
pub mod authors;
|
||||||
|
|
|
||||||
|
|
@ -21,10 +21,90 @@ pub fn make<T: Types>(router: RouterScope<T>) -> RouterScope<T> {
|
||||||
.nest("/messages", messages)
|
.nest("/messages", messages)
|
||||||
.nest("/uploads", uploads)
|
.nest("/uploads", uploads)
|
||||||
.nest("/files", files)
|
.nest("/files", files)
|
||||||
|
.nest("/tags", tags)
|
||||||
|
.nest("/badges", badges)
|
||||||
|
.nest("/genres", genres)
|
||||||
}
|
}
|
||||||
|
|
||||||
// == Routes ==
|
// == Routes ==
|
||||||
|
|
||||||
|
fn genres<T: Types>(router: RouterScope<T>) -> RouterScope<T> {
|
||||||
|
use crate::requests::marks::ListGenres;
|
||||||
|
|
||||||
|
use viendesu_core::{requests::marks::list_genres, service::marks::Genres as _};
|
||||||
|
|
||||||
|
router.route(
|
||||||
|
"/",
|
||||||
|
get(
|
||||||
|
async move |mut session: SessionOf<T>, ctx: Ctx<ListGenres>| {
|
||||||
|
let ListGenres {} = ctx.request;
|
||||||
|
|
||||||
|
session.genres().list().call(list_genres::Args {}).await
|
||||||
|
},
|
||||||
|
),
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
fn badges<T: Types>(router: RouterScope<T>) -> RouterScope<T> {
|
||||||
|
use crate::requests::marks::{AddBadge, ListBadges};
|
||||||
|
|
||||||
|
use viendesu_core::{
|
||||||
|
requests::marks::{add_badge, list_badges},
|
||||||
|
service::marks::Badges as _,
|
||||||
|
};
|
||||||
|
|
||||||
|
router
|
||||||
|
.route(
|
||||||
|
"/",
|
||||||
|
get(
|
||||||
|
async move |mut session: SessionOf<T>, ctx: Ctx<ListBadges>| {
|
||||||
|
let ListBadges { query } = ctx.request;
|
||||||
|
session
|
||||||
|
.badges()
|
||||||
|
.list()
|
||||||
|
.call(list_badges::Args { query })
|
||||||
|
.await
|
||||||
|
},
|
||||||
|
),
|
||||||
|
)
|
||||||
|
.route(
|
||||||
|
"/",
|
||||||
|
post(async move |mut session: SessionOf<T>, ctx: Ctx<AddBadge>| {
|
||||||
|
let AddBadge { text } = ctx.request;
|
||||||
|
session
|
||||||
|
.badges()
|
||||||
|
.add()
|
||||||
|
.call(add_badge::Args { badge: text })
|
||||||
|
.await
|
||||||
|
}),
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
fn tags<T: Types>(router: RouterScope<T>) -> RouterScope<T> {
|
||||||
|
use crate::requests::marks::{AddTag, ListTags};
|
||||||
|
|
||||||
|
use viendesu_core::{
|
||||||
|
requests::marks::{add_tag, list_tags},
|
||||||
|
service::marks::Tags as _,
|
||||||
|
};
|
||||||
|
|
||||||
|
router
|
||||||
|
.route(
|
||||||
|
"/",
|
||||||
|
get(async move |mut session: SessionOf<T>, ctx: Ctx<ListTags>| {
|
||||||
|
let ListTags { query } = ctx.request;
|
||||||
|
session.tags().list().call(list_tags::Args { query }).await
|
||||||
|
}),
|
||||||
|
)
|
||||||
|
.route(
|
||||||
|
"/",
|
||||||
|
post(async move |mut session: SessionOf<T>, ctx: Ctx<AddTag>| {
|
||||||
|
let AddTag { text } = ctx.request;
|
||||||
|
session.tags().add().call(add_tag::Args { tag: text }).await
|
||||||
|
}),
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
fn users<T: Types>(router: RouterScope<T>) -> RouterScope<T> {
|
fn users<T: Types>(router: RouterScope<T>) -> RouterScope<T> {
|
||||||
use crate::requests::users::{
|
use crate::requests::users::{
|
||||||
BeginAuth, CheckAuth, ConfirmSignUp, FinishAuth, Get, SignIn, SignUp, Update,
|
BeginAuth, CheckAuth, ConfirmSignUp, FinishAuth, Get, SignIn, SignUp, Update,
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue