Project Perses (API v1 yeetenings): parts 4 and 5 (#554)
* Project Perses (API v1 yeetenings): parts 4 and 5 Resolves MOD-219 Resolves MOD-220 * Note to Emma: Please test your stuff
This commit is contained in:
parent
00d09aa01e
commit
5d48ecf86a
@ -23,8 +23,6 @@ pub struct Report {
|
|||||||
#[serde(rename_all = "kebab-case")]
|
#[serde(rename_all = "kebab-case")]
|
||||||
pub enum ItemType {
|
pub enum ItemType {
|
||||||
Project,
|
Project,
|
||||||
// TODO remove when API v1 POST routes are removed
|
|
||||||
Mod,
|
|
||||||
Version,
|
Version,
|
||||||
User,
|
User,
|
||||||
Unknown,
|
Unknown,
|
||||||
@ -34,7 +32,6 @@ impl ItemType {
|
|||||||
pub fn as_str(&self) -> &'static str {
|
pub fn as_str(&self) -> &'static str {
|
||||||
match self {
|
match self {
|
||||||
ItemType::Project => "project",
|
ItemType::Project => "project",
|
||||||
ItemType::Mod => "mod",
|
|
||||||
ItemType::Version => "version",
|
ItemType::Version => "version",
|
||||||
ItemType::User => "user",
|
ItemType::User => "user",
|
||||||
ItemType::Unknown => "unknown",
|
ItemType::Unknown => "unknown",
|
||||||
|
|||||||
@ -326,7 +326,7 @@ Get logged in user
|
|||||||
- Add project data to indexing queue
|
- Add project data to indexing queue
|
||||||
*/
|
*/
|
||||||
|
|
||||||
pub async fn project_create_inner(
|
async fn project_create_inner(
|
||||||
req: HttpRequest,
|
req: HttpRequest,
|
||||||
payload: &mut Multipart,
|
payload: &mut Multipart,
|
||||||
transaction: &mut sqlx::Transaction<'_, sqlx::Postgres>,
|
transaction: &mut sqlx::Transaction<'_, sqlx::Postgres>,
|
||||||
|
|||||||
@ -66,7 +66,7 @@ pub async fn report_create(
|
|||||||
};
|
};
|
||||||
|
|
||||||
match new_report.item_type {
|
match new_report.item_type {
|
||||||
ItemType::Project | ItemType::Mod => {
|
ItemType::Project => {
|
||||||
let project_id =
|
let project_id =
|
||||||
ProjectId(parse_base62(new_report.item_id.as_str())?);
|
ProjectId(parse_base62(new_report.item_id.as_str())?);
|
||||||
|
|
||||||
|
|||||||
@ -1,4 +1,4 @@
|
|||||||
use actix_web::{dev::Service, web, HttpResponse};
|
use actix_web::{dev::Service, http::Method, web, HttpResponse};
|
||||||
use chrono::{Timelike, Utc};
|
use chrono::{Timelike, Utc};
|
||||||
use futures::FutureExt;
|
use futures::FutureExt;
|
||||||
|
|
||||||
@ -12,9 +12,9 @@ pub fn v1_config(cfg: &mut web::ServiceConfig) {
|
|||||||
cfg.service(
|
cfg.service(
|
||||||
web::scope("api/v1")
|
web::scope("api/v1")
|
||||||
.wrap_fn(|req, srv| {
|
.wrap_fn(|req, srv| {
|
||||||
let current_minute = Utc::now().minute();
|
let time = Utc::now();
|
||||||
|
|
||||||
if current_minute % 10 > 5 {
|
if req.method() == Method::GET && time.hour12().1 < 6 && time.minute() % 10 < 5 {
|
||||||
srv.call(req).boxed_local()
|
srv.call(req).boxed_local()
|
||||||
} else {
|
} else {
|
||||||
async {
|
async {
|
||||||
@ -33,7 +33,6 @@ pub fn v1_config(cfg: &mut web::ServiceConfig) {
|
|||||||
.configure(versions_config)
|
.configure(versions_config)
|
||||||
.configure(teams_config)
|
.configure(teams_config)
|
||||||
.configure(users_config)
|
.configure(users_config)
|
||||||
.configure(reports_config)
|
|
||||||
.configure(notifications_config),
|
.configure(notifications_config),
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
@ -52,35 +51,20 @@ pub fn tags_config(cfg: &mut web::ServiceConfig) {
|
|||||||
pub fn mods_config(cfg: &mut web::ServiceConfig) {
|
pub fn mods_config(cfg: &mut web::ServiceConfig) {
|
||||||
cfg.service(mods::mod_search);
|
cfg.service(mods::mod_search);
|
||||||
cfg.service(mods::mods_get);
|
cfg.service(mods::mods_get);
|
||||||
cfg.service(mods::mod_create);
|
|
||||||
|
|
||||||
cfg.service(
|
cfg.service(
|
||||||
web::scope("mod")
|
web::scope("mod")
|
||||||
.service(mods::mod_get)
|
.service(mods::mod_get)
|
||||||
.service(super::projects::project_delete)
|
|
||||||
.service(super::projects::project_edit)
|
|
||||||
.service(super::projects::project_icon_edit)
|
|
||||||
.service(super::projects::project_follow)
|
|
||||||
.service(super::projects::project_unfollow)
|
|
||||||
.service(web::scope("{mod_id}").service(versions::version_list)),
|
.service(web::scope("{mod_id}").service(versions::version_list)),
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn versions_config(cfg: &mut web::ServiceConfig) {
|
pub fn versions_config(cfg: &mut web::ServiceConfig) {
|
||||||
cfg.service(versions::versions_get);
|
cfg.service(versions::versions_get);
|
||||||
cfg.service(super::version_creation::version_create);
|
cfg.service(web::scope("version").service(versions::version_get));
|
||||||
cfg.service(
|
|
||||||
web::scope("version")
|
|
||||||
.service(versions::version_get)
|
|
||||||
.service(super::versions::version_delete)
|
|
||||||
.service(super::version_creation::upload_file_to_version)
|
|
||||||
.service(super::versions::version_edit),
|
|
||||||
);
|
|
||||||
cfg.service(
|
cfg.service(
|
||||||
web::scope("version_file")
|
web::scope("version_file")
|
||||||
.service(super::version_file::delete_file)
|
.service(super::version_file::get_version_from_hash),
|
||||||
.service(super::version_file::get_version_from_hash)
|
|
||||||
.service(super::version_file::download_version),
|
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -92,23 +76,13 @@ pub fn users_config(cfg: &mut web::ServiceConfig) {
|
|||||||
web::scope("user")
|
web::scope("user")
|
||||||
.service(super::users::user_get)
|
.service(super::users::user_get)
|
||||||
.service(users::mods_list)
|
.service(users::mods_list)
|
||||||
.service(super::users::user_delete)
|
|
||||||
.service(super::users::user_edit)
|
|
||||||
.service(super::users::user_icon_edit)
|
|
||||||
.service(super::users::user_notifications)
|
.service(super::users::user_notifications)
|
||||||
.service(users::user_follows),
|
.service(users::user_follows),
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn teams_config(cfg: &mut web::ServiceConfig) {
|
pub fn teams_config(cfg: &mut web::ServiceConfig) {
|
||||||
cfg.service(
|
cfg.service(web::scope("team").service(teams::team_members_get));
|
||||||
web::scope("team")
|
|
||||||
.service(teams::team_members_get)
|
|
||||||
.service(super::teams::edit_team_member)
|
|
||||||
.service(super::teams::add_team_member)
|
|
||||||
.service(super::teams::join_team)
|
|
||||||
.service(super::teams::remove_team_member),
|
|
||||||
);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn notifications_config(cfg: &mut web::ServiceConfig) {
|
pub fn notifications_config(cfg: &mut web::ServiceConfig) {
|
||||||
@ -116,11 +90,6 @@ pub fn notifications_config(cfg: &mut web::ServiceConfig) {
|
|||||||
|
|
||||||
cfg.service(
|
cfg.service(
|
||||||
web::scope("notification")
|
web::scope("notification")
|
||||||
.service(super::notifications::notification_get)
|
.service(super::notifications::notification_get),
|
||||||
.service(super::notifications::notification_delete),
|
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn reports_config(cfg: &mut web::ServiceConfig) {
|
|
||||||
cfg.service(super::reports::report_create);
|
|
||||||
}
|
|
||||||
|
|||||||
@ -1,20 +1,12 @@
|
|||||||
use crate::file_hosting::FileHost;
|
|
||||||
use crate::models::projects::SearchRequest;
|
use crate::models::projects::SearchRequest;
|
||||||
use crate::routes::project_creation::{
|
|
||||||
project_create_inner, undo_uploads, CreateError,
|
|
||||||
};
|
|
||||||
use crate::routes::projects::ProjectIds;
|
use crate::routes::projects::ProjectIds;
|
||||||
use crate::routes::ApiError;
|
use crate::routes::ApiError;
|
||||||
use crate::search::{search_for_project, SearchConfig, SearchError};
|
use crate::search::{search_for_project, SearchConfig, SearchError};
|
||||||
use crate::util::auth::{get_user_from_headers, is_authorized};
|
use crate::util::auth::{get_user_from_headers, is_authorized};
|
||||||
use crate::{database, models};
|
use crate::{database, models};
|
||||||
use actix_multipart::Multipart;
|
use actix_web::{get, web, HttpRequest, HttpResponse};
|
||||||
use actix_web::web;
|
|
||||||
use actix_web::web::Data;
|
|
||||||
use actix_web::{get, post, HttpRequest, HttpResponse};
|
|
||||||
use serde::{Deserialize, Serialize};
|
use serde::{Deserialize, Serialize};
|
||||||
use sqlx::PgPool;
|
use sqlx::PgPool;
|
||||||
use std::sync::Arc;
|
|
||||||
|
|
||||||
#[derive(Serialize, Deserialize, Debug, Clone)]
|
#[derive(Serialize, Deserialize, Debug, Clone)]
|
||||||
pub struct ResultSearchMod {
|
pub struct ResultSearchMod {
|
||||||
@ -150,38 +142,3 @@ pub async fn mods_get(
|
|||||||
}
|
}
|
||||||
Ok(HttpResponse::Ok().json(projects))
|
Ok(HttpResponse::Ok().json(projects))
|
||||||
}
|
}
|
||||||
|
|
||||||
#[post("mod")]
|
|
||||||
pub async fn mod_create(
|
|
||||||
req: HttpRequest,
|
|
||||||
mut payload: Multipart,
|
|
||||||
client: Data<PgPool>,
|
|
||||||
file_host: Data<Arc<dyn FileHost + Send + Sync>>,
|
|
||||||
) -> Result<HttpResponse, CreateError> {
|
|
||||||
let mut transaction = client.begin().await?;
|
|
||||||
let mut uploaded_files = Vec::new();
|
|
||||||
|
|
||||||
let result = project_create_inner(
|
|
||||||
req,
|
|
||||||
&mut payload,
|
|
||||||
&mut transaction,
|
|
||||||
&***file_host,
|
|
||||||
&mut uploaded_files,
|
|
||||||
&client,
|
|
||||||
)
|
|
||||||
.await;
|
|
||||||
|
|
||||||
if result.is_err() {
|
|
||||||
let undo_result = undo_uploads(&***file_host, &uploaded_files).await;
|
|
||||||
let rollback_result = transaction.rollback().await;
|
|
||||||
|
|
||||||
undo_result?;
|
|
||||||
if let Err(e) = rollback_result {
|
|
||||||
return Err(e.into());
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
transaction.commit().await?;
|
|
||||||
}
|
|
||||||
|
|
||||||
result
|
|
||||||
}
|
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user