Skip to content

Commit 2359593

Browse files
feat: Implement admin settings module and add DTOs for user, veil, service, and gallery entities.
1 parent 6a0a571 commit 2359593

10 files changed

Lines changed: 162 additions & 8 deletions

File tree

backend/src/admin-settings/admin-settings.module.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,13 +6,15 @@ import {
66
AdminSettingsSchema,
77
AdminSettingsSchemaEntity,
88
} from './infrastructure/schemas/admin-settings.schema';
9+
import { AdminSettingsController } from './presentation/admin-settings.controller';
910

1011
@Module({
1112
imports: [
1213
MongooseModule.forFeature([
1314
{ name: AdminSettingsSchemaEntity.name, schema: AdminSettingsSchema },
1415
]),
1516
],
17+
controllers: [AdminSettingsController],
1618
providers: [AdminSettingsService, AdminSettingsRepository],
1719
exports: [AdminSettingsService],
1820
})

backend/src/admin-settings/application/admin-settings.service.ts

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,4 +17,10 @@ export class AdminSettingsService {
1717
): Promise<AdminSettings> {
1818
return this.adminSettingsRepository.updateSettings(settings);
1919
}
20+
21+
async createSettings(
22+
settings: Omit<AdminSettings, 'id'>,
23+
): Promise<AdminSettings> {
24+
return this.adminSettingsRepository.createSettings(settings);
25+
}
2026
}

backend/src/admin-settings/infrastructure/repositories/admin-settings.repository.ts

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,12 @@ export class AdminSettingsRepository {
2929
);
3030
return this.toDomain(doc);
3131
}
32+
async createSettings(
33+
settings: Omit<AdminSettings, 'id'>,
34+
): Promise<AdminSettings> {
35+
const doc = await this.settingsModel.create(settings);
36+
return this.toDomain(doc);
37+
}
3238

