use super::{Error, Result}; use crate::{jwt, models, schema, MainDatabase}; use chrono::prelude::*; use diesel::prelude::*; use rocket_contrib::{json::Json, uuid::Uuid}; #[get("/token")] #[instrument(skip(conn), err)] pub fn list(user: models::User, conn: MainDatabase) -> Result>> { use schema::tokens::dsl::*; Ok(Json( tokens .filter(user_id.eq(user.id)) .load::(&*conn) .map_err(Error::Database)?, )) } #[delete("/token/")] #[instrument(skip(conn), err)] pub fn delete(user: models::User, conn: MainDatabase, uuid: Uuid) -> Result { use schema::tokens::dsl::*; let uuid = uuid.into_inner(); let tok: models::Token = tokens .find(uuid.clone()) .get_result(&*conn) .map_err(Error::Database)?; if tok.user_id != user.id && !user.is_admin { return Err(Error::LackPermissions); } diesel::update(tokens.find(uuid)) .set(deleted_at.eq(Utc::now().naive_utc())) .get_result::(&*conn)?; Ok(()) } #[post("/token")] #[instrument(skip(conn), err)] pub fn create(user: models::User, conn: MainDatabase) -> Result { use schema::tokens; let tok: models::Token = diesel::insert_into(tokens::table) .values(&models::NewToken { user_id: user.id.clone(), }) .get_result(&*conn) .map_err(Error::Database)?; Ok(jwt::make(user.id, tok.id)?) }