Skip to content

Commit

Permalink
WIP
Browse files Browse the repository at this point in the history
  • Loading branch information
tsa96 committed Mar 12, 2024
1 parent c6fa2eb commit f2fbeea
Show file tree
Hide file tree
Showing 22 changed files with 313 additions and 791 deletions.
589 changes: 1 addition & 588 deletions apps/backend-e2e/src/admin.e2e-spec.ts

Large diffs are not rendered by default.

40 changes: 0 additions & 40 deletions apps/backend/src/app/dto/queries/map-queries.dto.ts
Original file line number Diff line number Diff line change
Expand Up @@ -7,13 +7,9 @@ import {
MapCreditsGetExpand,
MapsGetExpand,
MapsGetAllAdminQuery,
MapsGetAllAdminExpand,
MapsGetAllSubmissionQuery,
MapsGetAllSubmissionFilter,
MapsGetAllSubmissionExpand,
MapsGetAllSubmissionAdminExpand,
MapsGetAllSubmissionAdminFilter,
MapsGetAllSubmissionAdminQuery,
MapsGetAllAdminFilter,
MapsGetAllUserSubmissionQuery,
MapReviewGetIdQuery,
Expand Down Expand Up @@ -119,16 +115,6 @@ export class MapsGetAllAdminQueryDto
extends MapsGetAllBaseQueryDto
implements MapsGetAllAdminQuery
{
@ExpandQueryProperty([
'zones',
'leaderboards',
'info',
'stats',
'submitter',
'credits'
])
readonly expand?: MapsGetAllAdminExpand;

@EnumFilterQueryProperty([
MapStatusNew.APPROVED,
MapStatusNew.PRIVATE_TESTING,
Expand Down Expand Up @@ -172,32 +158,6 @@ export class MapsGetAllUserSubmissionQueryDto
extends OmitType(MapsGetAllSubmissionQueryDto, ['submitterID'] as const)
implements MapsGetAllUserSubmissionQuery {}

export class MapsGetAllSubmissionAdminQueryDto
extends MapsGetAllBaseQueryDto
implements MapsGetAllSubmissionAdminQuery
{
@ExpandQueryProperty([
'zones',
'leaderboards',
'info',
'stats',
'submitter',
'credits',
'currentVersion',
'versions',
'reviews'
])
readonly expand?: MapsGetAllSubmissionAdminExpand;

@EnumFilterQueryProperty([
MapStatusNew.PUBLIC_TESTING,
MapStatusNew.PRIVATE_TESTING,
MapStatusNew.CONTENT_APPROVAL,
MapStatusNew.FINAL_APPROVAL
])
readonly filter?: MapsGetAllSubmissionAdminFilter;
}

//#endregion
//#region Get

Expand Down
16 changes: 0 additions & 16 deletions apps/backend/src/app/modules/admin/admin.controller.ts
Original file line number Diff line number Diff line change
Expand Up @@ -39,7 +39,6 @@ import {
MapDto,
MapReviewDto,
MapsGetAllAdminQueryDto,
MapsGetAllSubmissionAdminQueryDto,
MergeUserDto,
PagedResponseDto,
ReportDto,
Expand Down Expand Up @@ -167,21 +166,6 @@ export class AdminController {
return this.mapsService.getAll(userID, query);
}

@Roles(RolesEnum.ADMIN, RolesEnum.MODERATOR, RolesEnum.REVIEWER)
@Get('/maps/submissions')
@ApiOperation({
description:
'Retrieve a paginated list of maps in submission with extra admin filtration'
})
@ApiOkPagedResponse(MapDto, { description: 'Paginated list of maps' })
@ApiBadRequestResponse({ description: 'Invalid query data' })
getMapSubmissions(
@LoggedInUser('id') userID: number,
@Query() query: MapsGetAllSubmissionAdminQueryDto
): Promise<PagedResponseDto<MapDto>> {
return this.mapsService.getAll(userID, query);
}

@Patch('/maps/:mapID')
@HttpCode(HttpStatus.NO_CONTENT)
@Roles(RolesEnum.REVIEWER, RolesEnum.MODERATOR, RolesEnum.ADMIN)
Expand Down
148 changes: 83 additions & 65 deletions apps/backend/src/app/modules/maps/maps.service.ts
Original file line number Diff line number Diff line change
Expand Up @@ -76,7 +76,6 @@ import {
MapInfoDto,
MapsGetAllAdminQueryDto,
MapsGetAllQueryDto,
MapsGetAllSubmissionAdminQueryDto,
MapsGetAllSubmissionQueryDto,
MapSummaryDto,
MapZonesDto,
Expand All @@ -85,7 +84,6 @@ import {
UpdateMapDto
} from '../../dto';
import { FileStoreService } from '../filestore/file-store.service';
import { LeaderboardRunsService } from '../runs/leaderboard-runs.service';
import { MapTestInviteService } from './map-test-invite.service';
import { MapImageService } from './map-image.service';
import {
Expand All @@ -101,8 +99,6 @@ export class MapsService {
@Inject(EXTENDED_PRISMA_SERVICE) private readonly db: ExtendedPrismaService,
private readonly config: ConfigService,
private readonly fileStoreService: FileStoreService,
@Inject(forwardRef(() => LeaderboardRunsService))
private readonly leaderboardRunService: LeaderboardRunsService,
@Inject(forwardRef(() => MapImageService))
private readonly mapImageService: MapImageService,
@Inject(forwardRef(() => MapTestInviteService))
Expand Down Expand Up @@ -132,7 +128,6 @@ export class MapsService {
| MapsGetAllQueryDto
| MapsGetAllAdminQueryDto
| MapsGetAllSubmissionQueryDto
| MapsGetAllSubmissionAdminQueryDto
): Promise<PagedResponseDto<MapDto>> {
// Where
const where: Prisma.MMapWhereInput = {};
Expand Down Expand Up @@ -194,10 +189,7 @@ export class MapsService {
where.leaderboardRuns[quantifier].gamemode = query.gamemode;
}
}
} else if (
query instanceof MapsGetAllSubmissionQueryDto ||
query instanceof MapsGetAllSubmissionAdminQueryDto
) {
} else if (query instanceof MapsGetAllSubmissionQueryDto) {
const user = await this.db.user.findUnique({
where: { id: userID },
select: { roles: true }
Expand Down Expand Up @@ -352,66 +344,86 @@ export class MapsService {
}
}

const submissionInclude: Prisma.MapSubmissionInclude = expandToIncludes(
query.expand,
{
only: ['currentVersion', 'versions'],
mappings: [
{
expand: 'versions',
model: 'versions',
value: {
select: {
hash: true,
hasVmf: true,
versionNum: true,
id: true,
createdAt: true,
// Changelog and zones are quite large structures so not worth
// ever including on the paginated query - make clients query
// for a specific submission if they want all that stuff
zones: false,
changelog: false
}
}
}
]
}
);
let incPB = false,
incWR = false;

// Select (and include)
const select: Prisma.MMapSelect = {
...this.baseMapsSelect,
submission: isEmpty(submissionInclude)
? true
: { include: submissionInclude },
...expandToIncludes(query.expand, {
without: ['currentVersion', 'versions', 'personalBest', 'worldRecord'],
mappings: [
{ expand: 'credits', value: { include: { user: true } } },
{
expand: 'inFavorites',
model: 'favorites',
value: { where: { userID: userID } }
},
{
expand: 'inLibrary',
model: 'libraryEntries',
value: { where: { userID: userID } }
}
]
})
};
// For admins we don't need dynamic expands, just give em everything.
let select: Prisma.MMapSelect;
if (query instanceof MapsGetAllAdminQueryDto) {
select = {
...this.baseMapsSelect,
submission: { include: { currentVersion: true, versions: true } },
info: true,
leaderboards: true,
images: true,
submitter: true,
credits: { include: { user: true } }
};
} else {
const submissionInclude: Prisma.MapSubmissionInclude = expandToIncludes(
query.expand,
{
only: ['currentVersion', 'versions'],
mappings: [
{
expand: 'versions',
model: 'versions',
value: {
select: {
hash: true,
hasVmf: true,
versionNum: true,
id: true,
createdAt: true,
// Changelog and zones are quite large structures so not worth
// ever including on the paginated query - make clients query
// for a specific submission if they want all that stuff
zones: false,
changelog: false
}
}
}
]
}
);

let incPB: boolean, incWR: boolean;
select = {
...this.baseMapsSelect,
submission: isEmpty(submissionInclude)
? true
: { include: submissionInclude },
...expandToIncludes(query.expand, {
without: [
'currentVersion',
'versions',
'personalBest',
'worldRecord'
],
mappings: [
{ expand: 'credits', value: { include: { user: true } } },
{
expand: 'inFavorites',
model: 'favorites',
value: { where: { userID: userID } }
},
{
expand: 'inLibrary',
model: 'libraryEntries',
value: { where: { userID: userID } }
}
]
})
};

if (
query instanceof MapsGetAllQueryDto ||
query instanceof MapsGetAllSubmissionQueryDto
) {
incPB = query.expand?.includes('personalBest');
incWR = query.expand?.includes('worldRecord');
this.handleMapGetIncludes(select, incPB, incWR, userID);
if (
query instanceof MapsGetAllQueryDto ||
query instanceof MapsGetAllSubmissionQueryDto
) {
incPB = query.expand?.includes('personalBest');
incWR = query.expand?.includes('worldRecord');
this.handleMapGetIncludes(select, incPB, incWR, userID);
}
}

const dbResponse = await this.db.mMap.findManyAndCount({
Expand Down Expand Up @@ -1498,11 +1510,17 @@ export class MapsService {

if (!map) throw new NotFoundException('No map found');

// Set hashes to null to give frontend easy to tell files have been deleted
await this.db.mMap.update({
where: { id: mapID },
data: { status: MapStatusNew.DISABLED, hash: null }
});

await this.db.mapSubmissionVersion.updateMany({
where: { submissionID: mapID },
data: { hash: null }
});

// Delete any stored map files. Doesn't matter if any of these don't exist.
await Promise.all(
[
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@
[src]="map.thumbnail?.small"
class="h-full w-full rounded-t border-b border-black border-opacity-5 transition-all group-hover:brightness-110"
/>
@if (isReleasedMap(map)) {
@if (isReleasedMap(map) && !isAdminPage) {
@if (map.currentModeLeaderboards; as lb) {
<div class="m-2 ml-auto mt-auto flex flex-wrap gap-2">
<!-- prettier-ignore -->
Expand Down Expand Up @@ -86,8 +86,19 @@
<a class="link text-gray-50" [routerLink]="'/profile/' + map.submitterID">{{ map.submitter.alias }}</a>
</p>
}
}
@if (isAdminPage) {
<p>
<span class="text-gray-300">Current Status: </span><span class="text-purple-200">{{ MapStatusName.get(map.status) }}</span>
@if (map.status !== MapStatus.DISABLED) {
<span class="text-gray-300">Current Status: </span>
<span class="font-medium text-purple-200">{{ MapStatusName.get(map.status) }}</span>
} @else {
<span class="text-gray-300">Current Status: </span>
<span class="font-medium text-red-200">{{ MapStatusName.get(map.status) }}</span>
<!-- @if (!map.hash) {-->
<span class="font-bold text-red-500">Files deleted! {{ map.hash }}</span>
<!-- }-->
}
</p>
}
</div>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@ import {
MapCreditType,
MapStatusName,
MapStatusNameNew,
MapStatusNew,
MMap
} from '@momentum/constants';
import { MessageService } from 'primeng/api';
Expand Down Expand Up @@ -45,9 +46,11 @@ export class MapListItemComponent implements OnChanges {
protected readonly GamemodeName = GamemodeName;
protected readonly LeaderboardType = LeaderboardType;
protected readonly MapStatusName = MapStatusNameNew;
protected readonly MapStatus = MapStatusNew;

@Input({ required: true }) map!: MMap | MapWithSpecificLeaderboard;
@Input() isSubmission = false;
@Input() isAdminPage = false;

@Output() libraryUpdate = new EventEmitter();
@Output() favoriteUpdate = new EventEmitter();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@
class="mb-4 grid gap-3 sm:grid-cols-1 md:grid-cols-2 lg:grid-cols-3 xl:grid-cols-4"
>
@for (map of maps; track $index) {
<m-map-list-item [map]="map" [isSubmission]="isSubmission" />
<m-map-list-item [map]="map" [isSubmission]="isSubmissionPage" [isAdminPage]="isAdminPage" />
} @empty {
<p class="col-span-full mx-auto my-12 h-32 text-center font-display text-48 font-bold">No maps found</p>
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,8 +12,9 @@ import { SpinnerComponent } from '../spinner/spinner.component';
imports: [MapListItemComponent, InfiniteScrollModule, SpinnerComponent]
})
export class MapListComponent {
@Input({ required: true }) isSubmission: boolean;
@Input({ required: true }) maps: MMap[];
@Input({ required: true }) loading: boolean;
@Input({ required: true }) loadMore: Subject<void>;
@Input() isSubmissionPage = false;
@Input() isAdminPage = false;
}
Original file line number Diff line number Diff line change
@@ -1,15 +1,16 @@
<m-card title="Admin Activity">
<p-dropdown
header
class="[&>*]:w-48"
placeholder="Activity type"
[options]="AdminActivitiesFilters"
optionLabel="text"
optionValue="value"
(onChange)="filterChange.next()"
[(ngModel)]="filter"
appendTo="body"
/>
<div header class="flex gap-4" [formGroup]="filters">
<p-dropdown
class="[&>*]:w-48"
placeholder="Activity Type"
[options]="AdminActivitiesFilters"
optionLabel="text"
optionValue="value"
formControlName="type"
appendTo="body"
/>
<m-user-search (selected)="filters.get('user').setValue($event.id)" />
</div>
<div [mSpinner]="loading">
<m-accordion [autoClose]="false" [startFirstOpen]="true">
@for (activity of activities; track activity) {
Expand Down
Loading

0 comments on commit f2fbeea

Please sign in to comment.