initial nats routes for deranking + authservice
	
		
			
	
		
	
	
		
	
		
			All checks were successful
		
		
	
	
		
			
				
	
				/ build-all-services (push) Successful in 9m57s
				
			
		
		
	
	
				
					
				
			
		
			All checks were successful
		
		
	
	/ build-all-services (push) Successful in 9m57s
				
			currently only routes for fetching deranks, they'll have to be manually inserted into the database at the moment until we add further routes
This commit is contained in:
		
							parent
							
								
									f3ec651657
								
							
						
					
					
						commit
						08903aa0a1
					
				
					 7 changed files with 111 additions and 3 deletions
				
			
		
							
								
								
									
										27
									
								
								asklyphe-common/src/nats/authservice/deranklist.rs
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										27
									
								
								asklyphe-common/src/nats/authservice/deranklist.rs
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,27 @@ | |||
| use serde::{Deserialize, Serialize}; | ||||
| use crate::nats::authservice::UserPrivateToken; | ||||
| 
 | ||||
| #[derive(Debug, Clone, Serialize, Deserialize)] | ||||
| pub struct DerankEntry { | ||||
|     pub urlmatch: String, | ||||
|     pub and: Option<String>, | ||||
|     pub unless: Option<String>, | ||||
|     pub multiplier: f64, | ||||
|     pub comment: Option<String>, | ||||
| } | ||||
| 
 | ||||
| /// # UserFetchActiveDeranksRequest
 | ||||
| /// sent from frontend -> authsrvc to receive all applicable derank entries
 | ||||
| /// expecting a AuthServiceResponse::UserFetchActiveDeranksResponse back
 | ||||
| #[derive(Debug, Clone, Serialize, Deserialize)] | ||||
| pub struct UserFetchActiveDeranksRequest { | ||||
|     pub token: UserPrivateToken, | ||||
| } | ||||
| 
 | ||||
| #[derive(Debug, Clone, Serialize, Deserialize)] | ||||
| pub enum UserFetchActiveDeranksResponse { | ||||
|     Success(Vec<DerankEntry>), | ||||
|     InternalServerError, | ||||
|     /// sent if the token is invalid, and the account should be logged out
 | ||||
|     Logout, | ||||
| } | ||||
|  | @ -14,11 +14,13 @@ | |||
| pub mod profile; | ||||
| pub mod admin; | ||||
| pub mod announcements; | ||||
| pub mod deranklist; | ||||
| 
 | ||||
| use std::fmt::{Display, Formatter, Write}; | ||||
| use serde::{Deserialize, Serialize}; | ||||
| use crate::nats::authservice::admin::{AdminCreateAnnouncementRequest, AdminCreateAnnouncementResponse, AdminInviteCodeGenerateRequest, AdminInviteCodeGenerateResponse, AdminListAllUsersRequest, AdminListAllUsersResponse, AdminListInviteCodesRequest, AdminListInviteCodesResponse, AdminUpdateAnnouncementRequest, AdminUpdateAnnouncementResponse, StatsRequest, StatsResponse}; | ||||
| use crate::nats::authservice::announcements::{AnnouncementFullRequest, AnnouncementFullResponse, AnnouncementListRequest, AnnouncementListResponse, LatestAnnouncementRequest, LatestAnnouncementResponse}; | ||||
| use crate::nats::authservice::deranklist::{UserFetchActiveDeranksRequest, UserFetchActiveDeranksResponse}; | ||||
| use crate::nats::authservice::profile::{ThemeChangeRequest, ThemeChangeResponse, UserInfoRequest, UserInfoResponse}; | ||||
| 
 | ||||
