Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Cleaning up profile page #944

Merged
merged 8 commits into from
May 25, 2024
Merged
24 changes: 12 additions & 12 deletions apps/backend-e2e/src/admin.e2e-spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -339,7 +339,7 @@ describe('Admin', () => {
expect(res.body.alias).toBe('Barry 2');
await expectAdminActivityWasCreated(
admin.id,
AdminActivityType.USER_UPDATE_ALIAS
AdminActivityType.USER_UPDATE
);
});

Expand Down Expand Up @@ -385,7 +385,7 @@ describe('Admin', () => {
expect(res.body.bio).toBe(bio);
await expectAdminActivityWasCreated(
admin.id,
AdminActivityType.USER_UPDATE_BIO
AdminActivityType.USER_UPDATE
);
});

Expand All @@ -404,7 +404,7 @@ describe('Admin', () => {
expect(userDB.bans).toBe(bans);
await expectAdminActivityWasCreated(
admin.id,
AdminActivityType.USER_UPDATE_BANS
AdminActivityType.USER_UPDATE
);
});

Expand All @@ -421,7 +421,7 @@ describe('Admin', () => {
expect(Bitflags.has(userDB.roles, Role.MAPPER)).toBe(true);
await expectAdminActivityWasCreated(
admin.id,
AdminActivityType.USER_UPDATE_ROLES
AdminActivityType.USER_UPDATE
);
});

