Skip to content

Commit dcad789

Browse files
authored
Merge pull request #138 from Patowhiz/main
Climsoft preview 1.0.1 release
2 parents 9b43d15 + e2df62c commit dcad789

File tree

66 files changed

+1004
-911
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

66 files changed

+1004
-911
lines changed

back-end/api/package-lock.json

Lines changed: 20 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

back-end/api/package.json

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "api",
3-
"version": "0.0.1",
3+
"version": "1.0.1",
44
"description": "Climsoft API",
55
"author": "Climsoft Foundation",
66
"private": true,
@@ -23,6 +23,7 @@
2323
"@nestjs/common": "^10.0.0",
2424
"@nestjs/config": "^3.2.3",
2525
"@nestjs/core": "^10.0.0",
26+
"@nestjs/event-emitter": "^3.0.1",
2627
"@nestjs/platform-express": "^10.0.0",
2728
"@nestjs/typeorm": "^10.0.0",
2829
"bcrypt": "^5.1.1",

back-end/api/src/app.module.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,9 +8,11 @@ import { UserModule } from './user/user.module';
88
import { SettingsModule } from './settings/settings.module';
99
import { MigrationsModule } from './migrations/migrations.module';
1010
import { AppConfig } from './app.config';
11+
import { EventEmitterModule } from '@nestjs/event-emitter';
1112

