diff --git a/src/notes/alias.service.spec.ts b/src/notes/alias.service.spec.ts index 9e96901cf..597260b7b 100644 --- a/src/notes/alias.service.spec.ts +++ b/src/notes/alias.service.spec.ts @@ -33,6 +33,7 @@ import { UsersModule } from '../users/users.module'; import { Alias } from './alias.entity'; import { AliasService } from './alias.service'; import { Note } from './note.entity'; +import { NotesModule } from './notes.module'; import { NotesService } from './notes.service'; import { Tag } from './tag.entity'; @@ -72,6 +73,7 @@ describe('AliasService', () => { UsersModule, GroupsModule, RevisionsModule, + NotesModule, ], }) .overrideProvider(getRepositoryToken(Note)) diff --git a/src/notes/alias.service.ts b/src/notes/alias.service.ts index 82eab0ff8..12bccb207 100644 --- a/src/notes/alias.service.ts +++ b/src/notes/alias.service.ts @@ -3,7 +3,7 @@ * * SPDX-License-Identifier: AGPL-3.0-only */ -import { Inject, Injectable } from '@nestjs/common'; +import { forwardRef, Inject, Injectable } from '@nestjs/common'; import { InjectRepository } from '@nestjs/typeorm'; import { Repository } from 'typeorm'; @@ -25,7 +25,7 @@ export class AliasService { private readonly logger: ConsoleLoggerService, @InjectRepository(Note) private noteRepository: Repository, @InjectRepository(Alias) private aliasRepository: Repository, - @Inject(NotesService) private notesService: NotesService, + @Inject(forwardRef(() => NotesService)) private notesService: NotesService, ) { this.logger.setContext(AliasService.name); } diff --git a/src/notes/note-metadata.dto.ts b/src/notes/note-metadata.dto.ts index 21d0de6a8..deeef526b 100644 --- a/src/notes/note-metadata.dto.ts +++ b/src/notes/note-metadata.dto.ts @@ -15,6 +15,7 @@ import { } from 'class-validator'; import { BaseDto } from '../utils/base.dto.'; +import { AliasDto } from './alias.dto'; import { NotePermissionsDto } from './note-permissions.dto'; export class NoteMetadataDto extends BaseDto { @@ -29,16 +30,18 @@ export class NoteMetadataDto extends BaseDto { * All aliases of the note (including the primaryAlias) */ @IsArray() - @IsString({ each: true }) + @ValidateNested() @ApiProperty() - aliases: string[]; + aliases: AliasDto[]; /** - * The primary alias of the note + * The primary adress of the note + * If at least one alias is set, this is the primary alias + * If no alias is set, this is the note's ID */ @IsString() @ApiProperty() - primaryAlias: string | null; + primaryAddress: string; /** * Title of the note diff --git a/src/notes/notes.service.spec.ts b/src/notes/notes.service.spec.ts index 228e0f9fb..41eec47cd 100644 --- a/src/notes/notes.service.spec.ts +++ b/src/notes/notes.service.spec.ts @@ -31,6 +31,7 @@ import { Session } from '../users/session.entity'; import { User } from '../users/user.entity'; import { UsersModule } from '../users/users.module'; import { Alias } from './alias.entity'; +import { AliasService } from './alias.service'; import { NoteGroupPermissionUpdateDto, NoteUserPermissionUpdateDto, @@ -57,6 +58,7 @@ describe('NotesService', () => { const module: TestingModule = await Test.createTestingModule({ providers: [ NotesService, + AliasService, { provide: getRepositoryToken(Note), useClass: Repository, @@ -771,7 +773,7 @@ describe('NotesService', () => { const metadataDto = await service.toNoteMetadataDto(note); expect(metadataDto.id).toEqual(note.publicId); expect(metadataDto.aliases).toHaveLength(1); - expect(metadataDto.aliases[0]).toEqual((await note.aliases)[0].name); + expect(metadataDto.aliases[0].name).toEqual((await note.aliases)[0].name); expect(metadataDto.title).toEqual(note.title); expect(metadataDto.createdAt).toEqual(revisions[0].createdAt); expect(metadataDto.description).toEqual(note.description); @@ -873,7 +875,9 @@ describe('NotesService', () => { const noteDto = await service.toNoteDto(note); expect(noteDto.metadata.id).toEqual(note.publicId); expect(noteDto.metadata.aliases).toHaveLength(1); - expect(noteDto.metadata.aliases[0]).toEqual((await note.aliases)[0].name); + expect(noteDto.metadata.aliases[0].name).toEqual( + (await note.aliases)[0].name, + ); expect(noteDto.metadata.title).toEqual(note.title); expect(noteDto.metadata.createdAt).toEqual(revisions[0].createdAt); expect(noteDto.metadata.description).toEqual(note.description); diff --git a/src/notes/notes.service.ts b/src/notes/notes.service.ts index 8564a2d14..52db2639f 100644 --- a/src/notes/notes.service.ts +++ b/src/notes/notes.service.ts @@ -25,6 +25,7 @@ import { User } from '../users/user.entity'; import { UsersService } from '../users/users.service'; import { checkArrayForDuplicates } from '../utils/arrayDuplicatCheck'; import { Alias } from './alias.entity'; +import { AliasService } from './alias.service'; import { NoteMetadataDto } from './note-metadata.dto'; import { NotePermissionsDto, @@ -49,6 +50,7 @@ export class NotesService { private revisionsService: RevisionsService, @Inject(noteConfiguration.KEY) private noteConfig: NoteConfig, + @Inject(forwardRef(() => AliasService)) private aliasService: AliasService, ) { this.logger.setContext(NotesService.name); } @@ -397,9 +399,11 @@ export class NotesService { return { id: note.publicId, aliases: await Promise.all( - (await note.aliases).map((alias) => alias.name), + ( + await note.aliases + ).map((alias) => this.aliasService.toAliasDto(alias, note)), ), - primaryAlias: (await getPrimaryAlias(note)) ?? null, + primaryAddress: (await getPrimaryAlias(note)) ?? note.id, title: note.title ?? '', createdAt: (await this.getFirstRevision(note)).createdAt, description: note.description ?? '', diff --git a/test/private-api/alias.e2e-spec.ts b/test/private-api/alias.e2e-spec.ts index 94cb27919..700a5983a 100644 --- a/test/private-api/alias.e2e-spec.ts +++ b/test/private-api/alias.e2e-spec.ts @@ -75,8 +75,12 @@ describe('Alias', () => { const note = await agent1 .get(`/api/private/notes/${newAlias}`) .expect(200); - expect(note.body.metadata.aliases).toContain(newAlias); - expect(note.body.metadata.primaryAlias).toBeTruthy(); + expect(note.body.metadata.aliases).toContainEqual({ + name: 'normalAlias', + primaryAlias: false, + noteId: publicId, + }); + expect(note.body.metadata.primaryAddress).toEqual(testAlias); expect(note.body.metadata.id).toEqual(publicId); }); @@ -142,8 +146,12 @@ describe('Alias', () => { const note = await agent1 .get(`/api/private/notes/${newAlias}`) .expect(200); - expect(note.body.metadata.aliases).toContain(newAlias); - expect(note.body.metadata.primaryAlias).toBeTruthy(); + expect(note.body.metadata.aliases).toContainEqual({ + name: newAlias, + primaryAlias: true, + noteId: publicId, + }); + expect(note.body.metadata.primaryAddress).toEqual(newAlias); expect(note.body.metadata.id).toEqual(publicId); }); diff --git a/test/public-api/alias.e2e-spec.ts b/test/public-api/alias.e2e-spec.ts index 3036117f1..6c4d33fe3 100644 --- a/test/public-api/alias.e2e-spec.ts +++ b/test/public-api/alias.e2e-spec.ts @@ -52,8 +52,12 @@ describe('Alias', () => { .set('Authorization', `Bearer ${testSetup.authTokens[0].secret}`) .expect(200); - expect(note.body.metadata.aliases).toContain('normalAlias'); - expect(note.body.metadata.primaryAlias).toBeTruthy(); + expect(note.body.metadata.aliases).toContainEqual({ + name: 'normalAlias', + primaryAlias: false, + noteId: publicId, + }); + expect(note.body.metadata.primaryAddress).toEqual(testAlias); expect(note.body.metadata.id).toEqual(publicId); }); @@ -127,8 +131,12 @@ describe('Alias', () => { .set('Authorization', `Bearer ${testSetup.authTokens[0].secret}`) .expect(200); - expect(note.body.metadata.aliases).toContain(testAlias); - expect(note.body.metadata.primaryAlias).toBeTruthy(); + expect(note.body.metadata.aliases).toContainEqual({ + name: testAlias, + primaryAlias: true, + noteId: publicId, + }); + expect(note.body.metadata.primaryAddress).toEqual(testAlias); expect(note.body.metadata.id).toEqual(publicId); }); diff --git a/test/public-api/me.e2e-spec.ts b/test/public-api/me.e2e-spec.ts index 7a149cc43..1ecd6902d 100644 --- a/test/public-api/me.e2e-spec.ts +++ b/test/public-api/me.e2e-spec.ts @@ -179,7 +179,7 @@ describe('Me', () => { .expect(200); const noteMetaDtos = response.body as NoteMetadataDto[]; expect(noteMetaDtos).toHaveLength(1); - expect(noteMetaDtos[0].primaryAlias).toEqual(noteName); + expect(noteMetaDtos[0].primaryAddress).toEqual(noteName); expect(noteMetaDtos[0].updateUsername).toEqual(user.username); }); diff --git a/test/public-api/notes.e2e-spec.ts b/test/public-api/notes.e2e-spec.ts index a3389eb21..75e49dc53 100644 --- a/test/public-api/notes.e2e-spec.ts +++ b/test/public-api/notes.e2e-spec.ts @@ -276,8 +276,8 @@ describe('Notes', () => { .get('/api/v2/notes/test5/metadata') .expect(200); expect(typeof metadata.body.id).toEqual('string'); - expect(metadata.body.aliases).toEqual(['test5']); - expect(metadata.body.primaryAlias).toEqual('test5'); + expect(metadata.body.aliases[0].name).toEqual('test5'); + expect(metadata.body.primaryAddress).toEqual('test5'); expect(metadata.body.title).toEqual(''); expect(metadata.body.description).toEqual(''); expect(typeof metadata.body.createdAt).toEqual('string');