Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 7 additions & 0 deletions server/src/controllers/api-key.controller.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -59,6 +59,13 @@ describe(APIKeyController.name, () => {
expect(status).toBe(400);
expect(body).toEqual(factory.responses.badRequest(['id must be a UUID']));
});

it('should allow updating just the name', async () => {
const { status } = await request(ctx.getHttpServer())
.put(`/api-keys/${factory.uuid()}`)
.send({ name: 'new name' });
expect(status).toBe(200);
});
});

describe('DELETE /api-keys/:id', () => {
Expand Down
17 changes: 6 additions & 11 deletions server/src/dtos/activity.dto.ts
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
import { ApiProperty } from '@nestjs/swagger';
import { IsEnum, IsNotEmpty, IsString, ValidateIf } from 'class-validator';
import { IsNotEmpty, IsString, ValidateIf } from 'class-validator';
import { Activity } from 'src/database';
import { mapUser, UserResponseDto } from 'src/dtos/user.dto';
import { Optional, ValidateUUID } from 'src/validation';
import { ValidateEnum, ValidateUUID } from 'src/validation';

export enum ReactionType {
COMMENT = 'comment',
Expand All @@ -19,7 +19,7 @@ export type MaybeDuplicate<T> = { duplicate: boolean; value: T };
export class ActivityResponseDto {
id!: string;
createdAt!: Date;
@ApiProperty({ enumName: 'ReactionType', enum: ReactionType })
@ValidateEnum({ enum: ReactionType, name: 'ReactionType' })
type!: ReactionType;
user!: UserResponseDto;
assetId!: string | null;
Expand All @@ -43,14 +43,10 @@ export class ActivityDto {
}

export class ActivitySearchDto extends ActivityDto {
@IsEnum(ReactionType)
@Optional()
@ApiProperty({ enumName: 'ReactionType', enum: ReactionType })
@ValidateEnum({ enum: ReactionType, name: 'ReactionType', optional: true })
type?: ReactionType;

@IsEnum(ReactionLevel)
@Optional()
@ApiProperty({ enumName: 'ReactionLevel', enum: ReactionLevel })
@ValidateEnum({ enum: ReactionLevel, name: 'ReactionLevel', optional: true })
level?: ReactionLevel;

@ValidateUUID({ optional: true })
Expand All @@ -60,8 +56,7 @@ export class ActivitySearchDto extends ActivityDto {
const isComment = (dto: ActivityCreateDto) => dto.type === ReactionType.COMMENT;

export class ActivityCreateDto extends ActivityDto {
@IsEnum(ReactionType)
@ApiProperty({ enumName: 'ReactionType', enum: ReactionType })
@ValidateEnum({ enum: ReactionType, name: 'ReactionType' })
type!: ReactionType;

@ValidateIf(isComment)
Expand Down
22 changes: 8 additions & 14 deletions server/src/dtos/album.dto.ts
Original file line number Diff line number Diff line change
@@ -1,13 +1,13 @@
import { ApiProperty } from '@nestjs/swagger';
import { Type } from 'class-transformer';
import { ArrayNotEmpty, IsArray, IsEnum, IsString, ValidateNested } from 'class-validator';
import { ArrayNotEmpty, IsArray, IsString, ValidateNested } from 'class-validator';
import _ from 'lodash';
import { AlbumUser, AuthSharedLink, User } from 'src/database';
import { AssetResponseDto, MapAsset, mapAsset } from 'src/dtos/asset-response.dto';
import { AuthDto } from 'src/dtos/auth.dto';
import { UserResponseDto, mapUser } from 'src/dtos/user.dto';
import { AlbumUserRole, AssetOrder } from 'src/enum';
import { Optional, ValidateBoolean, ValidateUUID } from 'src/validation';
import { Optional, ValidateBoolean, ValidateEnum, ValidateUUID } from 'src/validation';

export class AlbumInfoDto {
@ValidateBoolean({ optional: true })
Expand All @@ -18,8 +18,7 @@ export class AlbumUserAddDto {
@ValidateUUID()
userId!: string;

@IsEnum(AlbumUserRole)
@ApiProperty({ enum: AlbumUserRole, enumName: 'AlbumUserRole', default: AlbumUserRole.EDITOR })
@ValidateEnum({ enum: AlbumUserRole, name: 'AlbumUserRole', default: AlbumUserRole.EDITOR })
role?: AlbumUserRole;
}

Expand All @@ -32,8 +31,7 @@ export class AlbumUserCreateDto {
@ValidateUUID()
userId!: string;

@IsEnum(AlbumUserRole)
@ApiProperty({ enum: AlbumUserRole, enumName: 'AlbumUserRole' })
@ValidateEnum({ enum: AlbumUserRole, name: 'AlbumUserRole' })
role!: AlbumUserRole;
}

Expand Down Expand Up @@ -71,9 +69,7 @@ export class UpdateAlbumDto {
@ValidateBoolean({ optional: true })
isActivityEnabled?: boolean;

@IsEnum(AssetOrder)
@Optional()
@ApiProperty({ enum: AssetOrder, enumName: 'AssetOrder' })
@ValidateEnum({ enum: AssetOrder, name: 'AssetOrder', optional: true })
order?: AssetOrder;
}

Expand Down Expand Up @@ -107,14 +103,13 @@ export class AlbumStatisticsResponseDto {
}

export class UpdateAlbumUserDto {
@IsEnum(AlbumUserRole)
@ApiProperty({ enum: AlbumUserRole, enumName: 'AlbumUserRole' })
@ValidateEnum({ enum: AlbumUserRole, name: 'AlbumUserRole' })
role!: AlbumUserRole;
}

export class AlbumUserResponseDto {
user!: UserResponseDto;
@ApiProperty({ enum: AlbumUserRole, enumName: 'AlbumUserRole' })
@ValidateEnum({ enum: AlbumUserRole, name: 'AlbumUserRole' })
role!: AlbumUserRole;
}

Expand All @@ -137,8 +132,7 @@ export class AlbumResponseDto {
startDate?: Date;
endDate?: Date;
isActivityEnabled!: boolean;
@Optional()
@ApiProperty({ enumName: 'AssetOrder', enum: AssetOrder })
@ValidateEnum({ enum: AssetOrder, name: 'AssetOrder', optional: true })
order?: AssetOrder;
}

Expand Down
14 changes: 5 additions & 9 deletions server/src/dtos/api-key.dto.ts
Original file line number Diff line number Diff line change
@@ -1,15 +1,13 @@
import { ApiProperty } from '@nestjs/swagger';
import { ArrayMinSize, IsEnum, IsNotEmpty, IsString } from 'class-validator';
import { ArrayMinSize, IsNotEmpty, IsString } from 'class-validator';
import { Permission } from 'src/enum';
import { Optional } from 'src/validation';
import { Optional, ValidateEnum } from 'src/validation';
export class APIKeyCreateDto {
@IsString()
@IsNotEmpty()
@Optional()
name?: string;

@IsEnum(Permission, { each: true })
@ApiProperty({ enum: Permission, enumName: 'Permission', isArray: true })
@ValidateEnum({ enum: Permission, name: 'Permission', each: true })
@ArrayMinSize(1)
permissions!: Permission[];
}
Expand All @@ -20,9 +18,7 @@ export class APIKeyUpdateDto {
@IsNotEmpty()
name?: string;

@Optional()
@IsEnum(Permission, { each: true })
@ApiProperty({ enum: Permission, enumName: 'Permission', isArray: true })
@ValidateEnum({ enum: Permission, name: 'Permission', each: true, optional: true })
@ArrayMinSize(1)
permissions?: Permission[];
}
Expand All @@ -37,6 +33,6 @@ export class APIKeyResponseDto {
name!: string;
createdAt!: Date;
updatedAt!: Date;
@ApiProperty({ enum: Permission, enumName: 'Permission', isArray: true })
@ValidateEnum({ enum: Permission, name: 'Permission', each: true })
permissions!: Permission[];
}
4 changes: 2 additions & 2 deletions server/src/dtos/asset-media-response.dto.ts
Original file line number Diff line number Diff line change
@@ -1,12 +1,12 @@
import { ApiProperty } from '@nestjs/swagger';
import { ValidateEnum } from 'src/validation';

export enum AssetMediaStatus {
CREATED = 'created',
REPLACED = 'replaced',
DUPLICATE = 'duplicate',
}
export class AssetMediaResponseDto {
@ApiProperty({ enum: AssetMediaStatus, enumName: 'AssetMediaStatus' })
@ValidateEnum({ enum: AssetMediaStatus, name: 'AssetMediaStatus' })
status!: AssetMediaStatus;
id!: string;
}
Expand Down
10 changes: 4 additions & 6 deletions server/src/dtos/asset-media.dto.ts
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
import { ApiProperty } from '@nestjs/swagger';
import { Type } from 'class-transformer';
import { ArrayNotEmpty, IsArray, IsEnum, IsNotEmpty, IsString, ValidateNested } from 'class-validator';
import { ArrayNotEmpty, IsArray, IsNotEmpty, IsString, ValidateNested } from 'class-validator';
import { AssetVisibility } from 'src/enum';
import { Optional, ValidateAssetVisibility, ValidateBoolean, ValidateDate, ValidateUUID } from 'src/validation';
import { Optional, ValidateBoolean, ValidateDate, ValidateEnum, ValidateUUID } from 'src/validation';

export enum AssetMediaSize {
/**
Expand All @@ -15,9 +15,7 @@ export enum AssetMediaSize {
}

export class AssetMediaOptionsDto {
@Optional()
@IsEnum(AssetMediaSize)
@ApiProperty({ enumName: 'AssetMediaSize', enum: AssetMediaSize })
@ValidateEnum({ enum: AssetMediaSize, name: 'AssetMediaSize', optional: true })
size?: AssetMediaSize;
}

Expand Down Expand Up @@ -60,7 +58,7 @@ export class AssetMediaCreateDto extends AssetMediaBase {
@ValidateBoolean({ optional: true })
isFavorite?: boolean;

@ValidateAssetVisibility({ optional: true })
@ValidateEnum({ enum: AssetVisibility, name: 'AssetVisibility', optional: true })
visibility?: AssetVisibility;

@ValidateUUID({ optional: true })
Expand Down
5 changes: 3 additions & 2 deletions server/src/dtos/asset-response.dto.ts
Original file line number Diff line number Diff line change
Expand Up @@ -15,10 +15,11 @@ import { UserResponseDto, mapUser } from 'src/dtos/user.dto';
import { AssetStatus, AssetType, AssetVisibility } from 'src/enum';
import { hexOrBufferToBase64 } from 'src/utils/bytes';
import { mimeTypes } from 'src/utils/mime-types';
import { ValidateEnum } from 'src/validation';

export class SanitizedAssetResponseDto {
id!: string;
@ApiProperty({ enumName: 'AssetTypeEnum', enum: AssetType })
@ValidateEnum({ enum: AssetType, name: 'AssetTypeEnum' })
type!: AssetType;
thumbhash!: string | null;
originalMimeType?: string;
Expand Down Expand Up @@ -72,7 +73,7 @@ export class AssetResponseDto extends SanitizedAssetResponseDto {
isArchived!: boolean;
isTrashed!: boolean;
isOffline!: boolean;
@ApiProperty({ enum: AssetVisibility, enumName: 'AssetVisibility' })
@ValidateEnum({ enum: AssetVisibility, name: 'AssetVisibility' })
visibility!: AssetVisibility;
exifInfo?: ExifResponseDto;
tags?: TagResponseDto[];
Expand Down
10 changes: 4 additions & 6 deletions server/src/dtos/asset.dto.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,6 @@ import { ApiProperty } from '@nestjs/swagger';
import { Type } from 'class-transformer';
import {
IsDateString,
IsEnum,
IsInt,
IsLatitude,
IsLongitude,
Expand All @@ -16,7 +15,7 @@ import {
import { BulkIdsDto } from 'src/dtos/asset-ids.response.dto';
import { AssetType, AssetVisibility } from 'src/enum';
import { AssetStats } from 'src/repositories/asset.repository';
import { Optional, ValidateAssetVisibility, ValidateBoolean, ValidateUUID } from 'src/validation';
import { Optional, ValidateBoolean, ValidateEnum, ValidateUUID } from 'src/validation';

export class DeviceIdDto {
@IsNotEmpty()
Expand All @@ -32,7 +31,7 @@ export class UpdateAssetBase {
@ValidateBoolean({ optional: true })
isFavorite?: boolean;

@ValidateAssetVisibility({ optional: true })
@ValidateEnum({ enum: AssetVisibility, name: 'AssetVisibility', optional: true })
visibility?: AssetVisibility;

@Optional()
Expand Down Expand Up @@ -99,13 +98,12 @@ export enum AssetJobName {
}

export class AssetJobsDto extends AssetIdsDto {
@ApiProperty({ enumName: 'AssetJobName', enum: AssetJobName })
@IsEnum(AssetJobName)
@ValidateEnum({ enum: AssetJobName, name: 'AssetJobName' })
name!: AssetJobName;
}

export class AssetStatsDto {
@ValidateAssetVisibility({ optional: true })
@ValidateEnum({ enum: AssetVisibility, name: 'AssetVisibility', optional: true })
visibility?: AssetVisibility;

@ValidateBoolean({ optional: true })
Expand Down
14 changes: 4 additions & 10 deletions server/src/dtos/job.dto.ts
Original file line number Diff line number Diff line change
@@ -1,28 +1,22 @@
import { ApiProperty } from '@nestjs/swagger';
import { IsEnum, IsNotEmpty } from 'class-validator';
import { JobCommand, ManualJobName, QueueName } from 'src/enum';
import { ValidateBoolean } from 'src/validation';
import { ValidateBoolean, ValidateEnum } from 'src/validation';

export class JobIdParamDto {
@IsNotEmpty()
@IsEnum(QueueName)
@ApiProperty({ type: String, enum: QueueName, enumName: 'JobName' })
@ValidateEnum({ enum: QueueName, name: 'JobName' })
id!: QueueName;
}

export class JobCommandDto {
@IsNotEmpty()
@IsEnum(JobCommand)
@ApiProperty({ type: 'string', enum: JobCommand, enumName: 'JobCommand' })
@ValidateEnum({ enum: JobCommand, name: 'JobCommand' })
command!: JobCommand;

@ValidateBoolean({ optional: true })
force?: boolean; // TODO: this uses undefined as a third state, which should be refactored to be more explicit
}

export class JobCreateDto {
@IsEnum(ManualJobName)
@ApiProperty({ type: 'string', enum: ManualJobName, enumName: 'ManualJobName' })
@ValidateEnum({ enum: ManualJobName, name: 'ManualJobName' })
name!: ManualJobName;
}

Expand Down
13 changes: 5 additions & 8 deletions server/src/dtos/memory.dto.ts
Original file line number Diff line number Diff line change
@@ -1,11 +1,11 @@
import { ApiProperty } from '@nestjs/swagger';
import { Type } from 'class-transformer';
import { IsEnum, IsInt, IsObject, IsPositive, ValidateNested } from 'class-validator';
import { IsInt, IsObject, IsPositive, ValidateNested } from 'class-validator';
import { Memory } from 'src/database';
import { AssetResponseDto, mapAsset } from 'src/dtos/asset-response.dto';
import { AuthDto } from 'src/dtos/auth.dto';
import { MemoryType } from 'src/enum';
import { Optional, ValidateBoolean, ValidateDate, ValidateUUID } from 'src/validation';
import { ValidateBoolean, ValidateDate, ValidateEnum, ValidateUUID } from 'src/validation';

class MemoryBaseDto {
@ValidateBoolean({ optional: true })
Expand All @@ -16,9 +16,7 @@ class MemoryBaseDto {
}

export class MemorySearchDto {
@Optional()
@IsEnum(MemoryType)
@ApiProperty({ enum: MemoryType, enumName: 'MemoryType' })
@ValidateEnum({ enum: MemoryType, name: 'MemoryType', optional: true })
type?: MemoryType;

@ValidateDate({ optional: true })
Expand All @@ -45,8 +43,7 @@ export class MemoryUpdateDto extends MemoryBaseDto {
}

export class MemoryCreateDto extends MemoryBaseDto {
@IsEnum(MemoryType)
@ApiProperty({ enum: MemoryType, enumName: 'MemoryType' })
@ValidateEnum({ enum: MemoryType, name: 'MemoryType' })
type!: MemoryType;

@IsObject()
Expand Down Expand Up @@ -86,7 +83,7 @@ export class MemoryResponseDto {
showAt?: Date;
hideAt?: Date;
ownerId!: string;
@ApiProperty({ enumName: 'MemoryType', enum: MemoryType })
@ValidateEnum({ enum: MemoryType, name: 'MemoryType' })
type!: MemoryType;
data!: MemoryData;
isSaved!: boolean;
Expand Down
Loading