// // app.rs // Copyright (C) 2022 veypi // 2022-07-09 03:10 // Distributed under terms of the Apache license. // // use actix_web::{delete, get, post, web, Responder}; use proc::{access_create, access_read}; use sea_orm::{ActiveModelTrait, EntityTrait, TransactionTrait}; use serde::{Deserialize, Serialize}; use tracing::info; use crate::{ libs, models::{self, access, app, app_user, rand_str, AUStatus, AccessLevel, Token}, AppState, Error, Result, }; use chrono::NaiveDateTime; #[get("/app/{id}")] #[access_read("app")] pub async fn get(id: web::Path, stat: web::Data) -> Result { let n = id.into_inner(); if !n.is_empty() { let s = app::Entity::find_by_id(n).one(stat.db()).await?; Ok(web::Json(s)) } else { Err(Error::Missing("id".to_string())) } } #[derive(Debug, Serialize, Deserialize, sqlx::FromRow)] pub struct App { pub id: String, pub created: Option, pub updated: Option, pub name: Option, pub des: Option, pub icon: Option, pub user_count: i64, pub hide: bool, pub join_method: models::AppJoin, pub role_id: Option, pub redirect: Option, pub status: i64, pub u_status: i64, } #[get("/app/")] #[access_read("app")] pub async fn list(stat: web::Data) -> Result { let res = app::Entity::find().all(stat.db()).await?; // let result = sqlx::query_as::<_,app::Model>( // "select app.*,app_userstatus as status from app left join app_user on app_user.user_id = ? && app_user.app_id = app.id", // ).bind(_auth_token.id) // .fetch_all(stat.sqlx()) // .await?; Ok(web::Json(res)) } #[derive(Debug, Deserialize, Serialize)] pub struct CreateOpt { name: String, icon: Option, // enable_register: Option, // des: Option, // host: Option, // redirect: Option, } #[post("/app/")] #[access_create("app")] pub async fn create( stat: web::Data, data: web::Json, t: web::ReqData, ) -> Result { let data = data.into_inner(); let id = uuid::Uuid::new_v4().to_string().replace("-", ""); let t = t.into_inner(); info!("{} create app {}", t.id, t.nickname); let obj = app::ActiveModel { name: sea_orm::ActiveValue::Set(data.name), icon: sea_orm::ActiveValue::Set(data.icon), id: sea_orm::ActiveValue::Set(id), key: sea_orm::ActiveValue::Set(rand_str(32)), ..Default::default() }; let db = stat.db().begin().await?; let obj: app::Model = obj.insert(&db).await?; let ac = access::ActiveModel { app_id: sea_orm::ActiveValue::Set(stat.uuid.clone()), name: sea_orm::ActiveValue::Set("app".to_string()), rid: sea_orm::ActiveValue::Set(Some(obj.id.clone())), user_id: sea_orm::ActiveValue::Set(Some(t.id.clone())), level: sea_orm::ActiveValue::Set(AccessLevel::ALL as i32), ..Default::default() }; let ac: access::Model = ac.insert(&db).await?; libs::user::connect_to_app(t.id.clone(), obj.id.clone(), &db, Some(obj.clone())).await?; db.commit().await?; Ok(web::Json(obj)) } #[delete("/app/{id}")] pub async fn del(_id: web::Path) -> Result { Ok("") }