Skip to content
Clone
a06673b
80 lines 2.0 KB Rust
use axum::Json;
use axum::extract::{Path, State};
use jwt::extractor::AuthUser;
use serde::Deserialize;
use uuid::Uuid;
use crate::error::UserResult;
use crate::features::UserService;
use crate::features::profile::{MemeView, UpsertMemeCmd};
#[derive(Debug, Deserialize)]
pub(crate) struct ListMemesQuery {
#[serde(default = "default_limit")]
pub limit: usize,
}
fn default_limit() -> usize {
20
}
#[utoipa::path(
get,
path = "/user/me/memes",
tag = "user",
params(
("limit" = Option<usize>, Query, description = "Maximum items (default 20)."),
),
responses(
(status = 200, description = "List the caller's favorite memes.", body = Vec<MemeView>),
),
security(("bearer_auth" = [])),
)]
pub(crate) async fn list_handler(
State(svc): State<UserService>,
AuthUser { claims }: AuthUser,
axum::extract::Query(q): axum::extract::Query<ListMemesQuery>,
) -> UserResult<Json<Vec<MemeView>>> {
let rows = svc.list_memes(claims.sub, q.limit).await?;
Ok(Json(rows))
}
#[utoipa::path(
post,
path = "/user/me/memes",
tag = "user",
request_body = UpsertMemeCmd,
responses(
(status = 200, description = "Meme created or updated.", body = MemeView),
),
security(("bearer_auth" = [])),
)]
pub(crate) async fn create_handler(
State(svc): State<UserService>,
AuthUser { claims }: AuthUser,
Json(cmd): Json<UpsertMemeCmd>,
) -> UserResult<Json<MemeView>> {
let row = svc.upsert_meme(claims.sub, cmd).await?;
Ok(Json(row))
}
#[utoipa::path(
delete,
path = "/user/me/memes/{id}",
tag = "user",
params(
("id" = Uuid, Path, description = "Meme identifier."),
),
responses(
(status = 204, description = "Meme deleted."),
),
security(("bearer_auth" = [])),
)]
pub(crate) async fn delete_handler(
State(svc): State<UserService>,
AuthUser { claims }: AuthUser,
Path(id): Path<Uuid>,
) -> UserResult<()> {
svc.delete_meme(claims.sub, id).await
}