3339
private toDomain(doc: AdminSettingsDocument): AdminSettings {
3440
return new AdminSettings(
Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
import { Controller, Get, Body, Put, Post } from '@nestjs/common';
2+
import { AdminSettingsService } from '../application/admin-settings.service';
3+
import { AdminSettings } from '../domain/admin-settings.entity';
4+
import { UpdateAdminSettingsDto } from './dto/update-admin-settings.dto';
5+
import { CreateAdminSettingsDto } from './dto/create-admin-settings.dto';
6+
7+
@Controller('admin-settings')
8+
export class AdminSettingsController {
9+
constructor(private readonly adminSettingsService: AdminSettingsService) {}
10+
11+
@Get()
12+
async getSettings(): Promise<AdminSettings | null> {
13+
return this.adminSettingsService.getSettings();
14+
}
15+
16+
@Post()
17+
async createSettings(
18+
@Body() createAdminSettingsDto: CreateAdminSettingsDto,
19+
): Promise<AdminSettings> {
20+
const settings = {
21+
...createAdminSettingsDto,
22+
socialLinks: createAdminSettingsDto.socialLinks
23+
? new Map(Object.entries(createAdminSettingsDto.socialLinks))
24+
: new Map(),
25+
workHours: createAdminSettingsDto.workHours
26+
? new Map(Object.entries(createAdminSettingsDto.workHours))
27+
: new Map(),
28+
} as unknown as Omit<AdminSettings, 'id'>;
29+
30+
return this.adminSettingsService.createSettings(settings);
31+
}
32+
33+
@Put()
34+
async updateSettings(
35+
@Body() updateAdminSettingsDto: UpdateAdminSettingsDto,
36+
): Promise<AdminSettings> {
37+
const settings = {
38+
...updateAdminSettingsDto,
39+
socialLinks: updateAdminSettingsDto.socialLinks
40+
? new Map(Object.entries(updateAdminSettingsDto.socialLinks))
41+
: undefined,
42+
workHours: updateAdminSettingsDto.workHours
43+
? new Map(Object.entries(updateAdminSettingsDto.workHours))
44+
: undefined,
45+
};
46+
47+
// Remove undefined keys to avoid overriding with undefined
48+
Object.keys(settings).forEach(
49+
(key) => settings[key] === undefined && delete settings[key],
50+
);
51+
52+
return this.adminSettingsService.updateSettings(
53+
settings as unknown as Omit<AdminSettings, 'id'>,
54+
);
55+
}
56+
}
Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
import { Type } from 'class-transformer';
2+
import {
3+
IsString,
4+
IsNotEmpty,
5+
IsNumber,
6+
IsOptional,
7+
ValidateNested,
8+
IsObject,
9+
} from 'class-validator';
10+
11+
class LocationDto {
12+
@IsString()
13+
@IsNotEmpty()
14+
address: string;
15+
16+
@IsNumber()
17+
latitude: number;
18+
19+
@IsNumber()
20+
longitude: number;
21+
}
22+
23+
class OwnerInfoDto {
24+
@IsString()
25+
@IsNotEmpty()
26+
name: string;
27+
28+
@IsString()
29+
@IsNotEmpty()
30+
phoneNumber: string;
31+
}
32+
33+
export class CreateAdminSettingsDto {
34+
@ValidateNested()
35+
@Type(() => LocationDto)
36+
@IsNotEmpty()
37+
location: LocationDto;
38+
39+
@IsObject()
40+
@IsOptional()
41+
socialLinks: Record<string, string>;
42+
43+
@IsObject()
44+
@IsOptional()
45+
workHours: Record<string, string>;
46+
47+
@ValidateNested()
48+
@Type(() => OwnerInfoDto)
49+
@IsNotEmpty()
50+
ownerInfo: OwnerInfoDto;
51+
}
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
import { PartialType } from '@nestjs/mapped-types';
2+
import { CreateAdminSettingsDto } from './create-admin-settings.dto';
3+
4+
export class UpdateAdminSettingsDto extends PartialType(
5+
CreateAdminSettingsDto,
6+
) {}

backend/src/gallery/presentation/dto/create-gallery.dto.ts

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,11 @@
1-
import { IsString, IsNotEmpty, IsUrl, IsEnum, IsOptional, IsArray } from 'class-validator';
1+
import {
2+
IsString,
3+
IsNotEmpty,
4+
IsUrl,
5+
IsEnum,
6+
IsOptional,
7+
IsArray,
8+
} from 'class-validator';
29

310
export class CreateGalleryDto {
411
@IsString()

backend/src/service/presentation/dto/create-service.dto.ts

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,10 @@
1-
import { IsString, IsNotEmpty, IsNumber, IsEnum, IsOptional } from 'class-validator';
1+
import {
2+
IsString,
3+
IsNotEmpty,
4+
IsNumber,
5+
IsEnum,
6+
IsOptional,
7+
} from 'class-validator';
28

39
export class CreateServiceDto {
410
@IsString()
Lines changed: 12 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,12 @@
1-
import { IsString, IsNotEmpty, IsOptional, IsNumber, IsEnum, IsUrl } from 'class-validator';
1+
import {
2+
IsString,
3+
IsNotEmpty,
4+
IsOptional,
5+
IsNumber,
6+
IsEnum,
7+
IsUrl,
8+
isNotEmpty,
9+
} from 'class-validator';
210

311
export class CreateUserDto {
412
@IsNumber()
@@ -10,18 +18,17 @@ export class CreateUserDto {
1018
firstName: string;
1119

1220
@IsString()
13-
@IsOptional()
21+
@IsNotEmpty()
1422
lastName?: string;
1523

1624
@IsString()
17-
@IsOptional()
25+
@IsNotEmpty()
1826
username?: string;
1927

2028
@IsUrl()
21-
@IsOptional()
29+
@IsNotEmpty()
2230
photoUrl?: string;
2331

2432
@IsEnum(['user', 'admin'])
25-
@IsOptional()
2633
role?: 'user' | 'admin';
2734
}

backend/src/veil/presentation/dto/create-veil.dto.ts

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,11 @@
1-
import { IsString, IsNotEmpty, IsNumber, IsArray, IsOptional, IsBoolean } from 'class-validator';
1+
import {
2+
IsString,
3+
IsNotEmpty,
4+
IsNumber,
5+
IsArray,
6+
IsOptional,
7+
IsBoolean,
8+
} from 'class-validator';
29

310
export class CreateVeilDto {
411
@IsString()

0 commit comments

Comments
 (0)