Skip to content

Commit 40cba84

Browse files
committed
main
1 parent de554dd commit 40cba84

9 files changed

Lines changed: 164 additions & 0 deletions

File tree

src/adapters/controllers/PlanController.ts

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,10 @@ import { EditElevation, EditElevationRequest } from '@use-cases/plan/EditElevati
1919
import { EditDifferentialLeveling, EditDifferentialLevelingRequest } from '@use-cases/plan/EditDifferentialLeveling';
2020
import { EditTopoBoundary, EditTopoBoundaryRequest } from '@use-cases/plan/EditTopoBoundary';
2121
import { EditTopoSetting, EditTopoSettingRequest } from '@use-cases/plan/EditTopoSetting';
22+
import {
23+
EditLongitudinalProfileParameters,
24+
EditLongitudinalProfileParametersRequest,
25+
} from '@use-cases/plan/EditLongitudinalProfileParameters';
2226

2327
export class PlanController {
2428
constructor(
@@ -36,6 +40,7 @@ export class PlanController {
3640
private readonly editDifferentialLevelingUseCase: EditDifferentialLeveling,
3741
private readonly editTopoBoundaryUseCase: EditTopoBoundary,
3842
private readonly editTopoSettingUseCase: EditTopoSetting,
43+
private readonly editLongitudinalProfileParametersUseCase: EditLongitudinalProfileParameters,
3944
) {}
4045

4146
async createPlan(
@@ -297,6 +302,7 @@ export class PlanController {
297302
page_orientation: 1,
298303
footers: 1,
299304
footer_size: 1,
305+
dxf_version: 1,
300306
created_at: 1,
301307
updated_at: 1,
302308
},
@@ -434,4 +440,38 @@ export class PlanController {
434440
return handleError(e);
435441
}
436442
}
443+
444+
async editLongitudinalProfileParameters(
445+
req: HttpRequest<
446+
EditLongitudinalProfileParametersRequest['params'],
447+
{ plan_id: string },
448+
undefined,
449+
undefined,
450+
AuthenticateResponse
451+
>,
452+
): Promise<HttpResponse<Plan | Error>> {
453+
try {
454+
const error = PlanValidator.validateEditLongitudinalProfileParameters(req.body);
455+
if (error) {
456+
return badRequest(error);
457+
}
458+
459+
const plan = await this.editLongitudinalProfileParametersUseCase.execute({
460+
plan_id: req.params!.plan_id,
461+
params: req.body!,
462+
options: {
463+
filter: { user: req.user!.id },
464+
projection: {
465+
longitudinal_profile_parameters: 1,
466+
created_at: 1,
467+
updated_at: 1,
468+
},
469+
},
470+
});
471+
472+
return success(plan);
473+
} catch (e) {
474+
return handleError(e);
475+
}
476+
}
437477
}

src/adapters/validators/PlanValidator.ts

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -103,6 +103,26 @@ export class PlanValidator {
103103
return null;
104104
}
105105

106+
static validateEditLongitudinalProfileParameters(data: any): Error | null {
107+
const rules = {
108+
horizontal_scale: 'numeric',
109+
vertical_scale: 'numeric',
110+
profile_origin: 'array',
111+
'profile_origin.*': 'numeric',
112+
station_interval: 'numeric',
113+
elevation_interval: 'numeric',
114+
starting_chainage: 'numeric',
115+
};
116+
117+
try {
118+
validator.validate(data, rules);
119+
} catch (e) {
120+
return new Error((e as Error).message);
121+
}
122+
123+
return null;
124+
}
125+
106126
static validateEditParcels(data: any): Error | null {
107127
const rules = {
108128
parcels: 'required|array',
@@ -246,6 +266,7 @@ export class PlanValidator {
246266
footers: 'array',
247267
'footers.*': 'string',
248268
footer_size: 'numeric',
269+
dxf_version: 'string',
249270
};
250271

251272
try {

src/domain/entities/Plan.ts

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,15 @@ export interface TopographicBoundary {
6363
legs?: TraverseLegProps[];
6464
}
6565

66+
export interface LongitudinalProfileParameters {
67+
horizontal_scale?: number;
68+
vertical_scale?: number;
69+
profile_origin?: number[];
70+
station_interval?: number;
71+
elevation_interval?: number;
72+
starting_chainage?: number;
73+
}
74+
6675
export interface PlanProps {
6776
id: string;
6877
created_at: Date;
@@ -110,6 +119,8 @@ export interface PlanProps {
110119
page_orientation?: PageOrientation;
111120
footers: string[];
112121
footer_size: number;
122+
longitudinal_profile_parameters?: LongitudinalProfileParameters;
123+
dxf_version?: string; // e.g., R12, R2000
113124
}
114125

115126
export class Plan {
@@ -159,6 +170,8 @@ export class Plan {
159170
public readonly page_orientation?: PageOrientation;
160171
public readonly footers: string[];
161172
public readonly footer_size: number;
173+
public readonly longitudinal_profile_parameters?: LongitudinalProfileParameters;
174+
public readonly dxf_version?: string; // e.g., R12, R2000
162175

163176
constructor(props: PlanProps) {
164177
this.id = props.id;
@@ -194,5 +207,7 @@ export class Plan {
194207
this.differential_leveling_data = props.differential_leveling_data;
195208
this.footers = props.footers;
196209
this.footer_size = props.footer_size; // Default to 0.5 if not provided
210+
this.longitudinal_profile_parameters = props.longitudinal_profile_parameters;
211+
this.dxf_version = props.dxf_version; // Default to R12 if not provided
197212
}
198213
}

src/infrastructure/mongodb/models/Plan.ts

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -152,6 +152,20 @@ export const topographicSettingSchema = new Schema(
152152
},
153153
);
154154

155+
export const longitudinalProfileParametersSchema = new Schema(
156+
{
157+
horizontal_scale: Number,
158+
vertical_scale: Number,
159+
profile_origin: [Number],
160+
station_interval: Number,
161+
elevation_interval: Number,
162+
starting_chainage: Number,
163+
},
164+
{
165+
_id: false,
166+
},
167+
);
168+
155169
const PlanSchema: Schema<PlanDocument> = new Schema<PlanDocument>(
156170
{
157171
user: {
@@ -276,6 +290,13 @@ const PlanSchema: Schema<PlanDocument> = new Schema<PlanDocument>(
276290
type: Number,
277291
default: 0.5,
278292
},
293+
longitudinal_profile_parameters: {
294+
type: longitudinalProfileParametersSchema,
295+
},
296+
dxf_version: {
297+
type: String,
298+
default: 'R2010',
299+
},
279300
deleted: {
280301
type: Boolean,
281302
select: false,

src/main/config/container.ts

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,7 @@ import { EditDifferentialLeveling } from '@use-cases/plan/EditDifferentialLeveli
5353
import { EditTopoBoundary } from '@use-cases/plan/EditTopoBoundary';
5454
import { EditTopoSetting } from '@use-cases/plan/EditTopoSetting';
5555
import { GoogleAuth } from '@use-cases/auth/GoogleAuth';
56+
import { EditLongitudinalProfileParameters } from '@use-cases/plan/EditLongitudinalProfileParameters';
5657

5758
export class Container {
5859
private instances = new Map<string, any>();
@@ -287,6 +288,12 @@ export function setupContainer(): Container {
287288
container.register('DifferentialLevelingUseCase', () => {
288289
return new DifferentialLeveling(container.resolve<Logger>('Logger'));
289290
});
291+
container.register('EditLongitudinalProfileParametersUseCase', () => {
292+
return new EditLongitudinalProfileParameters(
293+
container.resolve<Logger>('Logger'),
294+
container.resolve<PlanRepositoryInterface>('PlanRepo'),
295+
);
296+
});
290297

291298
// Register Controllers
292299
container.register('AuthController', () => {
@@ -348,6 +355,7 @@ export function setupContainer(): Container {
348355
container.resolve('EditDifferentialLevelingUseCase'),
349356
container.resolve('EditTopoBoundaryUseCase'),
350357
container.resolve('EditTopoSettingUseCase'),
358+
container.resolve('EditLongitudinalProfileParametersUseCase'),
351359
);
352360
});
353361

src/main/routes/plan-routes.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,10 @@ export default (logger: Logger, authController: AuthController, planController:
2323
expressRouteAdapter(planController.editTopoBoundary.bind(planController)),
2424
);
2525
router.put('/topo/setting/edit/:plan_id', expressRouteAdapter(planController.editTopoSetting.bind(planController)));
26+
router.put(
27+
'/route/longitudinal/params/edit/:plan_id',
28+
expressRouteAdapter(planController.editLongitudinalProfileParameters.bind(planController)),
29+
);
2630
router.delete('/delete/:plan_id', expressRouteAdapter(planController.deletePlan.bind(planController)));
2731
router.put(
2832
'/traverse-data/edit/:plan_id',

src/use-cases/auth/SendLoginOTP.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,7 @@ export class SendLoginOTP {
4949

5050
// generate OTP
5151
const otp = await this.createOTP.execute({ identifier: user.id, type: `login_otp`, exp: 10 });
52+
console.log(otp);
5253
await this.sendOTP(user.email, 10, otp);
5354
}
5455

src/use-cases/plan/CreatePlan.ts

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -66,6 +66,17 @@ export class CreatePlan {
6666
};
6767
}
6868

69+
if (planData.type === PlanType.ROUTE) {
70+
planData.longitudinal_profile_parameters = {
71+
horizontal_scale: 1.0,
72+
vertical_scale: 10,
73+
profile_origin: [0.0, 0.0],
74+
station_interval: 10,
75+
elevation_interval: 1.0,
76+
starting_chainage: 0.0,
77+
};
78+
}
79+
6980
// create plan
7081
return await this.planRepo.createPlan(planData);
7182
}
Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
import { LongitudinalProfileParameters, Plan, PlanType, TopographicSetting } from '@domain/entities/Plan';
2+
import { Logger, RepoOptions } from '@domain/types/Common';
3+
import { PlanRepositoryInterface } from '@domain/interfaces/repositories/PlanRepositoryInterface';
4+
import NotFoundError from '@domain/errors/NotFoundError';
5+
import BadRequestError from '@domain/errors/BadRequestError';
6+
7+
export interface EditLongitudinalProfileParametersRequest {
8+
plan_id: string;
9+
params: LongitudinalProfileParameters;
10+
options?: RepoOptions;
11+
}
12+
13+
export class EditLongitudinalProfileParameters {
14+
constructor(
15+
private readonly logger: Logger,
16+
private readonly planRepo: PlanRepositoryInterface,
17+
) {}
18+
19+
async execute(data: EditLongitudinalProfileParametersRequest): Promise<Plan> {
20+
this.logger.info('EditLongitudinalProfileParameters', data);
21+
22+
const filter = data.options?.filter || {};
23+
let plan = await this.planRepo.getPlanById(data.plan_id, { projection: { type: 1 }, filter });
24+
if (!plan) {
25+
throw new NotFoundError('Plan not found');
26+
}
27+
28+
if (plan.type !== PlanType.ROUTE) {
29+
throw new BadRequestError('Plan is not a route plan');
30+
}
31+
32+
plan = await this.planRepo.editPlan(
33+
data.plan_id,
34+
{ longitudinal_profile_parameters: data.params },
35+
data.options,
36+
);
37+
if (!plan) {
38+
throw new NotFoundError('Plan not found');
39+
}
40+
41+
return plan;
42+
}
43+
}

0 commit comments

Comments
 (0)