Expand Down Expand Up @@ -2385,7 +2385,7 @@ describe('Admin', () => {
});
await prisma.adminActivity.create({
data: {
type: AdminActivityType.USER_UPDATE_ALIAS,
type: AdminActivityType.USER_UPDATE,
target: u1.id,
oldData: {},
newData: { profile: { alias: 'yes' } },
Expand All @@ -2394,10 +2394,10 @@ describe('Admin', () => {
});
await prisma.adminActivity.create({
data: {
type: AdminActivityType.USER_UPDATE_BIO,
type: AdminActivityType.USER_DELETE,
target: u1.id,
oldData: {},
newData: { profile: { bio: 'yes' } },
newData: { roles: Role.DELETED },
user: { connect: { id: admin.id } }
}
});
Expand All @@ -2416,10 +2416,10 @@ describe('Admin', () => {
expect(adminActivities.body).toHaveProperty('data');

expect(adminActivities.body.data[0].type).toEqual(
AdminActivityType.USER_UPDATE_BIO
AdminActivityType.USER_DELETE
);
expect(adminActivities.body.data[1].type).toEqual(
AdminActivityType.USER_UPDATE_ALIAS
AdminActivityType.USER_UPDATE
);
});

Expand All @@ -2431,7 +2431,7 @@ describe('Admin', () => {
query: {
filter: [
AdminActivityType.MAP_UPDATE,
AdminActivityType.USER_UPDATE_BIO
AdminActivityType.USER_UPDATE
]
},
validatePaged: { type: AdminActivityDto, count: 2 }
Expand All @@ -2440,7 +2440,7 @@ describe('Admin', () => {
expect(adminActivities.body).toHaveProperty('data');

expect(adminActivities.body.data[0].type).toEqual(
AdminActivityType.USER_UPDATE_BIO
AdminActivityType.USER_UPDATE
);
expect(adminActivities.body.data[1].type).toEqual(
AdminActivityType.MAP_UPDATE
Expand Down Expand Up @@ -2499,7 +2499,7 @@ describe('Admin', () => {
expect(adminActivities.body).toHaveProperty('data');

const userUpdateActivity = adminActivities.body.data.find(
(activity) => activity.type == AdminActivityType.USER_UPDATE_ALIAS
(activity) => activity.type == AdminActivityType.USER_UPDATE
);

expect(userUpdateActivity.oldData).toEqual(
Expand Down
36 changes: 30 additions & 6 deletions apps/backend-e2e/src/users.e2e-spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,12 @@ import {
NULL_ID,
RequestUtil
} from '@momentum/test-utils';
import { ActivityType, MapCreditType } from '@momentum/constants';
import {
ActivityType,
MapCreditType,
MapStatus,
Role
} from '@momentum/constants';
import { PrismaClient } from '@prisma/client';
import {
setupE2ETestEnvironment,
Expand Down Expand Up @@ -496,25 +501,44 @@ describe('Users', () => {

describe('users/{userID}/credits', () => {
describe('GET', () => {
let user, token;
let user, token, modToken;

beforeAll(async () => {
[user, token] = await db.createAndLoginUser();
modToken = await db.loginNewUser({ data: { roles: Role.MODERATOR } });
await db.createMaps(2, {
credits: { create: { type: MapCreditType.AUTHOR, userID: user.id } }
});
await db.createMap({
credits: { create: { type: MapCreditType.AUTHOR, userID: user.id } },
status: MapStatus.PRIVATE_TESTING
});
});

afterAll(() => db.cleanup('user', 'mMap'));

it('should respond with a list of map credits for a specific user', () => {
it('should respond with a list of map credits for approved maps for a specific user', () =>
req.get({
url: `users/${user.id}/credits`,
status: 200,
validatePaged: { type: MapCreditDto, count: 2 }
}));

it('should respond with a full list of map credits if local user is the same as requested user', () =>
req.get({
url: `users/${user.id}/credits`,
status: 200,
validatePaged: { type: MapCreditDto, count: 2 },
validatePaged: { type: MapCreditDto, count: 3 },
token
});
});
}));

it('should respond with a full list of map credits if local user is admin or mod', () =>
req.get({
url: `users/${user.id}/credits`,
status: 200,
validatePaged: { type: MapCreditDto, count: 3 },
token: modToken
}));

it('should respond with limited list of credits with take parameter', () =>
req.takeTest({
Expand Down
9 changes: 4 additions & 5 deletions apps/backend/src/app/dto/queries/admin-queries.dto.ts
Original file line number Diff line number Diff line change
Expand Up @@ -27,17 +27,16 @@ export class AdminGetReportsQueryDto
export class AdminGetAdminActivitiesQueryDto extends PagedQueryDto {
@EnumFilterQueryProperty(
[
AdminActivityType.USER_UPDATE_ROLES,
AdminActivityType.USER_UPDATE_BANS,
AdminActivityType.USER_UPDATE_ALIAS,
AdminActivityType.USER_UPDATE_BIO,
AdminActivityType.USER_UPDATE,
AdminActivityType.USER_CREATE_PLACEHOLDER,
AdminActivityType.USER_MERGE,
AdminActivityType.USER_DELETE,
AdminActivityType.MAP_UPDATE,
AdminActivityType.MAP_CONTENT_DELETE,
AdminActivityType.REPORT_UPDATE,
AdminActivityType.REPORT_RESOLVE
AdminActivityType.REPORT_RESOLVE,
AdminActivityType.REVIEW_DELETED,
AdminActivityType.REVIEW_COMMENT_DELETED
],
{
description: 'Types of activities to include'
Expand Down
51 changes: 10 additions & 41 deletions apps/backend/src/app/modules/admin/admin.service.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
import {
BadRequestException,
ConflictException,
ForbiddenException,
Inject,
Injectable,
Expand All @@ -21,12 +20,14 @@ import {
import { EXTENDED_PRISMA_SERVICE } from '../database/db.constants';
import { ExtendedPrismaService } from '../database/prisma.extension';
import { AdminActivityService } from './admin-activity.service';
import { UsersService } from '../users/users.service';

@Injectable()
export class AdminService {
constructor(
@Inject(EXTENDED_PRISMA_SERVICE) private readonly db: ExtendedPrismaService,
private readonly adminActivityService: AdminActivityService
private readonly adminActivityService: AdminActivityService,
private readonly usersService: UsersService
) {}

async createPlaceholderUser(
Expand Down Expand Up @@ -195,17 +196,12 @@ export class AdminService {

if (!user) throw new NotFoundException('User not found');

const activities = [];

const updateInput: Prisma.UserUpdateInput = {};

if (update.bans !== undefined && user.bans !== update.bans) {
updateInput.bans = update.bans;
activities.push(AdminActivityType.USER_UPDATE_BANS);
}

let newRoles: number;

if (update.roles !== undefined && user.roles !== update.roles) {
const admin = await this.db.user.findUnique({
where: { id: adminID },
Expand Down Expand Up @@ -243,47 +239,20 @@ export class AdminService {

// If all we make it through all these checks, finally we can update the flags
updateInput.roles = update.roles;
activities.push(AdminActivityType.USER_UPDATE_ROLES);

newRoles = update.roles;
} else {
newRoles = user.roles;
}

if (update.alias && update.alias !== user.alias) {
if (Bitflags.has(newRoles, Role.VERIFIED)) {
const sameNameMatches = await this.db.user.findMany({
where: { alias: update.alias },
select: { roles: true }
});
if (
sameNameMatches.some((user) =>
Bitflags.has(user.roles, Role.VERIFIED)
)
)
throw new ConflictException(
'Alias is in use by another verified user'
);
}

updateInput.alias = update.alias;
activities.push(AdminActivityType.USER_UPDATE_ALIAS);
}

if (update.bio && user.profile.bio !== update.bio) {
updateInput.profile = { update: { bio: update.bio } };
activities.push(AdminActivityType.USER_UPDATE_BIO);
if (updateInput.bans !== undefined || updateInput.roles !== undefined) {
await this.db.user.update({
where: { id: userID },
data: updateInput
});
}

const updatedUser = await this.db.user.update({
where: { id: userID },
data: updateInput,
include: { profile: true }
});
const updatedUser = await this.usersService.update(userID, update, true);

await this.adminActivityService.create(
adminID,
activities,
AdminActivityType.USER_UPDATE,
userID,
updatedUser,
user
Expand Down
4 changes: 2 additions & 2 deletions apps/backend/src/app/modules/user/user.controller.ts
Original file line number Diff line number Diff line change
Expand Up @@ -85,11 +85,11 @@ export class UserController {
})
@ApiNoContentResponse({ description: 'The user was successfully updated' })
@ApiBadRequestResponse({ description: 'Invalid update data' })
updateUser(
async updateUser(
@LoggedInUser('id') userID: number,
@Body() updateDto: UpdateUserDto
) {
return this.usersService.update(userID, updateDto);
await this.usersService.update(userID, updateDto);
}

@Delete()
Expand Down
8 changes: 5 additions & 3 deletions apps/backend/src/app/modules/users/users.controller.ts
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@ import {
} from '../../dto';
import { ParseIntSafePipe } from '../../pipes';
import { UsersService } from './users.service';
import { BypassJwtAuth } from '../../decorators';
import { BypassJwtAuth, LoggedInUser } from '../../decorators';

@Controller('users')
@BypassJwtAuth()
Expand Down Expand Up @@ -171,13 +171,15 @@ export class UsersController {
})
getMapCredits(
@Param('userID', ParseIntSafePipe) userID: number,
@Query() query: UsersGetCreditsQueryDto
@Query() query: UsersGetCreditsQueryDto,
@LoggedInUser('id') localUserID?: number
): Promise<PagedResponseDto<MapCreditDto>> {
return this.usersService.getMapCredits(
userID,
query.expand,
query.skip,
query.take
query.take,
localUserID
);
}

Expand Down
Loading
Loading