From 6f1bdcbaa571c6c856cdbc6274613f6048654825 Mon Sep 17 00:00:00 2001 From: David Mehren Date: Sun, 13 Feb 2022 20:25:34 +0100 Subject: [PATCH] feat(revision): include author details in metadata dto Signed-off-by: David Mehren --- src/revisions/revision-metadata.dto.ts | 17 ++++++++++++++- src/revisions/revisions.service.ts | 29 +++++++++++++++++++++++++- 2 files changed, 44 insertions(+), 2 deletions(-) diff --git a/src/revisions/revision-metadata.dto.ts b/src/revisions/revision-metadata.dto.ts index 57fb062ed..19955ce55 100644 --- a/src/revisions/revision-metadata.dto.ts +++ b/src/revisions/revision-metadata.dto.ts @@ -5,7 +5,7 @@ */ import { ApiProperty } from '@nestjs/swagger'; import { Type } from 'class-transformer'; -import { IsDate, IsNumber } from 'class-validator'; +import { IsDate, IsNumber, IsString } from 'class-validator'; import { Revision } from './revision.entity'; @@ -34,4 +34,19 @@ export class RevisionMetadataDto { @IsNumber() @ApiProperty() length: number; + + /** + * List of the usernames that have contributed to this revision + * Does not include anonymous users + */ + @IsString() + @ApiProperty() + authorUsernames: string[]; + + /** + * Count of anonymous users that have contributed to this revision + */ + @IsNumber() + @ApiProperty() + anonymousAuthorCount: number; } diff --git a/src/revisions/revisions.service.ts b/src/revisions/revisions.service.ts index 3389ea962..16517f3da 100644 --- a/src/revisions/revisions.service.ts +++ b/src/revisions/revisions.service.ts @@ -16,6 +16,11 @@ import { RevisionMetadataDto } from './revision-metadata.dto'; import { RevisionDto } from './revision.dto'; import { Revision } from './revision.entity'; +class RevisionUserInfo { + usernames: string[]; + anonymousUserCount: number; +} + @Injectable() export class RevisionsService { constructor( @@ -103,20 +108,42 @@ export class RevisionsService { return revision; } - toRevisionMetadataDto(revision: Revision): RevisionMetadataDto { + async getRevisionUserInfo(revision: Revision): Promise { + const users = await Promise.all( + ( + await revision.edits + ).map(async (edit) => await (await edit.author).user), + ); + const usernames = users.flatMap((user) => (user ? [user.username] : [])); + const anonymousUserCount = users.filter((user) => user === null).length; + return { + usernames: usernames, + anonymousUserCount: anonymousUserCount, + }; + } + + async toRevisionMetadataDto( + revision: Revision, + ): Promise { + const revisionUserInfo = await this.getRevisionUserInfo(revision); return { id: revision.id, length: revision.length, createdAt: revision.createdAt, + authorUsernames: revisionUserInfo.usernames, + anonymousAuthorCount: revisionUserInfo.anonymousUserCount, }; } async toRevisionDto(revision: Revision): Promise { + const revisionUserInfo = await this.getRevisionUserInfo(revision); return { id: revision.id, content: revision.content, length: revision.length, createdAt: revision.createdAt, + authorUsernames: revisionUserInfo.usernames, + anonymousAuthorCount: revisionUserInfo.anonymousUserCount, patch: revision.patch, edits: await Promise.all( (