Skip to content

Commit f396f9c

Browse files
feat: Implement treatments management module with full CRUD functionality and user interface.
1 parent 59c6c17 commit f396f9c

20 files changed

Lines changed: 707 additions & 468 deletions

backend/src/modules/treatments/infrastructure/repositories/treatments.repository.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,7 @@ export class TreatmentsRepository {
5656
doc.name,
5757
doc.description,
5858
doc.price,
59-
doc.durationMinutes,
59+
doc.duration,
6060
doc.category as 'medical' | 'beauty',
6161
doc.createdAt,
6262
);

backend/src/modules/treatments/infrastructure/schemas/treatments.schema.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ export class TreatmentsSchemaEntity {
1515
price: number;
1616

1717
@Prop({ required: true })
18-
durationMinutes: number;
18+
duration: number;
1919

2020
@Prop({ required: true, enum: ['medical', 'beauty'] })
2121
category: string;

backend/src/modules/treatments/presentation/dto/create-treatments.dto.ts

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

94
export class CreateServiceDto {
105
@IsString()
@@ -17,11 +12,13 @@ export class CreateServiceDto {
1712

1813
@IsNumber()
1914
@IsNotEmpty()
15+
@Type(() => Number)
2016
price: number;
2117

2218
@IsNumber()
2319
@IsNotEmpty()
24-
durationMinutes: number;
20+
@Type(() => Number)
21+
duration: number;
2522

2623
@IsEnum(['medical', 'beauty'])
2724
@IsNotEmpty()

backend/src/modules/treatments/presentation/treatments.controller.ts

Lines changed: 16 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -6,13 +6,15 @@ import {
66
Put,
77
Param,
88
Delete,
9+
UploadedFiles,
910
} from '@nestjs/common';
1011
import { TreatmentsService } from '@modules/treatments';
1112
import { Treatments } from '@modules/treatments';
12-
import { CreateServiceDto } from '@modules/treatments';
13-
import { UpdateServiceDto } from '@modules/treatments';
13+
import { CreateServiceDto as CreateTreatmentDto } from '@modules/treatments';
14+
import { UpdateServiceDto as UpdateTreatmentDto } from '@modules/treatments';
15+
import { title } from 'process';
1416

15-
@Controller('services')
17+
@Controller('treatments')
1618
export class TreatmentsController {
1719
constructor(private readonly treatmentsService: TreatmentsService) {}
1820

@@ -28,23 +30,28 @@ export class TreatmentsController {
2830

2931
@Post()
3032
async create(
31-
@Body() createServiceDto: CreateServiceDto,
32-
): Promise<Treatments> {
33-
const service = createServiceDto as unknown as Omit<
33+
@Body() createTreatmentDto: any,
34+
@UploadedFiles() files: Array<Express.Multer.File>,
35+
): Promise<any> {
36+
console.log('Create Treatments');
37+
console.log(createTreatmentDto);
38+
39+
const treatment = createTreatmentDto as unknown as Omit<
3440
Treatments,
3541
'id' | 'createdAt'
3642
>;
37-
return this.treatmentsService.create(service);
43+
return { title: 'string' };
44+
return this.treatmentsService.create(treatment);
3845
}
3946

4047
@Put(':id')
4148
async update(
4249
@Param('id') id: string,
43-
@Body() updateServiceDto: UpdateServiceDto,
50+
@Body() updateTreatmentDto: UpdateTreatmentDto,
4451
): Promise<Treatments> {
4552
return this.treatmentsService.update(
4653
id,
47-
updateServiceDto as unknown as Partial<Treatments>,
54+
updateTreatmentDto as unknown as Partial<Treatments>,
4855
);
4956
}
5057

frontend/src/app.routes.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -65,7 +65,7 @@ export const routes: Routes = [
6565
{
6666
path: "treatments",
6767
loadComponent: () =>
68-
import("@pages/services-catalog").then(
68+
import("@pages/treatments-catalog").then(
6969
(m) => m.ServicesCatalogComponent,
7070
),
7171
},
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
export * from "./treatments.service";

frontend/src/entities/treatments/treatments.service.ts

Lines changed: 17 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,33 +1,35 @@
11
import { Injectable, inject, signal } from "@angular/core";
22
import { HttpClient } from "@angular/common/http";
33
import { Observable, tap } from "rxjs";
4-
import { Treatment } from "@features/treatments";
4+
import { TreatmentItem } from "@features/treatments";
55
import { deleteArrayItemById, formDataExcludeProperty } from "@shared/lib";
66
import { API_ENDPOINTS } from "@core/constants";
77

8-
@Injectable()
8+
@Injectable({
9+
providedIn: "root",
10+
})
911
export class TreatmentsService {
1012
private http = inject(HttpClient);
1113

1214
// State
13-
private _treatments = signal<Treatment[]>([]);
15+
private _treatments = signal<TreatmentItem[]>([]);
1416
treatments = this._treatments.asReadonly();
1517

16-
getTreatments(): Observable<Treatment[]> {
18+
getTreatments(): Observable<TreatmentItem[]> {
1719
return this.http
18-
.get<Treatment[]>(API_ENDPOINTS.TREATMENTS.BASE)
20+
.get<TreatmentItem[]>(API_ENDPOINTS.TREATMENTS.BASE)
1921
.pipe(tap((treatments) => this._treatments.set(treatments)));
2022
}
2123

22-
getTreatment(id: string): Observable<Treatment> {
23-
return this.http.get<Treatment>(API_ENDPOINTS.TREATMENTS.URL_BY_ID(id));
24+
getTreatment(id: string): Observable<TreatmentItem> {
25+
return this.http.get<TreatmentItem>(API_ENDPOINTS.TREATMENTS.URL_BY_ID(id));
2426
}
2527

2628
createTreatment(
27-
treatment: Omit<Treatment, "id"> | FormData,
28-
): Observable<Treatment> {
29+
treatment: Omit<TreatmentItem, "id"> | FormData,
30+
): Observable<TreatmentItem> {
2931
return this.http
30-
.post<Treatment>(API_ENDPOINTS.TREATMENTS.BASE, treatment)
32+
.post<TreatmentItem>(API_ENDPOINTS.TREATMENTS.BASE, treatment)
3133
.pipe(
3234
tap((newTreatment) =>
3335
this._treatments.update((treatments) => [
@@ -38,14 +40,14 @@ export class TreatmentsService {
3840
);
3941
}
4042

41-
updateTreatment(id: string, treatment: FormData): Observable<Treatment> {
43+
updateTreatment(id: string, treatment: FormData): Observable<TreatmentItem> {
4244
const updatedTreatment = formDataExcludeProperty(treatment, [
4345
"id",
4446
"createdAt",
4547
"updatedAt",
4648
]);
4749
return this.http
48-
.put<Treatment>(API_ENDPOINTS.TREATMENTS.URL_BY_ID(id), treatment)
50+
.put<TreatmentItem>(API_ENDPOINTS.TREATMENTS.URL_BY_ID(id), treatment)
4951
.pipe(
5052
tap((updatedTreatment) =>
5153
this._treatments.update((treatments) =>
@@ -69,6 +71,8 @@ export class TreatmentsService {
6971
}
7072

7173
private deleteItemById(id: string) {
72-
this._treatments.set(deleteArrayItemById<Treatment>(id, this.treatments()));
74+
this._treatments.set(
75+
deleteArrayItemById<TreatmentItem>(id, this.treatments()),
76+
);
7377
}
7478
}

frontend/src/features/treatments/model/treatments.data.ts

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,13 @@
11
import { required } from "@angular/forms/signals";
22

3-
export interface Treatment {
4-
id: string;
3+
export interface TreatmentItem {
4+
id: string | number;
55
name: string;
6+
category: string;
67
description: string;
78
price: number;
89
duration: number;
9-
image: string;
10+
image?: string;
1011
createdAt: string;
1112
updatedAt: string;
1213
active: boolean;

frontend/src/pages/services-catalog/index.ts

Lines changed: 0 additions & 1 deletion
This file was deleted.

frontend/src/pages/services-catalog/services-catalog.component.ts

Lines changed: 0 additions & 76 deletions
This file was deleted.

0 commit comments

Comments
 (0)