5 #[derive(Serialize, Deserialize, Debug)]
7 username_or_email: String,
11 #[derive(Serialize, Deserialize)]
14 email: Option<String>,
16 password_verify: String,
20 #[derive(Serialize, Deserialize)]
21 pub struct LoginResponse {
26 #[derive(Serialize, Deserialize)]
27 pub struct GetUserDetails {
29 username: Option<String>,
33 community_id: Option<i32>,
38 #[derive(Serialize, Deserialize)]
39 pub struct GetUserDetailsResponse {
42 follows: Vec<CommunityFollowerView>,
43 moderates: Vec<CommunityModeratorView>,
44 comments: Vec<CommentView>,
48 #[derive(Serialize, Deserialize)]
49 pub struct GetRepliesResponse {
51 replies: Vec<ReplyView>,
54 #[derive(Serialize, Deserialize)]
55 pub struct MarkAllAsRead {
59 #[derive(Serialize, Deserialize)]
66 #[derive(Serialize, Deserialize)]
67 pub struct AddAdminResponse {
69 admins: Vec<UserView>,
72 #[derive(Serialize, Deserialize)]
76 reason: Option<String>,
81 #[derive(Serialize, Deserialize)]
82 pub struct BanUserResponse {
88 #[derive(Serialize, Deserialize)]
89 pub struct GetReplies {
97 impl Perform<LoginResponse> for Oper<Login> {
98 fn perform(&self) -> Result<LoginResponse, Error> {
99 let data: &Login = &self.data;
100 let conn = establish_connection();
102 // Fetch that username / email
103 let user: User_ = match User_::find_by_email_or_username(&conn, &data.username_or_email) {
105 Err(_e) => return Err(APIError::err(&self.op, "Couldn't find that username or email"))?
108 // Verify the password
109 let valid: bool = verify(&data.password, &user.password_encrypted).unwrap_or(false);
111 return Err(APIError::err(&self.op, "Password incorrect"))?
117 op: self.op.to_string(),
125 impl Perform<LoginResponse> for Oper<Register> {
126 fn perform(&self) -> Result<LoginResponse, Error> {
127 let data: &Register = &self.data;
128 let conn = establish_connection();
130 // Make sure passwords match
131 if &data.password != &data.password_verify {
132 return Err(APIError::err(&self.op, "Passwords do not match."))?
135 if has_slurs(&data.username) {
136 return Err(APIError::err(&self.op, "No slurs"))?
139 // Make sure there are no admins
140 if data.admin && UserView::admins(&conn)?.len() > 0 {
141 return Err(APIError::err(&self.op, "Sorry, there's already an admin."))?
144 // Register the new user
145 let user_form = UserForm {
146 name: data.username.to_owned(),
147 fedi_name: Settings::get().hostname.into(),
148 email: data.email.to_owned(),
149 password_encrypted: data.password.to_owned(),
150 preferred_username: None,
157 let inserted_user = match User_::register(&conn, &user_form) {
160 return Err(APIError::err(&self.op, "User already exists."))?
164 // Sign them up for main community no matter what
165 let community_follower_form = CommunityFollowerForm {
167 user_id: inserted_user.id,
170 let _inserted_community_follower = match CommunityFollower::follow(&conn, &community_follower_form) {
173 return Err(APIError::err(&self.op, "Community follower already exists."))?
177 // If its an admin, add them as a mod and follower to main
179 let community_moderator_form = CommunityModeratorForm {
181 user_id: inserted_user.id,
184 let _inserted_community_moderator = match CommunityModerator::join(&conn, &community_moderator_form) {
187 return Err(APIError::err(&self.op, "Community moderator already exists."))?
196 op: self.op.to_string(),
197 jwt: inserted_user.jwt()
204 impl Perform<GetUserDetailsResponse> for Oper<GetUserDetails> {
205 fn perform(&self) -> Result<GetUserDetailsResponse, Error> {
206 let data: &GetUserDetails = &self.data;
207 let conn = establish_connection();
209 let user_id: Option<i32> = match &data.auth {
211 match Claims::decode(&auth) {
213 let user_id = claims.claims.id;
223 let sort = SortType::from_str(&data.sort)?;
225 let user_details_id = match data.user_id {
227 None => User_::read_from_name(&conn, data.username.to_owned().unwrap_or("admin".to_string()))?.id
230 let user_view = UserView::read(&conn, user_details_id)?;
232 // If its saved only, you don't care what creator it was
233 let posts = if data.saved_only {
234 PostView::list(&conn,
235 PostListingType::All,
240 Some(user_details_id),
246 PostView::list(&conn,
247 PostListingType::All,
250 Some(user_details_id),
258 let comments = if data.saved_only {
259 CommentView::list(&conn,
264 Some(user_details_id),
269 CommentView::list(&conn,
272 Some(user_details_id),
280 let follows = CommunityFollowerView::for_user(&conn, user_details_id)?;
281 let moderates = CommunityModeratorView::for_user(&conn, user_details_id)?;
285 GetUserDetailsResponse {
286 op: self.op.to_string(),
289 moderates: moderates,
298 impl Perform<AddAdminResponse> for Oper<AddAdmin> {
299 fn perform(&self) -> Result<AddAdminResponse, Error> {
300 let data: &AddAdmin = &self.data;
301 let conn = establish_connection();
303 let claims = match Claims::decode(&data.auth) {
304 Ok(claims) => claims.claims,
306 return Err(APIError::err(&self.op, "Not logged in."))?
310 let user_id = claims.id;
312 // Make sure user is an admin
313 if UserView::read(&conn, user_id)?.admin == false {
314 return Err(APIError::err(&self.op, "Not an admin."))?
317 let read_user = User_::read(&conn, data.user_id)?;
319 let user_form = UserForm {
320 name: read_user.name,
321 fedi_name: read_user.fedi_name,
322 email: read_user.email,
323 password_encrypted: read_user.password_encrypted,
324 preferred_username: read_user.preferred_username,
325 updated: Some(naive_now()),
327 banned: read_user.banned,
330 match User_::update(&conn, data.user_id, &user_form) {
333 return Err(APIError::err(&self.op, "Couldn't update user"))?
338 let form = ModAddForm {
339 mod_user_id: user_id,
340 other_user_id: data.user_id,
341 removed: Some(!data.added),
344 ModAdd::create(&conn, &form)?;
346 let admins = UserView::admins(&conn)?;
350 op: self.op.to_string(),
357 impl Perform<BanUserResponse> for Oper<BanUser> {
358 fn perform(&self) -> Result<BanUserResponse, Error> {
359 let data: &BanUser = &self.data;
360 let conn = establish_connection();
362 let claims = match Claims::decode(&data.auth) {
363 Ok(claims) => claims.claims,
365 return Err(APIError::err(&self.op, "Not logged in."))?
369 let user_id = claims.id;
371 // Make sure user is an admin
372 if UserView::read(&conn, user_id)?.admin == false {
373 return Err(APIError::err(&self.op, "Not an admin."))?
376 let read_user = User_::read(&conn, data.user_id)?;
378 let user_form = UserForm {
379 name: read_user.name,
380 fedi_name: read_user.fedi_name,
381 email: read_user.email,
382 password_encrypted: read_user.password_encrypted,
383 preferred_username: read_user.preferred_username,
384 updated: Some(naive_now()),
385 admin: read_user.admin,
389 match User_::update(&conn, data.user_id, &user_form) {
392 return Err(APIError::err(&self.op, "Couldn't update user"))?
397 let expires = match data.expires {
398 Some(time) => Some(naive_from_unix(time)),
402 let form = ModBanForm {
403 mod_user_id: user_id,
404 other_user_id: data.user_id,
405 reason: data.reason.to_owned(),
406 banned: Some(data.ban),
410 ModBan::create(&conn, &form)?;
412 let user_view = UserView::read(&conn, data.user_id)?;
416 op: self.op.to_string(),
425 impl Perform<GetRepliesResponse> for Oper<GetReplies> {
426 fn perform(&self) -> Result<GetRepliesResponse, Error> {
427 let data: &GetReplies = &self.data;
428 let conn = establish_connection();
430 let claims = match Claims::decode(&data.auth) {
431 Ok(claims) => claims.claims,
433 return Err(APIError::err(&self.op, "Not logged in."))?
437 let user_id = claims.id;
439 let sort = SortType::from_str(&data.sort)?;
441 let replies = ReplyView::get_replies(&conn, user_id, &sort, data.unread_only, data.page, data.limit)?;
446 op: self.op.to_string(),
453 impl Perform<GetRepliesResponse> for Oper<MarkAllAsRead> {
454 fn perform(&self) -> Result<GetRepliesResponse, Error> {
455 let data: &MarkAllAsRead = &self.data;
456 let conn = establish_connection();
458 let claims = match Claims::decode(&data.auth) {
459 Ok(claims) => claims.claims,
461 return Err(APIError::err(&self.op, "Not logged in."))?
465 let user_id = claims.id;
467 let replies = ReplyView::get_replies(&conn, user_id, &SortType::New, true, Some(1), Some(999))?;
469 for reply in &replies {
470 let comment_form = CommentForm {
471 content: reply.to_owned().content,
472 parent_id: reply.to_owned().parent_id,
473 post_id: reply.to_owned().post_id,
474 creator_id: reply.to_owned().creator_id,
478 updated: reply.to_owned().updated
481 let _updated_comment = match Comment::update(&conn, reply.id, &comment_form) {
482 Ok(comment) => comment,
484 return Err(APIError::err(&self.op, "Couldn't update Comment"))?
489 let replies = ReplyView::get_replies(&conn, user_id, &SortType::New, true, Some(1), Some(999))?;
493 op: self.op.to_string(),