| pub const AUTH_SERVICE: &str = "authsrvc"; | ||||
|  | @ -63,6 +65,7 @@ pub enum AuthServiceRequest { | |||
|     AdminUpdateAnnouncementRequest(AdminUpdateAnnouncementRequest), | ||||
|     AdminListInviteCodesRequest(AdminListInviteCodesRequest), | ||||
|     AdminListAllUsersRequest(AdminListAllUsersRequest), | ||||
|     UserFetchActiveDeranksRequest(UserFetchActiveDeranksRequest), | ||||
| } | ||||
| #[derive(Debug, Clone, Serialize, Deserialize)] | ||||
| pub enum AuthServiceResponse { | ||||
|  | @ -86,6 +89,7 @@ pub enum AuthServiceResponse { | |||
|     AdminUpdateAnnouncementResponse(AdminUpdateAnnouncementResponse), | ||||
|     AdminListInviteCodesResponse(AdminListInviteCodesResponse), | ||||
|     AdminListAllUsersResponse(AdminListAllUsersResponse), | ||||
|     UserFetchActiveDeranksResponse(UserFetchActiveDeranksResponse), | ||||
| } | ||||
| 
 | ||||
| // fixme: this should really be done with a macro
 | ||||
|  | @ -152,6 +156,9 @@ impl Display for AuthServiceResponse { | |||
|             AuthServiceResponse::AdminListAllUsersResponse(_) => { | ||||
|                 f.write_str("admin list all users response") | ||||
|             } | ||||
|             AuthServiceResponse::UserFetchActiveDeranksResponse(_) => { | ||||
|                 f.write_str("user fetch active deranks response") | ||||
|             } | ||||
|         } | ||||
|     } | ||||
| } | ||||
|  |  | |||
|  | @ -55,4 +55,4 @@ pub enum ThemeChangeResponse { | |||
|     /// sent if the token is invalid, and the account should be logged out
 | ||||
|     Logout, | ||||
|     InternalServerError, | ||||
| } | ||||
| } | ||||
							
								
								
									
										39
									
								
								authservice/src/db/deranklist.rs
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										39
									
								
								authservice/src/db/deranklist.rs
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,39 @@ | |||
| use log::error; | ||||
| use sea_orm::ColumnTrait; | ||||
| use sea_orm::{DatabaseConnection, EntityTrait, QueryFilter}; | ||||
| use asklyphe_common::nats::authservice::deranklist::DerankEntry; | ||||
| use entity::{derank_list_entry, derank_list_subscription}; | ||||
| 
 | ||||
| /// given a user id, finds and returns all active derank list entries, regardless of list
 | ||||
| /// will just return an empty list if no derank entries exist for that user, should only
 | ||||
| /// return an error if the database returns an error
 | ||||
| pub async fn user_all_active_derank_entries(db: &DatabaseConnection, user_id: String) -> Result<Vec<DerankEntry>, ()> { | ||||
|     let user_subscribed_derank_lists = derank_list_subscription::Entity::find() | ||||
|         .filter(derank_list_subscription::Column::UserId.eq(user_id)) | ||||
|         .filter(derank_list_subscription::Column::Active.eq(true)) | ||||
|         .all(db).await | ||||
|         .map_err(|e| { | ||||
|             error!("DATABASE ERROR WHILE USERALLDERANKENTRIES (get user): {e}"); | ||||
|         })?; | ||||
|     
 | ||||
|     let mut derank_entries: Vec<DerankEntry> = vec![]; | ||||
|     for list in user_subscribed_derank_lists { | ||||
|         if list.active { | ||||
|             // should always be true but just being safe
 | ||||
|             derank_entries.extend(derank_list_entry::Entity::find() | ||||
|                 .filter(derank_list_entry::Column::DerankListId.eq(&list.id)) | ||||
|                 .all(db).await.map_err(|e| { | ||||
|                 error!("DATABASE ERROR WHILE USERALLDERANKENTRIES (get entries): {e}"); | ||||
|             })?.into_iter().map(|v| { | ||||
|                 DerankEntry { | ||||
|                     urlmatch: v.url_match, | ||||
|                     and: v.and, | ||||
|                     unless: v.unless, | ||||
|                     multiplier: v.multiplier, | ||||
|                     comment: v.comment, | ||||
|                 } | ||||
|             })); | ||||
|         } | ||||
|     } | ||||
|     Ok(derank_entries) | ||||
| } | ||||
|  | @ -16,6 +16,7 @@ pub mod invite_code; | |||
| pub mod session; | ||||
| pub mod usersettings; | ||||
| pub mod announcements; | ||||
| pub mod deranklist; | ||||
| 
 | ||||
