4 #[derive(Serialize, Deserialize)]
5 pub struct ListCategories;
7 #[derive(Serialize, Deserialize)]
8 pub struct ListCategoriesResponse {
10 categories: Vec<Category>
13 #[derive(Serialize, Deserialize)]
17 community_id: Option<i32>,
23 #[derive(Serialize, Deserialize)]
24 pub struct SearchResponse {
27 comments: Vec<CommentView>,
29 communities: Vec<CommunityView>,
33 #[derive(Serialize, Deserialize)]
34 pub struct GetModlog {
35 mod_user_id: Option<i32>,
36 community_id: Option<i32>,
41 #[derive(Serialize, Deserialize)]
42 pub struct GetModlogResponse {
44 removed_posts: Vec<ModRemovePostView>,
45 locked_posts: Vec<ModLockPostView>,
46 removed_comments: Vec<ModRemoveCommentView>,
47 removed_communities: Vec<ModRemoveCommunityView>,
48 banned_from_community: Vec<ModBanFromCommunityView>,
49 banned: Vec<ModBanView>,
50 added_to_community: Vec<ModAddCommunityView>,
51 added: Vec<ModAddView>,
55 #[derive(Serialize, Deserialize)]
56 pub struct CreateSite {
58 description: Option<String>,
62 #[derive(Serialize, Deserialize)]
65 description: Option<String>,
69 #[derive(Serialize, Deserialize)]
72 #[derive(Serialize, Deserialize)]
73 pub struct SiteResponse {
78 #[derive(Serialize, Deserialize)]
79 pub struct GetSiteResponse {
81 site: Option<SiteView>,
82 admins: Vec<UserView>,
83 banned: Vec<UserView>,
86 #[derive(Serialize, Deserialize)]
87 pub struct TransferSite {
92 impl Perform<ListCategoriesResponse> for Oper<ListCategories> {
93 fn perform(&self) -> Result<ListCategoriesResponse, Error> {
94 let _data: &ListCategories = &self.data;
95 let conn = establish_connection();
97 let categories: Vec<Category> = Category::list_all(&conn)?;
101 ListCategoriesResponse {
102 op: self.op.to_string(),
103 categories: categories
109 impl Perform<GetModlogResponse> for Oper<GetModlog> {
110 fn perform(&self) -> Result<GetModlogResponse, Error> {
111 let data: &GetModlog = &self.data;
112 let conn = establish_connection();
114 let removed_posts = ModRemovePostView::list(&conn, data.community_id, data.mod_user_id, data.page, data.limit)?;
115 let locked_posts = ModLockPostView::list(&conn, data.community_id, data.mod_user_id, data.page, data.limit)?;
116 let removed_comments = ModRemoveCommentView::list(&conn, data.community_id, data.mod_user_id, data.page, data.limit)?;
117 let banned_from_community = ModBanFromCommunityView::list(&conn, data.community_id, data.mod_user_id, data.page, data.limit)?;
118 let added_to_community = ModAddCommunityView::list(&conn, data.community_id, data.mod_user_id, data.page, data.limit)?;
120 // These arrays are only for the full modlog, when a community isn't given
121 let mut removed_communities = Vec::new();
122 let mut banned = Vec::new();
123 let mut added = Vec::new();
125 if data.community_id.is_none() {
126 removed_communities = ModRemoveCommunityView::list(&conn, data.mod_user_id, data.page, data.limit)?;
127 banned = ModBanView::list(&conn, data.mod_user_id, data.page, data.limit)?;
128 added = ModAddView::list(&conn, data.mod_user_id, data.page, data.limit)?;
134 op: self.op.to_string(),
135 removed_posts: removed_posts,
136 locked_posts: locked_posts,
137 removed_comments: removed_comments,
138 removed_communities: removed_communities,
139 banned_from_community: banned_from_community,
141 added_to_community: added_to_community,
148 impl Perform<SiteResponse> for Oper<CreateSite> {
149 fn perform(&self) -> Result<SiteResponse, Error> {
150 let data: &CreateSite = &self.data;
151 let conn = establish_connection();
153 let claims = match Claims::decode(&data.auth) {
154 Ok(claims) => claims.claims,
156 return Err(APIError::err(&self.op, "not_logged_in"))?
160 if has_slurs(&data.name) ||
161 (data.description.is_some() && has_slurs(&data.description.to_owned().unwrap())) {
162 return Err(APIError::err(&self.op, "no_slurs"))?
165 let user_id = claims.id;
167 // Make sure user is an admin
168 if !UserView::read(&conn, user_id)?.admin {
169 return Err(APIError::err(&self.op, "not_an_admin"))?
172 let site_form = SiteForm {
173 name: data.name.to_owned(),
174 description: data.description.to_owned(),
179 match Site::create(&conn, &site_form) {
182 return Err(APIError::err(&self.op, "site_already_exists"))?
186 let site_view = SiteView::read(&conn)?;
190 op: self.op.to_string(),
198 impl Perform<SiteResponse> for Oper<EditSite> {
199 fn perform(&self) -> Result<SiteResponse, Error> {
200 let data: &EditSite = &self.data;
201 let conn = establish_connection();
203 let claims = match Claims::decode(&data.auth) {
204 Ok(claims) => claims.claims,
206 return Err(APIError::err(&self.op, "not_logged_in"))?
210 if has_slurs(&data.name) ||
211 (data.description.is_some() && has_slurs(&data.description.to_owned().unwrap())) {
212 return Err(APIError::err(&self.op, "no_slurs"))?
215 let user_id = claims.id;
217 // Make sure user is an admin
218 if UserView::read(&conn, user_id)?.admin == false {
219 return Err(APIError::err(&self.op, "not_an_admin"))?
222 let found_site = Site::read(&conn, 1)?;
224 let site_form = SiteForm {
225 name: data.name.to_owned(),
226 description: data.description.to_owned(),
227 creator_id: found_site.creator_id,
228 updated: Some(naive_now()),
231 match Site::update(&conn, 1, &site_form) {
234 return Err(APIError::err(&self.op, "couldnt_update_site"))?
238 let site_view = SiteView::read(&conn)?;
242 op: self.op.to_string(),
249 impl Perform<GetSiteResponse> for Oper<GetSite> {
250 fn perform(&self) -> Result<GetSiteResponse, Error> {
251 let _data: &GetSite = &self.data;
252 let conn = establish_connection();
254 // It can return a null site in order to redirect
255 let site_view = match Site::read(&conn, 1) {
256 Ok(_site) => Some(SiteView::read(&conn)?),
260 let mut admins = UserView::admins(&conn)?;
261 if site_view.is_some() {
262 let site_creator_id = site_view.to_owned().unwrap().creator_id;
263 let creator_index = admins.iter().position(|r| r.id == site_creator_id).unwrap();
264 let creator_user = admins.remove(creator_index);
265 admins.insert(0, creator_user);
268 let banned = UserView::banned(&conn)?;
272 op: self.op.to_string(),
281 impl Perform<SearchResponse> for Oper<Search> {
282 fn perform(&self) -> Result<SearchResponse, Error> {
283 let data: &Search = &self.data;
284 let conn = establish_connection();
286 let sort = SortType::from_str(&data.sort)?;
287 let type_ = SearchType::from_str(&data.type_)?;
289 let mut posts = Vec::new();
290 let mut comments = Vec::new();
291 let mut communities = Vec::new();
292 let mut users = Vec::new();
294 // TODO no clean / non-nsfw searching rn
297 SearchType::Posts => {
298 posts = PostView::list(
300 PostListingType::All,
304 Some(data.q.to_owned()),
313 SearchType::Comments => {
314 comments = CommentView::list(
319 Some(data.q.to_owned()),
325 SearchType::Communities => {
326 communities = CommunityView::list(
331 Some(data.q.to_owned()),
335 SearchType::Users => {
336 users = UserView::list(
339 Some(data.q.to_owned()),
344 posts = PostView::list(
346 PostListingType::All,
350 Some(data.q.to_owned()),
358 comments = CommentView::list(
363 Some(data.q.to_owned()),
368 communities = CommunityView::list(
373 Some(data.q.to_owned()),
376 users = UserView::list(
379 Some(data.q.to_owned()),
384 posts = PostView::list(
386 PostListingType::All,
391 Some(data.q.to_owned()),
405 op: self.op.to_string(),
406 type_: data.type_.to_owned(),
409 communities: communities,
416 impl Perform<GetSiteResponse> for Oper<TransferSite> {
417 fn perform(&self) -> Result<GetSiteResponse, Error> {
418 let data: &TransferSite = &self.data;
419 let conn = establish_connection();
421 let claims = match Claims::decode(&data.auth) {
422 Ok(claims) => claims.claims,
424 return Err(APIError::err(&self.op, "not_logged_in"))?
428 let user_id = claims.id;
430 let read_site = Site::read(&conn, 1)?;
432 // Make sure user is the creator
433 if read_site.creator_id != user_id {
434 return Err(APIError::err(&self.op, "not_an_admin"))?
437 let site_form = SiteForm {
438 name: read_site.name,
439 description: read_site.description,
440 creator_id: data.user_id,
441 updated: Some(naive_now()),
444 match Site::update(&conn, 1, &site_form) {
447 return Err(APIError::err(&self.op, "couldnt_update_site"))?
452 let form = ModAddForm {
453 mod_user_id: user_id,
454 other_user_id: data.user_id,
455 removed: Some(false),
458 ModAdd::create(&conn, &form)?;
460 let site_view = SiteView::read(&conn)?;
462 let mut admins = UserView::admins(&conn)?;
463 let creator_index = admins.iter().position(|r| r.id == site_view.creator_id).unwrap();
464 let creator_user = admins.remove(creator_index);
465 admins.insert(0, creator_user);
467 let banned = UserView::banned(&conn)?;
471 op: self.op.to_string(),
472 site: Some(site_view),