1213
@Module({
1314
imports: [
15+
EventEmitterModule.forRoot(),
1416
UserModule,
1517
MetadataModule,
1618
ObservationModule,

back-end/api/src/metadata/metadata-updates/metadata-updates.controller.ts

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -120,6 +120,4 @@ export class MetadataUpdatesController {
120120
return this.sourcesService.checkUpdates(updatesQueryDto);
121121
}
122122

123-
124-
125123
}

back-end/api/src/metadata/metadata.module.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,7 @@ import { RegionEntity } from './regions/entities/region.entity';
4646
import { NetworkAffiliationsController } from './network-affiliations/controllers/network-affiliation.controller';
4747
import { NetworkAffiliationsService } from './network-affiliations/services/network-affiliations.service';
4848
import { StationNetworkAffiliationsController } from './stations/controllers/station-network-affiliations.controller';
49-
import { StationNetworkAffiliationsService } from './stations/services/station-network-affiliations.service';
49+
import { StationNetworkAffiliationsService } from './stations/services/station-network-affiliations.service';
5050

5151
@Module({
5252
imports: [
@@ -100,7 +100,7 @@ import { StationNetworkAffiliationsService } from './stations/services/station-n
100100
ElementSubdomainsService,
101101
ElementTypesService,
102102
ElementsService,
103-
103+
104104
OrganisationsService,
105105
NetworkAffiliationsService,
106106

back-end/api/src/metadata/source-templates/controllers/source-templates.controller.ts

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -55,5 +55,4 @@ export class SourceTemplatesController {
5555
return this.sourcesService.delete(id);
5656
}
5757

58-
5958
}

back-end/api/src/metadata/source-templates/services/source-templates.service.ts

Lines changed: 12 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -7,14 +7,14 @@ import { SourceTypeEnum } from 'src/metadata/source-templates/enums/source-type.
77
import { SourceTemplateEntity } from '../entities/source-template.entity';
88
import { MetadataUpdatesQueryDto } from 'src/metadata/metadata-updates/dtos/metadata-updates-query.dto';
99
import { MetadataUpdatesDto } from 'src/metadata/metadata-updates/dtos/metadata-updates.dto';
10-
11-
// TODO refactor this service later
10+
import { EventEmitter2 } from '@nestjs/event-emitter';
1211

1312
@Injectable()
1413
export class SourceTemplatesService {
1514

1615
constructor(
17-
@InjectRepository(SourceTemplateEntity) private sourceRepo: Repository<SourceTemplateEntity>,
16+
@InjectRepository(SourceTemplateEntity) private sourceRepo: Repository<SourceTemplateEntity>,
17+
private eventEmitter: EventEmitter2,
1818
) { }
1919

2020

@@ -93,6 +93,8 @@ export class SourceTemplatesService {
9393

9494
await this.sourceRepo.save(entity);
9595

96+
this.eventEmitter.emit('source.created', { id: entity.id, dto });
97+
9698
return this.createViewDto(entity);
9799

98100
}
@@ -108,20 +110,25 @@ export class SourceTemplatesService {
108110
source.parameters = dto.parameters;
109111
source.entryUserId = userId;
110112

111-
// TODO. Later Implement logging of changes in the database.
112-
return this.sourceRepo.save(source);
113+
await this.sourceRepo.save(source);
114+
115+
this.eventEmitter.emit('source.updated', { id, dto });
116+
117+
return source;
113118
}
114119

115120
public async delete(id: number): Promise<number> {
116121
const source = await this.findEntity(id);
117122
await this.sourceRepo.remove(source);
123+
this.eventEmitter.emit('source.deleted', { id });
118124
return id;
119125
}
120126

121127
public async deleteAll(): Promise<boolean> {
122128
const entities: SourceTemplateEntity[] = await this.sourceRepo.find();
123129
// Note, don't use .clear() because truncating a table referenced in a foreign key constraint is not supported
124130
await this.sourceRepo.remove(entities);
131+
this.eventEmitter.emit('source.deleted', {});
125132
return true;
126133
}
127134

back-end/api/src/observation/controllers/observations.controller.ts

Lines changed: 14 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -17,13 +17,15 @@ import { AuthorisedImportsPipe } from 'src/user/pipes/authorised-imports.pipe';
1717
import { StationStatusQueryDto } from '../dtos/station-status-query.dto';
1818
import { StationStatusDataQueryDto } from '../dtos/station-status-data-query.dto';
1919
import { DataAvailabilitySummaryQueryDto } from '../dtos/data-availability-summary-query.dto';
20+
import { FormDataEntryCheckService } from '../services/form-data-entry-check.service';
2021

2122
@Controller('observations')
2223
export class ObservationsController {
2324
constructor(
2425
private observationsService: ObservationsService,
2526
private observationUpload: ObservationImportService,
2627
private exportObservationsService: ExportObservationsService,
28+
private formDataEntryCheckService: FormDataEntryCheckService,
2729
) { }
2830

2931
@Get()
@@ -69,14 +71,14 @@ export class ObservationsController {
6971
@Get('stations-observation-status/:stationid')
7072
getStationObservationsLast24HoursRecords(
7173
@Param('stationid', AuthorisedStationsPipe) stationId: string,
72-
@Query() stationStatusQuery: StationStatusDataQueryDto) {
74+
@Query() stationStatusQuery: StationStatusDataQueryDto) {
7375
return this.observationsService.findStationsObservationStatusData(stationId, stationStatusQuery);
7476
}
7577

7678
@Get('data-availability-status')
7779
getDataAvailabilityStatus(
7880
@Query(AuthorisedStationsPipe) query: DataAvailabilitySummaryQueryDto) {
79-
return this.observationsService.findDataAvailabilitySummary( query);
81+
return this.observationsService.findDataAvailabilitySummary(query);
8082
}
8183

8284
@Get('generate-export/:templateid')
@@ -98,12 +100,20 @@ export class ObservationsController {
98100
return await this.exportObservationsService.downloadExport(exportTemplateId, AuthUtil.getLoggedInUser(request).id);
99101
}
100102

101-
@Put()
103+
@Put('data-entry')
102104
async bulkPut(
103105
@Req() request: Request,
104-
@Body(AuthorisedStationsPipe, new ParseArrayPipe({ items: CreateObservationDto })) observationDtos: CreateObservationDto[]) {
106+
@Body(new ParseArrayPipe({ items: CreateObservationDto })) observationDtos: CreateObservationDto[]) {
107+
// Get logged in user
105108
const user = AuthUtil.getLoggedInUser(request);
109+
110+
// Validate form data. If any invalid bad request will be thrown
111+
await this.formDataEntryCheckService.checkData(observationDtos, user);
112+
113+
// Save the data
106114
await this.observationsService.bulkPut(observationDtos, user.id);
115+
116+
// Return success if all operations are successful
107117
return { message: "success" };
108118
}
109119

back-end/api/src/observation/observation.module.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ import { ClimsoftWebToV4SyncService } from './services/climsoft-web-to-v4-sync.s
1515
import { ExportObservationsService } from './services/export-observations.service';
1616
import { ClimsoftV4WebSyncSetUpService } from './services/climsoft-v4-web-sync-set-up.service';
1717
import { ClimsoftV4ToWebSyncService } from './services/climsoft-v4-to-web-sync.service';
18+
import { FormDataEntryCheckService } from './services/form-data-entry-check.service';
1819

1920
@Module({
2021
imports: [
@@ -37,6 +38,7 @@ import { ClimsoftV4ToWebSyncService } from './services/climsoft-v4-to-web-sync.s
3738
ClimsoftV4WebSyncSetUpService,
3839
ClimsoftWebToV4SyncService,
3940
ClimsoftV4ToWebSyncService,
41+
FormDataEntryCheckService,
4042
],
4143
})
4244
export class ObservationModule { }

back-end/api/src/observation/services/climsoft-web-to-v4-sync.service.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -183,7 +183,7 @@ export class ClimsoftWebToV4SyncService {
183183
// Execute the batch upsert
184184
const results: mariadb.UpsertResult = await connection.batch(upsertStatement, values);
185185

186-
this.logger.log('V4 insert update status: ' + results);
186+
this.logger.log('V4 afftected rows: ' + results.affectedRows);
187187

188188
// As of 03/02/2025, when an existing row is updated MariaDB counts this as a row affected twice
189189
// Once for detecting the conflict (i.e., attempting to insert)

0 commit comments

Comments
 (0)