SaveUserSettings,
TransferCommunity,
TransferSite,
+ DeleteAccount,
}
#[derive(Fail, Debug)]
auth: String,
}
+#[derive(Serialize, Deserialize)]
+pub struct DeleteAccount {
+ auth: String,
+}
+
impl Perform<LoginResponse> for Oper<Login> {
fn perform(&self) -> Result<LoginResponse, Error> {
let data: &Login = &self.data;
})
}
}
+
+impl Perform<LoginResponse> for Oper<DeleteAccount> {
+ fn perform(&self) -> Result<LoginResponse, Error> {
+ let data: &DeleteAccount = &self.data;
+ let conn = establish_connection();
+
+ let claims = match Claims::decode(&data.auth) {
+ Ok(claims) => claims.claims,
+ Err(_e) => return Err(APIError::err(&self.op, "not_logged_in"))?,
+ };
+
+ let user_id = claims.id;
+
+ // Comments
+ let comments = CommentView::list(&conn, &SortType::New, None, Some(user_id), None, None, false, None, Some(std::i64::MAX))?;
+
+ for comment in &comments {
+ let comment_form = CommentForm {
+ content: "*Permananently Deleted*".to_string(),
+ parent_id: comment.to_owned().parent_id,
+ post_id: comment.to_owned().post_id,
+ creator_id: comment.to_owned().creator_id,
+ removed: None,
+ deleted: Some(true),
+ read: None,
+ updated: Some(naive_now()),
+ };
+
+ let _updated_comment = match Comment::update(&conn, comment.id, &comment_form) {
+ Ok(comment) => comment,
+ Err(_e) => return Err(APIError::err(&self.op, "couldnt_update_comment"))?,
+ };
+ }
+
+ // Posts
+ let posts = PostView::list(&conn, PostListingType::All, &SortType::New,None, Some(user_id), None, None, None, true, false, false, None, Some(std::i64::MAX))?;
+
+ for post in &posts {
+ let post_form = PostForm {
+ name: "*Permananently Deleted*".to_string(),
+ url: Some("https://deleted.com".to_string()),
+ body: Some("*Permananently Deleted*".to_string()),
+ creator_id: post.to_owned().creator_id,
+ community_id: post.to_owned().community_id,
+ removed: None,
+ deleted: Some(true),
+ nsfw: post.to_owned().nsfw,
+ locked: None,
+ stickied: None,
+ updated: Some(naive_now()),
+ };
+
+ let _updated_post = match Post::update(&conn, post.id, &post_form) {
+ Ok(post) => post,
+ Err(_e) => return Err(APIError::err(&self.op, "couldnt_update_post"))?,
+ };
+ }
+
+ Ok(LoginResponse {
+ op: self.op.to_string(),
+ jwt: data.auth.to_owned(),
+ })
+ }
+}
let res = Oper::new(user_operation, transfer_site).perform()?;
Ok(serde_json::to_string(&res)?)
}
+ UserOperation::DeleteAccount => {
+ let delete_account: DeleteAccount = serde_json::from_str(data)?;
+ let res = Oper::new(user_operation, delete_account).perform()?;
+ Ok(serde_json::to_string(&res)?)
+ }
}
}
loading: boolean;
userSettingsForm: UserSettingsForm;
userSettingsLoading: boolean;
+ deleteAccountLoading: boolean;
+ deleteAccountShowConfirm: boolean;
}
export class User extends Component<any, UserState> {
auth: null,
},
userSettingsLoading: null,
+ deleteAccountLoading: null,
+ deleteAccountShowConfirm: false,
}
constructor(props: any, context: any) {
</div>
<div class="form-group row mb-0">
<div class="col-12">
- <button type="submit" class="btn btn-secondary">{this.state.userSettingsLoading ?
+ <button type="submit" class="btn btn-secondary mr-4">{this.state.userSettingsLoading ?
<svg class="icon icon-spinner spin"><use xlinkHref="#icon-spinner"></use></svg> : capitalizeFirstLetter(i18n.t('save'))}</button>
+ <button class="btn btn-danger" onClick={linkEvent(this, this.handleDeleteAccountShowConfirmToggle)}><T i18nKey="delete_account">#</T></button>
+ {this.state.deleteAccountShowConfirm &&
+ <>
+ <div class="mt-2 alert alert-danger" role="alert"><T i18nKey="delete_account_confirm">#</T></div>
+ <button class="btn btn-danger mr-4" onClick={linkEvent(this, this.handleDeleteAccount)}>{this.state.deleteAccountLoading ?
+ <svg class="icon icon-spinner spin"><use xlinkHref="#icon-spinner"></use></svg> : capitalizeFirstLetter(i18n.t('yes'))}</button>
+ <button class="btn btn-secondary" onClick={linkEvent(this, this.handleDeleteAccountShowConfirmToggle)}><T i18nKey="cancel">#</T></button>
+ </>
+ }
</div>
</div>
</form>
WebSocketService.Instance.saveUserSettings(i.state.userSettingsForm);
}
+ handleDeleteAccountShowConfirmToggle(i: User, event: any) {
+ event.preventDefault();
+ i.state.deleteAccountShowConfirm = !i.state.deleteAccountShowConfirm;
+ i.setState(i.state);
+ }
+
+ handleDeleteAccount(i: User, event: any) {
+ event.preventDefault();
+ i.state.deleteAccountLoading = true;
+ i.setState(i.state);
+
+ WebSocketService.Instance.deleteAccount();
+ }
+
parseMessage(msg: any) {
console.log(msg);
let op: UserOperation = msgOp(msg);
this.setState(this.state);
let res: LoginResponse = msg;
UserService.Instance.login(res);
+ } else if (op == UserOperation.DeleteAccount) {
+ this.state.deleteAccountLoading = false;
+ this.state.deleteAccountShowConfirm = false;
+ this.setState(this.state);
+ this.context.router.history.push('/');
}
}
}
export enum UserOperation {
- Login, Register, CreateCommunity, CreatePost, ListCommunities, ListCategories, GetPost, GetCommunity, CreateComment, EditComment, SaveComment, CreateCommentLike, GetPosts, CreatePostLike, EditPost, SavePost, EditCommunity, FollowCommunity, GetFollowedCommunities, GetUserDetails, GetReplies, GetModlog, BanFromCommunity, AddModToCommunity, CreateSite, EditSite, GetSite, AddAdmin, BanUser, Search, MarkAllAsRead, SaveUserSettings, TransferCommunity, TransferSite
+ Login, Register, CreateCommunity, CreatePost, ListCommunities, ListCategories, GetPost, GetCommunity, CreateComment, EditComment, SaveComment, CreateCommentLike, GetPosts, CreatePostLike, EditPost, SavePost, EditCommunity, FollowCommunity, GetFollowedCommunities, GetUserDetails, GetReplies, GetModlog, BanFromCommunity, AddModToCommunity, CreateSite, EditSite, GetSite, AddAdmin, BanUser, Search, MarkAllAsRead, SaveUserSettings, TransferCommunity, TransferSite, DeleteAccount
}
export enum CommentSortType {
this.subject.next(this.wsSendWrapper(UserOperation.SaveUserSettings, userSettingsForm));
}
+ public deleteAccount() {
+ let form = {};
+ this.setAuth(form);
+ this.subject.next(this.wsSendWrapper(UserOperation.DeleteAccount, form));
+ }
+
private wsSendWrapper(op: UserOperation, data: any) {
let send = { op: UserOperation[op], data: data };
console.log(send);
mark_as_unread: 'mark as unread',
delete: 'delete',
deleted: 'deleted',
+ delete_account: 'Delete Account',
+ delete_account_confirm: 'Warning: this will permanently delete all your data. Are you sure?',
restore: 'restore',
ban: 'ban',
ban_from_site: 'ban from site',