| pub fn genid() -> String { | ||||
|     ulid::Ulid::new().to_string() | ||||
|  |  | |||
|  | @ -21,7 +21,7 @@ use sea_orm::DatabaseConnection; | |||
| use crate::process::admin::{admin_create_announcement, admin_invite_code_gen, admin_list_all_users, admin_list_invite_codes, admin_update_announcement, stats}; | ||||
| use crate::process::announcements::{announcement_full, announcement_list, latest_announcement}; | ||||
| use crate::process::basic_accounts::{cancel_email_change, email_change, login, logout, register_request, verify_email, verify_session}; | ||||
| use crate::process::profile::{change_theme, user_info}; | ||||
| use crate::process::profile::{change_theme, user_active_deranks, user_info}; | ||||
| 
 | ||||
| pub async fn process(query: AuthServiceQuery, db: DatabaseConnection) -> AuthServiceResponse { | ||||
|     // a future is used so that the whole program doesn't die if an algorithm panics
 | ||||
|  | @ -82,6 +82,9 @@ pub async fn process(query: AuthServiceQuery, db: DatabaseConnection) -> AuthSer | |||
|             AuthServiceRequest::AdminListAllUsersRequest(req) => { | ||||
|                 AuthServiceResponse::AdminListAllUsersResponse(admin_list_all_users(&db, req).await) | ||||
|             } | ||||
|             AuthServiceRequest::UserFetchActiveDeranksRequest(req) => { | ||||
|                 AuthServiceResponse::UserFetchActiveDeranksResponse(user_active_deranks(&db, req).await) | ||||
|             } | ||||
|         }}).await; | ||||
| 
 | ||||
|     if let Ok(response) = response { | ||||
|  |  | |||
|  | @ -14,7 +14,8 @@ | |||
| use asklyphe_common::nats::authservice::{AuthError, AuthResponse}; | ||||
| use asklyphe_common::nats::authservice::profile::{ThemeChangeRequest, ThemeChangeResponse, UserInfo, UserInfoRequest, UserInfoResponse}; | ||||
| use sea_orm::DatabaseConnection; | ||||
| use crate::db::{session, user, usersettings}; | ||||
| use asklyphe_common::nats::authservice::deranklist::{DerankEntry, UserFetchActiveDeranksRequest, UserFetchActiveDeranksResponse}; | ||||
| use crate::db::{deranklist, session, user, usersettings}; | ||||
| use crate::db::session::FetchSessionError; | ||||
| use crate::db::user::FetchUserError; | ||||
| use crate::db::usersettings::{FetchUserSettingsError, UserSettings}; | ||||
|  | @ -102,4 +103,34 @@ pub async fn change_theme(db: &DatabaseConnection, request: ThemeChangeRequest) | |||
|             } | ||||
|         } | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| // maybe in the future we should have derank list stuff in a different file?
 | ||||
| 
 | ||||
| pub async fn user_active_deranks(db: &DatabaseConnection, request: UserFetchActiveDeranksRequest) -> UserFetchActiveDeranksResponse { | ||||
|     let uid = match session::get_userid_from_session(db, request.token, true).await { | ||||
|         Ok(u) => u, | ||||
|         Err(e) => { | ||||
|             return match e { | ||||
|                 FetchSessionError::SessionInvalid => { | ||||
|                     UserFetchActiveDeranksResponse::Logout | ||||
|                 } | ||||
|                 FetchSessionError::SessionDoesntExist => { | ||||
|                     UserFetchActiveDeranksResponse::Logout | ||||
|                 } | ||||
|                 FetchSessionError::DatabaseError => { | ||||
|                     UserFetchActiveDeranksResponse::InternalServerError | ||||
|                 } | ||||
|             }; | ||||
|         } | ||||
|     }; | ||||
| 
 | ||||
|     match deranklist::user_all_active_derank_entries(db, uid).await { | ||||
|         Ok(v) => { | ||||
|             UserFetchActiveDeranksResponse::Success(v) | ||||
|         } | ||||
|         Err(_) => { | ||||
|             UserFetchActiveDeranksResponse::InternalServerError | ||||
|         } | ||||
|     } | ||||
| } | ||||
		Loading…
	
	Add table
		
		Reference in a new issue