fixing ProfileUser CSS and adding delete account button, in progress

This commit is contained in:
Me
2023-01-17 15:41:48 +01:00
parent b7ebdc0b7c
commit 1e215261aa
7 changed files with 128 additions and 15 deletions

View File

@@ -334,6 +334,24 @@ export class FriendshipService {
return this.friendshipRepository.remove(friendship); return this.friendshipRepository.remove(friendship);
} }
async deleteAllFriendships(user : User) {
let friendships = await this.friendshipRepository
.createQueryBuilder('friendship')
.leftJoinAndSelect('friendship.sender', 'sender')
.leftJoinAndSelect('friendship.receiver', 'receiver')
.where('friendship.sender = :sender', { sender: user })
.orWhere('friendship.receiver = :receiver', { receiver: user})
.getMany()
// return this.friendshipRepository.remove(friendships);
// return this.friendshipRepository.delete(friendships);
for (const friendship of friendships) {
this.friendshipRepository.remove(friendship);
}
return true;
}
async findIfUserIsBlockedOrHasBlocked(userConnectedId: number, userToFindId: number) { async findIfUserIsBlockedOrHasBlocked(userConnectedId: number, userToFindId: number) {
// console.log("finding if user is blocked") // console.log("finding if user is blocked")
// console.log('user connected: ' + userConnectedId) // console.log('user connected: ' + userConnectedId)

View File

@@ -43,14 +43,14 @@ export class User {
@Column({ nullable: true }) @Column({ nullable: true })
secretTwoFactorAuth: string; secretTwoFactorAuth: string;
@OneToMany(type => Friendship , (friendship) => friendship.sender) @OneToMany(type => Friendship , (friendship) => friendship.sender, { onDelete: 'CASCADE' })
sentFriendRequest: Friendship[]; sentFriendRequest: Friendship[];
@OneToMany(type => Friendship , (friendship) => friendship.receiver) @OneToMany(type => Friendship , (friendship) => friendship.receiver, { onDelete: 'CASCADE' })
receivedFriendRequest: Friendship[]; receivedFriendRequest: Friendship[];
@JoinColumn() @JoinColumn()
@OneToOne(() => UserStats, { cascade: true }) @OneToOne(() => UserStats, { cascade: true, onDelete: 'CASCADE' })
stats: UserStats; stats: UserStats;
// ROOMS : // ROOMS :

View File

@@ -1,5 +1,5 @@
import { import {
Body, Controller, Delete, Get, NotFoundException,HttpStatus, Param, Patch, Post, Query, Redirect, Req, Res, UploadedFile, UseGuards, UseInterceptors Body, Controller, Delete, Get, NotFoundException,HttpStatus, Param, Patch, Post, Query, Redirect, Req, Res, UploadedFile, UseGuards, UseInterceptors, Next,
} from '@nestjs/common'; } from '@nestjs/common';
import { FileInterceptor } from '@nestjs/platform-express'; import { FileInterceptor } from '@nestjs/platform-express';
import { Response } from 'express'; import { Response } from 'express';
@@ -73,8 +73,14 @@ export class UsersController {
@UseGuards(AuthenticateGuard) @UseGuards(AuthenticateGuard)
@UseGuards(TwoFactorGuard) @UseGuards(TwoFactorGuard)
@Delete() @Delete()
remove(@Req() req) { remove(@Req() request, @Res() response, @Next() next) {
return this.usersService.remove(req.user.id); this.usersService.remove(request.user.id);
request.logout(function(err) {
if (err) { return next(err); }
response.redirect('/');
});
request.session.cookie.maxAge = 0;
return {msg : 'You have deleted your account'};
} }

View File

@@ -113,10 +113,23 @@ export class UsersService {
} }
async remove(id: number) { async remove(id: number) {
const user = await this.userRepository.findOneBy({id: id}); console.log("deleting a user user.services")
if (!user) // const user = await this.userRepository.findOneBy({id: id});
throw new HttpException(`The user could not be deleted.`,HttpStatus.NOT_FOUND); // if (!user)
return this.userRepository.remove(user); // throw new HttpException(`The user could not be deleted.`,HttpStatus.NOT_FOUND);
let deleting = await this.userRepository
.createQueryBuilder()
.delete()
.from(User)
.where("user.id = :id", { id: id })
.execute();
// this.friendshipService.deleteAllFriendships(user)
// return this.userRepository.remove(user.id);
console.log("done delete user users.service")
// await this.userRepository.delete(user);
} }
async enableTwoFactorAuth(id: number) { async enableTwoFactorAuth(id: number) {

View File

@@ -108,6 +108,24 @@
avatar = await fetchAvatar(user.username); avatar = await fetchAvatar(user.username);
} }
const deleteAccount = async() => {
console.log("deleting account")
await fetch(`http://${process.env.WEBSITE_HOST}:${process.env.WEBSITE_PORT}/api/v2/user`, {
method: "DELETE",
})
.then((response) => {
if (!response.ok) {
throw new Error("HTTP " + response.status);
}
console.log("account deleted")
push('/');
})
.catch((error) => {
console.log("catch unable to delete: ", error);
});
}
</script> </script>
@@ -152,6 +170,7 @@
</form> </form>
</Card> </Card>
</div> </div>
<Button type="primary" on:click={() => deleteAccount()}>Delete Account</Button>
</div> </div>
</main> </main>

View File

@@ -6,6 +6,7 @@
import Tabs from "../../pieces/Tabs.svelte"; import Tabs from "../../pieces/Tabs.svelte";
import { fetchUser, fetchAllUsers, fetchAvatar } from "../../pieces/utils"; import { fetchUser, fetchAllUsers, fetchAvatar } from "../../pieces/utils";
import { clickOutside } from '../../pieces/clickOutside'
let user; let user;
let allUsers = []; let allUsers = [];
@@ -26,6 +27,10 @@
let activeTabItem: string = "All Users"; let activeTabItem: string = "All Users";
let loadedUser; let loadedUser;
let showModal = false;
onMount(async () => { onMount(async () => {
user = await fetchUser(); user = await fetchUser();
@@ -166,8 +171,13 @@
const viewAUser = async (aUsername) => { const viewAUser = async (aUsername) => {
usernameBeingViewed = aUsername; usernameBeingViewed = aUsername;
await fetchFriendshipFull(aUsername); await fetchFriendshipFull(aUsername);
showModal = true;
}; };
const unViewAUser = () => {
showModal = false;
}
const acceptFriendRequest = async (relationshipId) => { const acceptFriendRequest = async (relationshipId) => {
await fetch(`http://${process.env.WEBSITE_HOST}:${process.env.WEBSITE_PORT}/api/v2/network/relations/${relationshipId}/accept`, await fetch(`http://${process.env.WEBSITE_HOST}:${process.env.WEBSITE_PORT}/api/v2/network/relations/${relationshipId}/accept`,
{ {
@@ -410,8 +420,9 @@
<!-- This next bit needs to all be in a window thing above the whatever --> <!-- This next bit needs to all be in a window thing above the whatever -->
<div class="main-display"> {#if showModal && usernameBeingViewed}
{#if usernameBeingViewed} <div class="main-display box backdrop" use:clickOutside on:outclick={() => unViewAUser()}>
<!-- {#if usernameBeingViewed} -->
<DisplayAUser aUsername={usernameBeingViewed} bind:loaded={loadedUser}/> <DisplayAUser aUsername={usernameBeingViewed} bind:loaded={loadedUser}/>
{#if loadedUser === true} {#if loadedUser === true}
@@ -453,9 +464,11 @@
<h1>Click on a user!</h1> <h1>Click on a user!</h1>
<h4>You'll see them displayed here</h4> <h4>You'll see them displayed here</h4>
</div> --> </div> -->
{/if} <!-- {/if} -->
<button on:click={() => unViewAUser()}>Close</button>
</div> </div>
{/if}
</div> </div>
</div> </div>
@@ -465,8 +478,8 @@
/* ok so i want a 12 column grid with a sidebar */ /* ok so i want a 12 column grid with a sidebar */
div.top-grid{ div.top-grid{
display: grid; /* display: grid; */
grid-template-columns: repeat(8, 1fr); /* grid-template-columns: repeat(8, 1fr); */
/* max-height: calc(100vh - 30vh); */ /* max-height: calc(100vh - 30vh); */
height: 85vh; height: 85vh;
/* margin: 0; */ /* margin: 0; */
@@ -545,5 +558,34 @@
width: 60px; width: 60px;
} }
/* Modal Stuff */
.box {
--width: 70vw;
--height: 60vh;
position: absolute;
width: var(--width);
height: var(--height);
left: calc(50% - var(--width) / 2);
top: calc(50% - var(--height) / 2);
display: flex;
align-items: center;
padding: 8px;
border-radius: 7px;
/* background-color: #ff3e00; */
/* color: #fff; */
text-align: center;
font-weight: bold;
}
.backdrop {
position: fixed;
top: 0;
bottom: 0;
right: 0;
left: 0;
background: rgba(0,0,0,0.50)
}
</style> </style>

View File

@@ -0,0 +1,15 @@
export function clickOutside(node) {
const handleClick = (event) => {
if (!node.contains(event.target)) {
node.dispatchEvent(new CustomEvent("outclick"));
}
};
document.addEventListener("click", handleClick, true);
return {
destroy() {
document.removeEventListener("click", handleClick, true);
}
};
}