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:
Orchid system (Emma) 2023-03-02 12:50:46 -05:00 committed by GitHub
parent 00d09aa01e
commit 5d48ecf86a
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
5 changed files with 10 additions and 87 deletions

View File

@ -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",

View File

@ -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>,

View File

@ -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())?);

View File

@ -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);
}

View File

@ -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
}