adding new logbook entry (#24)
* adding new logbook entry * adding new logbook entry
This commit was merged in pull request #24.
This commit is contained in:
@@ -9,6 +9,7 @@ import {
|
||||
} from '@noahspan/noahspan-modules';
|
||||
import { ConfigModule } from '@nestjs/config';
|
||||
import { APP_GUARD } from '@nestjs/core';
|
||||
import { LogbookModule } from './logbook/logbook.module';
|
||||
import { PilotModule } from './pilot/pilot.module';
|
||||
import { APP_FILTER } from '@nestjs/core';
|
||||
import { HttpExceptionFilter } from './filters/http-exception.filter';
|
||||
@@ -32,6 +33,7 @@ import { HttpExceptionFilter } from './filters/http-exception.filter';
|
||||
clientId: process.env.CLIENT_ID,
|
||||
clientSecret: process.env.CLIENT_SECRET
|
||||
}),
|
||||
LogbookModule,
|
||||
PilotModule
|
||||
],
|
||||
controllers: [AppController],
|
||||
|
||||
41
api/src/logbook/logbook.controller.ts
Normal file
41
api/src/logbook/logbook.controller.ts
Normal file
@@ -0,0 +1,41 @@
|
||||
import { Body, Controller, Get, HttpException, Post } from '@nestjs/common';
|
||||
import { LogbookService } from './logbook.service';
|
||||
import { LogbookDto } from './logbook.dto';
|
||||
import { CustomError } from '../customError/CustomError';
|
||||
import { TableInsertEntityHeaders } from '@azure/data-tables';
|
||||
import { LogbookEntity } from './logbook.entity';
|
||||
|
||||
@Controller('logbook')
|
||||
export class LogbookController {
|
||||
constructor(private readonly logbookService: LogbookService) {}
|
||||
|
||||
@Get()
|
||||
async findAll(): Promise<LogbookEntity[]> {
|
||||
try {
|
||||
const logbookEntries: LogbookEntity[] =
|
||||
await this.logbookService.findAll();
|
||||
|
||||
return logbookEntries;
|
||||
} catch (error) {
|
||||
const customError = error as CustomError;
|
||||
console.log(error);
|
||||
throw new HttpException(customError.message, customError.statusCode, {
|
||||
cause: customError.name
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
@Post()
|
||||
async create(@Body() logbookData: LogbookDto): Promise<void> {
|
||||
try {
|
||||
const response: TableInsertEntityHeaders =
|
||||
await this.logbookService.create(logbookData);
|
||||
} catch (error) {
|
||||
const customError = error as CustomError;
|
||||
|
||||
throw new HttpException(customError.message, customError.statusCode, {
|
||||
cause: customError.name
|
||||
});
|
||||
}
|
||||
}
|
||||
}
|
||||
26
api/src/logbook/logbook.dto.ts
Normal file
26
api/src/logbook/logbook.dto.ts
Normal file
@@ -0,0 +1,26 @@
|
||||
export class LogbookDto {
|
||||
pilotId: string;
|
||||
pilotName: string;
|
||||
date: string;
|
||||
aircraftMakeModel: string;
|
||||
aircraftIdentity: string;
|
||||
routeFrom: string;
|
||||
routeTo: string;
|
||||
durationOfFlight: number;
|
||||
singleEngineLand: string;
|
||||
simulatorAtd: number;
|
||||
landingsDay: number;
|
||||
landingsNight: number;
|
||||
instrumentActual: number;
|
||||
instrumentSimulated: number;
|
||||
instrumentApproaches: number;
|
||||
instrumentHolds: number;
|
||||
instrumentNavTrack: number;
|
||||
groundTrainingReceived: number;
|
||||
flightTrainingReceived: number;
|
||||
crossCountry: number;
|
||||
night: number;
|
||||
solo: number;
|
||||
pilotInCommand: number;
|
||||
notes: string;
|
||||
}
|
||||
29
api/src/logbook/logbook.entity.ts
Normal file
29
api/src/logbook/logbook.entity.ts
Normal file
@@ -0,0 +1,29 @@
|
||||
export class LogbookEntity {
|
||||
partitionKey: string;
|
||||
rowKey: string;
|
||||
id: string;
|
||||
pilotId: string;
|
||||
pilotName: string;
|
||||
date: string;
|
||||
aircraftMakeModel: string;
|
||||
aircraftIdentity: string;
|
||||
routeFrom: string;
|
||||
routeTo: string;
|
||||
durationOfFlight: number | null;
|
||||
singleEngineLand: number | null;
|
||||
simulatorAtd: number | null;
|
||||
landingsDay: number | null;
|
||||
landingsNight: number | null;
|
||||
groundTrainingReceived: number;
|
||||
flightTrainingReceived: number;
|
||||
crossCountry: number | null;
|
||||
night: number | null;
|
||||
solo: number | null;
|
||||
pilotInCommand: number | null;
|
||||
instrumentActual: number | null;
|
||||
instrumentSimulated: number | null;
|
||||
instrumentApproaches: number | null;
|
||||
instrumentHolds: number | null;
|
||||
instrumentNavTrack: number | null;
|
||||
notes: string;
|
||||
}
|
||||
20
api/src/logbook/logbook.module.ts
Normal file
20
api/src/logbook/logbook.module.ts
Normal file
@@ -0,0 +1,20 @@
|
||||
import { Module } from '@nestjs/common';
|
||||
import { LogbookController } from './logbook.controller';
|
||||
import { LogbookService } from './logbook.service';
|
||||
import { TableModule } from '@noahspan/noahspan-modules';
|
||||
|
||||
@Module({
|
||||
imports: [
|
||||
TableModule.register({
|
||||
accountName: process.env.AZURE_STORAGE_ACCOUNT_NAME,
|
||||
accountKey: process.env.AZURE_STORAGE_ACCOUNT_KEY,
|
||||
accountUrl: process.env.AZURE_STORAGE_ACCOUNT_URL,
|
||||
allowInsecureConnection: Boolean(
|
||||
process.env.AZURE_STORAGE_ALLOW_INSECURE_CONNECTION
|
||||
)
|
||||
})
|
||||
],
|
||||
controllers: [LogbookController],
|
||||
providers: [LogbookService]
|
||||
})
|
||||
export class LogbookModule {}
|
||||
113
api/src/logbook/logbook.service.ts
Normal file
113
api/src/logbook/logbook.service.ts
Normal file
@@ -0,0 +1,113 @@
|
||||
import { Injectable } from '@nestjs/common';
|
||||
import { TableClient, TableService } from '@noahspan/noahspan-modules';
|
||||
import { LogbookDto } from './logbook.dto';
|
||||
import { LogbookEntity } from './logbook.entity';
|
||||
import { odata, RestError, TableInsertEntityHeaders } from '@azure/data-tables';
|
||||
import { CustomError } from '../customError/CustomError';
|
||||
import { v4 as uuidv4 } from 'uuid';
|
||||
|
||||
@Injectable()
|
||||
export class LogbookService {
|
||||
constructor(private readonly tableService: TableService) {}
|
||||
|
||||
async findAll(): Promise<LogbookEntity[]> {
|
||||
try {
|
||||
const client: TableClient =
|
||||
await this.tableService.getTableClient('Logbook');
|
||||
const entities = await client.listEntities({
|
||||
queryOptions: { filter: odata`PartitionKey eq 'entry'` }
|
||||
});
|
||||
const logbookEntries: LogbookEntity[] = [];
|
||||
|
||||
for await (const entity of entities) {
|
||||
const logbookEntry = {
|
||||
partitionKey: entity.partitionKey.toString(),
|
||||
rowKey: entity.rowKey.toString(),
|
||||
id: entity.rowKey.toString(),
|
||||
pilotId: entity.pilotId.toString(),
|
||||
pilotName: entity.pilotName.toString(),
|
||||
date: entity.date.toString(),
|
||||
aircraftMakeModel: entity.aircraftMakeModel.toString(),
|
||||
aircraftIdentity: entity.aircraftIdentity.toString(),
|
||||
routeFrom: entity.routeFrom.toString(),
|
||||
routeTo: entity.routeTo.toString(),
|
||||
durationOfFlight: Number(entity.durationOfFlight),
|
||||
singleEngineLand: entity.singleEngineLand
|
||||
? Number(entity.singleEngineLand)
|
||||
: null,
|
||||
simulatorAtd: entity.simulatorAtd
|
||||
? Number(entity.simulatorAtd)
|
||||
: null,
|
||||
landingsDay: entity.landingsDay ? Number(entity.landingsDay) : null,
|
||||
landingsNight: entity.landingsNight
|
||||
? Number(entity.landingsNight)
|
||||
: null,
|
||||
groundTrainingReceived: entity.groundTrainingReceived
|
||||
? Number(entity.groundTrainingReceived)
|
||||
: null,
|
||||
flightTrainingReceived: entity.flightTrainingReceived
|
||||
? Number(entity.flightTrainingReceived)
|
||||
: null,
|
||||
crossCountry: entity.crossCountry
|
||||
? Number(entity.crossCountry)
|
||||
: null,
|
||||
night: entity.night ? Number(entity.night) : null,
|
||||
solo: entity.solo ? Number(entity.solo) : null,
|
||||
pilotInCommand: entity.pilotInCommand
|
||||
? Number(entity.pilotInCommand)
|
||||
: null,
|
||||
instrumentActual: entity.instrumentActual
|
||||
? Number(entity.instrumentActual)
|
||||
: null,
|
||||
instrumentSimulated: entity.instrumentSimulated
|
||||
? Number(entity.instrumentSimulated)
|
||||
: null,
|
||||
instrumentApproaches: entity.instrumentApproaches
|
||||
? Number(entity.instrumentApproaches)
|
||||
: null,
|
||||
instrumentHolds: entity.instrumentHolds
|
||||
? Number(entity.instrumentHolds)
|
||||
: null,
|
||||
instrumentNavTrack: entity.instrumentNavTrack
|
||||
? Number(entity.instrumentNavTrack)
|
||||
: null,
|
||||
notes: entity.notes.toString()
|
||||
};
|
||||
console.log(logbookEntry);
|
||||
logbookEntries.push(logbookEntry);
|
||||
}
|
||||
|
||||
return logbookEntries;
|
||||
} catch (error) {
|
||||
const restError: RestError = error as RestError;
|
||||
|
||||
throw new CustomError(
|
||||
restError.details['odataError']['message']['value'],
|
||||
restError.details['odataError']['code'],
|
||||
restError.statusCode
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
async create(logbookData: LogbookDto): Promise<TableInsertEntityHeaders> {
|
||||
const client: TableClient =
|
||||
await this.tableService.getTableClient('Logbook');
|
||||
const logbook: LogbookEntity = new LogbookEntity();
|
||||
|
||||
Object.assign(logbook, logbookData);
|
||||
logbook.partitionKey = 'entry';
|
||||
logbook.rowKey = `${logbook.pilotId}:${uuidv4()}`;
|
||||
|
||||
try {
|
||||
return await client.createEntity(logbook);
|
||||
} catch (error) {
|
||||
const restError: RestError = error as RestError;
|
||||
|
||||
throw new CustomError(
|
||||
restError.details['odataError']['message']['value'],
|
||||
restError.details['odataError']['code'],
|
||||
restError.statusCode
|
||||
);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -82,19 +82,19 @@ export class PilotInfoService {
|
||||
}
|
||||
|
||||
async create(pilotInfoData: PilotInfoDto): Promise<TableInsertEntityHeaders> {
|
||||
const client: TableClient =
|
||||
await this.tableService.getTableClient('Pilots');
|
||||
const pilotInfo: PilotInfoEntity = new PilotInfoEntity();
|
||||
|
||||
Object.assign(pilotInfo, pilotInfoData);
|
||||
pilotInfo.partitionKey = 'pilot';
|
||||
pilotInfo.rowKey = pilotInfo.id;
|
||||
|
||||
try {
|
||||
const client: TableClient =
|
||||
await this.tableService.getTableClient('Pilots');
|
||||
const pilotInfo: PilotInfoEntity = new PilotInfoEntity();
|
||||
|
||||
Object.assign(pilotInfo, pilotInfoData);
|
||||
pilotInfo.partitionKey = 'pilot';
|
||||
pilotInfo.rowKey = pilotInfo.id;
|
||||
console.log(pilotInfo);
|
||||
return await client.createEntity(pilotInfo);
|
||||
} catch (error) {
|
||||
const restError: RestError = error as RestError;
|
||||
|
||||
console.log(restError);
|
||||
throw new CustomError(
|
||||
restError.details['odataError']['message']['value'],
|
||||
restError.details['odataError']['code'],
|
||||
|
||||
@@ -7,7 +7,11 @@ import { PilotInfoService } from './info/pilot-info.service';
|
||||
imports: [
|
||||
TableModule.register({
|
||||
accountName: process.env.AZURE_STORAGE_ACCOUNT_NAME,
|
||||
accountKey: process.env.AZURE_STORAGE_ACCOUNT_KEY
|
||||
accountKey: process.env.AZURE_STORAGE_ACCOUNT_KEY,
|
||||
accountUrl: process.env.AZURE_STORAGE_ACCOUNT_URL,
|
||||
allowInsecureConnection: Boolean(
|
||||
process.env.AZURE_STORAGE_ALLOW_INSECURE_CONNECTION
|
||||
)
|
||||
})
|
||||
],
|
||||
controllers: [PilotController],
|
||||
|
||||
Reference in New Issue
Block a user