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")]
|
||||
pub enum ItemType {
|
||||
Project,
|
||||
// TODO remove when API v1 POST routes are removed
|
||||
Mod,
|
||||
Version,
|
||||
User,
|
||||
Unknown,
|
||||
@ -34,7 +32,6 @@ impl ItemType {
|
||||
pub fn as_str(&self) -> &'static str {
|
||||
match self {
|
||||
ItemType::Project => "project",
|
||||
ItemType::Mod => "mod",
|
||||
ItemType::Version => "version",
|
||||
ItemType::User => "user",
|
||||
ItemType::Unknown => "unknown",
|
||||
|
||||
@ -326,7 +326,7 @@ Get logged in user
|
||||
- Add project data to indexing queue
|
||||
*/
|
||||
|
||||
pub async fn project_create_inner(
|
||||
async fn project_create_inner(
|
||||
req: HttpRequest,
|
||||
payload: &mut Multipart,
|
||||
transaction: &mut sqlx::Transaction<'_, sqlx::Postgres>,
|
||||
|
||||
@ -66,7 +66,7 @@ pub async fn report_create(
|
||||
};
|
||||
|
||||
match new_report.item_type {
|
||||
ItemType::Project | ItemType::Mod => {
|
||||
ItemType::Project => {
|
||||
let project_id =
|
||||
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 futures::FutureExt;
|
||||
|
||||
@ -12,9 +12,9 @@ pub fn v1_config(cfg: &mut web::ServiceConfig) {
|
||||
cfg.service(
|
||||
web::scope("api/v1")
|
||||
.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()
|
||||
} else {
|
||||
async {
|
||||
@ -33,7 +33,6 @@ pub fn v1_config(cfg: &mut web::ServiceConfig) {
|
||||
.configure(versions_config)
|
||||
.configure(teams_config)
|
||||
.configure(users_config)
|
||||
.configure(reports_config)
|
||||
.configure(notifications_config),
|
||||
);
|
||||
}
|
||||
@ -52,35 +51,20 @@ pub fn tags_config(cfg: &mut web::ServiceConfig) {
|
||||
pub fn mods_config(cfg: &mut web::ServiceConfig) {
|
||||
cfg.service(mods::mod_search);
|
||||
cfg.service(mods::mods_get);
|
||||
cfg.service(mods::mod_create);
|
||||
|
||||
cfg.service(
|
||||
web::scope("mod")
|
||||
.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)),
|
||||
);
|
||||
}
|
||||
|
||||
pub fn versions_config(cfg: &mut web::ServiceConfig) {
|
||||
cfg.service(versions::versions_get);
|
||||
cfg.service(super::version_creation::version_create);
|
||||
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(web::scope("version").service(versions::version_get));
|
||||
cfg.service(
|
||||
web::scope("version_file")
|
||||
.service(super::version_file::delete_file)
|
||||
.service(super::version_file::get_version_from_hash)
|
||||
.service(super::version_file::download_version),
|
||||
.service(super::version_file::get_version_from_hash),
|
||||
);
|
||||
}
|
||||
|
||||
@ -92,23 +76,13 @@ pub fn users_config(cfg: &mut web::ServiceConfig) {
|
||||
web::scope("user")
|
||||
.service(super::users::user_get)
|
||||
.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(users::user_follows),
|
||||
);
|
||||
}
|
||||
|
||||
pub fn teams_config(cfg: &mut web::ServiceConfig) {
|
||||
cfg.service(
|
||||
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),
|
||||
);
|
||||
cfg.service(web::scope("team").service(teams::team_members_get));
|
||||
}
|
||||
|
||||
pub fn notifications_config(cfg: &mut web::ServiceConfig) {
|
||||
@ -116,11 +90,6 @@ pub fn notifications_config(cfg: &mut web::ServiceConfig) {
|
||||
|
||||
cfg.service(
|
||||
web::scope("notification")
|
||||
.service(super::notifications::notification_get)
|
||||
.service(super::notifications::notification_delete),
|
||||
.service(super::notifications::notification_get),
|
||||
);
|
||||
}
|
||||
|
||||
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::routes::project_creation::{
|
||||
project_create_inner, undo_uploads, CreateError,
|
||||
};
|
||||
use crate::routes::projects::ProjectIds;
|
||||
use crate::routes::ApiError;
|
||||
use crate::search::{search_for_project, SearchConfig, SearchError};
|
||||
use crate::util::auth::{get_user_from_headers, is_authorized};
|
||||
use crate::{database, models};
|
||||
use actix_multipart::Multipart;
|
||||
use actix_web::web;
|
||||
use actix_web::web::Data;
|
||||
use actix_web::{get, post, HttpRequest, HttpResponse};
|
||||
use actix_web::{get, web, HttpRequest, HttpResponse};
|
||||
use serde::{Deserialize, Serialize};
|
||||
use sqlx::PgPool;
|
||||
use std::sync::Arc;
|
||||
|
||||
#[derive(Serialize, Deserialize, Debug, Clone)]
|
||||
pub struct ResultSearchMod {
|
||||
@ -150,38 +142,3 @@ pub async fn mods_get(
|
||||
}
|
||||
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