Merge branch 'lighter_buckets_web' into lighter_buckets_server
This commit is contained in:
@@ -1,4 +1,7 @@
|
||||
import { IsString } from 'class-validator';
|
||||
import { ApiProperty } from '@nestjs/swagger';
|
||||
import { IsEnum, IsString } from 'class-validator';
|
||||
import { NotificationLevel, NotificationType } from 'src/enum';
|
||||
import { Optional, ValidateBoolean, ValidateDate, ValidateUUID } from 'src/validation';
|
||||
|
||||
export class TestEmailResponseDto {
|
||||
messageId!: string;
|
||||
@@ -11,3 +14,106 @@ export class TemplateDto {
|
||||
@IsString()
|
||||
template!: string;
|
||||
}
|
||||
|
||||
export class NotificationDto {
|
||||
id!: string;
|
||||
@ValidateDate()
|
||||
createdAt!: Date;
|
||||
@ApiProperty({ enum: NotificationLevel, enumName: 'NotificationLevel' })
|
||||
level!: NotificationLevel;
|
||||
@ApiProperty({ enum: NotificationType, enumName: 'NotificationType' })
|
||||
type!: NotificationType;
|
||||
title!: string;
|
||||
description?: string;
|
||||
data?: any;
|
||||
readAt?: Date;
|
||||
}
|
||||
|
||||
export class NotificationSearchDto {
|
||||
@Optional()
|
||||
@ValidateUUID({ optional: true })
|
||||
id?: string;
|
||||
|
||||
@IsEnum(NotificationLevel)
|
||||
@Optional()
|
||||
@ApiProperty({ enum: NotificationLevel, enumName: 'NotificationLevel' })
|
||||
level?: NotificationLevel;
|
||||
|
||||
@IsEnum(NotificationType)
|
||||
@Optional()
|
||||
@ApiProperty({ enum: NotificationType, enumName: 'NotificationType' })
|
||||
type?: NotificationType;
|
||||
|
||||
@ValidateBoolean({ optional: true })
|
||||
unread?: boolean;
|
||||
}
|
||||
|
||||
export class NotificationCreateDto {
|
||||
@Optional()
|
||||
@IsEnum(NotificationLevel)
|
||||
@ApiProperty({ enum: NotificationLevel, enumName: 'NotificationLevel' })
|
||||
level?: NotificationLevel;
|
||||
|
||||
@IsEnum(NotificationType)
|
||||
@Optional()
|
||||
@ApiProperty({ enum: NotificationType, enumName: 'NotificationType' })
|
||||
type?: NotificationType;
|
||||
|
||||
@IsString()
|
||||
title!: string;
|
||||
|
||||
@IsString()
|
||||
@Optional({ nullable: true })
|
||||
description?: string | null;
|
||||
|
||||
@Optional({ nullable: true })
|
||||
data?: any;
|
||||
|
||||
@ValidateDate({ optional: true, nullable: true })
|
||||
readAt?: Date | null;
|
||||
|
||||
@ValidateUUID()
|
||||
userId!: string;
|
||||
}
|
||||
|
||||
export class NotificationUpdateDto {
|
||||
@ValidateDate({ optional: true, nullable: true })
|
||||
readAt?: Date | null;
|
||||
}
|
||||
|
||||
export class NotificationUpdateAllDto {
|
||||
@ValidateUUID({ each: true, optional: true })
|
||||
ids!: string[];
|
||||
|
||||
@ValidateDate({ optional: true, nullable: true })
|
||||
readAt?: Date | null;
|
||||
}
|
||||
|
||||
export class NotificationDeleteAllDto {
|
||||
@ValidateUUID({ each: true })
|
||||
ids!: string[];
|
||||
}
|
||||
|
||||
export type MapNotification = {
|
||||
id: string;
|
||||
createdAt: Date;
|
||||
updateId?: string;
|
||||
level: NotificationLevel;
|
||||
type: NotificationType;
|
||||
data: any | null;
|
||||
title: string;
|
||||
description: string | null;
|
||||
readAt: Date | null;
|
||||
};
|
||||
export const mapNotification = (notification: MapNotification): NotificationDto => {
|
||||
return {
|
||||
id: notification.id,
|
||||
createdAt: notification.createdAt,
|
||||
level: notification.level,
|
||||
type: notification.type,
|
||||
title: notification.title,
|
||||
description: notification.description ?? undefined,
|
||||
data: notification.data ?? undefined,
|
||||
readAt: notification.readAt ?? undefined,
|
||||
};
|
||||
};
|
||||
|
||||
@@ -137,11 +137,6 @@ export class UserPreferencesUpdateDto {
|
||||
purchase?: PurchaseUpdate;
|
||||
}
|
||||
|
||||
class AvatarResponse {
|
||||
@ApiProperty({ enumName: 'UserAvatarColor', enum: UserAvatarColor })
|
||||
color!: UserAvatarColor;
|
||||
}
|
||||
|
||||
class RatingsResponse {
|
||||
enabled: boolean = false;
|
||||
}
|
||||
@@ -195,7 +190,6 @@ export class UserPreferencesResponseDto implements UserPreferences {
|
||||
ratings!: RatingsResponse;
|
||||
sharedLinks!: SharedLinksResponse;
|
||||
tags!: TagsResponse;
|
||||
avatar!: AvatarResponse;
|
||||
emailNotifications!: EmailNotificationsResponse;
|
||||
download!: DownloadResponse;
|
||||
purchase!: PurchaseResponse;
|
||||
|
||||
@@ -1,10 +1,9 @@
|
||||
import { ApiProperty } from '@nestjs/swagger';
|
||||
import { Transform } from 'class-transformer';
|
||||
import { IsBoolean, IsEmail, IsNotEmpty, IsNumber, IsString, Min } from 'class-validator';
|
||||
import { IsBoolean, IsEmail, IsEnum, IsNotEmpty, IsNumber, IsString, Min } from 'class-validator';
|
||||
import { User, UserAdmin } from 'src/database';
|
||||
import { UserAvatarColor, UserMetadataKey, UserStatus } from 'src/enum';
|
||||
import { UserMetadataItem } from 'src/types';
|
||||
import { getPreferences } from 'src/utils/preferences';
|
||||
import { Optional, ValidateBoolean, toEmail, toSanitized } from 'src/validation';
|
||||
|
||||
export class UserUpdateMeDto {
|
||||
@@ -23,6 +22,11 @@ export class UserUpdateMeDto {
|
||||
@IsString()
|
||||
@IsNotEmpty()
|
||||
name?: string;
|
||||
|
||||
@Optional({ nullable: true })
|
||||
@IsEnum(UserAvatarColor)
|
||||
@ApiProperty({ enumName: 'UserAvatarColor', enum: UserAvatarColor })
|
||||
avatarColor?: UserAvatarColor | null;
|
||||
}
|
||||
|
||||
export class UserResponseDto {
|
||||
@@ -41,13 +45,21 @@ export class UserLicense {
|
||||
activatedAt!: Date;
|
||||
}
|
||||
|
||||
const emailToAvatarColor = (email: string): UserAvatarColor => {
|
||||
const values = Object.values(UserAvatarColor);
|
||||
const randomIndex = Math.floor(
|
||||
[...email].map((letter) => letter.codePointAt(0) ?? 0).reduce((a, b) => a + b, 0) % values.length,
|
||||
);
|
||||
return values[randomIndex];
|
||||
};
|
||||
|
||||
export const mapUser = (entity: User | UserAdmin): UserResponseDto => {
|
||||
return {
|
||||
id: entity.id,
|
||||
email: entity.email,
|
||||
name: entity.name,
|
||||
profileImagePath: entity.profileImagePath,
|
||||
avatarColor: getPreferences(entity.email, (entity as UserAdmin).metadata || []).avatar.color,
|
||||
avatarColor: entity.avatarColor ?? emailToAvatarColor(entity.email),
|
||||
profileChangedAt: entity.profileChangedAt,
|
||||
};
|
||||
};
|
||||
@@ -69,6 +81,11 @@ export class UserAdminCreateDto {
|
||||
@IsString()
|
||||
name!: string;
|
||||
|
||||
@Optional({ nullable: true })
|
||||
@IsEnum(UserAvatarColor)
|
||||
@ApiProperty({ enumName: 'UserAvatarColor', enum: UserAvatarColor })
|
||||
avatarColor?: UserAvatarColor | null;
|
||||
|
||||
@Optional({ nullable: true })
|
||||
@IsString()
|
||||
@Transform(toSanitized)
|
||||
@@ -104,6 +121,11 @@ export class UserAdminUpdateDto {
|
||||
@IsNotEmpty()
|
||||
name?: string;
|
||||
|
||||
@Optional({ nullable: true })
|
||||
@IsEnum(UserAvatarColor)
|
||||
@ApiProperty({ enumName: 'UserAvatarColor', enum: UserAvatarColor })
|
||||
avatarColor?: UserAvatarColor | null;
|
||||
|
||||
@Optional({ nullable: true })
|
||||
@IsString()
|
||||
@Transform(toSanitized)
|
||||
|
||||
Reference in New Issue
Block a user