Skip to content

Commit 8e66abc

Browse files
Added new metadata field for ODDK datatargets
1 parent bda0625 commit 8e66abc

File tree

6 files changed

+88
-25
lines changed

6 files changed

+88
-25
lines changed

src/entities/dto/create-open-data-dk-dataset.dto.ts

Lines changed: 20 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import { ApiProperty, ApiPropertyOptional } from "@nestjs/swagger";
2-
import { IsEmail, IsNotEmpty, IsOptional, IsString, IsUrl } from "class-validator";
2+
import { IsBoolean, IsEmail, IsNotEmpty, IsOptional, IsString, IsUrl } from "class-validator";
33

44
export class CreateOpenDataDkDatasetDto {
55
@ApiProperty({ required: true })
@@ -17,6 +17,11 @@ export class CreateOpenDataDkDatasetDto {
1717
@IsString({ each: true, always: true })
1818
keywords?: string[];
1919

20+
@ApiProperty({ required: false })
21+
@IsOptional()
22+
@IsString()
23+
keywordTags: string;
24+
2025
@ApiProperty({ required: true })
2126
@IsString()
2227
@IsUrl({ protocols: ["http", "https"] })
@@ -36,4 +41,18 @@ export class CreateOpenDataDkDatasetDto {
3641
@IsString()
3742
@IsNotEmpty()
3843
resourceTitle: string;
44+
45+
@ApiProperty({ required: false })
46+
@IsOptional()
47+
@IsString()
48+
updateFrequency: string = "UNKNOWN";
49+
50+
@ApiProperty({ required: false })
51+
@IsOptional()
52+
@IsUrl()
53+
documentationUrl: string;
54+
55+
@ApiProperty({ required: true })
56+
@IsBoolean()
57+
dataDirectory: boolean;
3958
}

src/entities/dto/open-data-dk-dcat.dto.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,9 @@ export class Dataset {
3737
distribution: Distribution[];
3838
spatial: string;
3939
theme: string[];
40+
documentation: string;
41+
frequency: string | undefined;
42+
dataDirectory: boolean;
4043
}
4144

4245
export class DCATRootObject {

src/entities/open-data-dk-dataset.entity.ts

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,9 @@ export class OpenDataDkDataset extends DbBaseEntity {
1818
@Column("text", { array: true, nullable: true })
1919
keywords?: string[];
2020

21+
@Column({ nullable: true })
22+
keywordTags?: string;
23+
2124
@Column()
2225
license: string;
2326

@@ -29,4 +32,13 @@ export class OpenDataDkDataset extends DbBaseEntity {
2932

3033
@Column({ nullable: false, default: "" })
3134
resourceTitle: string;
35+
36+
@Column({ nullable: true })
37+
updateFrequency?: string;
38+
39+
@Column({ nullable: true })
40+
documentationUrl?: string;
41+
42+
@Column({ nullable: false, default: false })
43+
dataDirectory: boolean;
3244
}
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
import { MigrationInterface, QueryRunner } from "typeorm";
2+
3+
export class AddedNewFieldsToOddkDatatarget1762524771197 implements MigrationInterface {
4+
name = 'AddedNewFieldsToOddkDatatarget1762524771197'
5+
6+
public async up(queryRunner: QueryRunner): Promise<void> {
7+
await queryRunner.query(`ALTER TABLE "open_data_dk_dataset" ADD "keywordTags" character varying`);
8+
await queryRunner.query(`ALTER TABLE "open_data_dk_dataset" ADD "updateFrequency" character varying`);
9+
await queryRunner.query(`ALTER TABLE "open_data_dk_dataset" ADD "documentationUrl" character varying`);
10+
await queryRunner.query(`ALTER TABLE "open_data_dk_dataset" ADD "dataDirectory" boolean NOT NULL DEFAULT false`);
11+
}
12+
13+
public async down(queryRunner: QueryRunner): Promise<void> {
14+
await queryRunner.query(`ALTER TABLE "open_data_dk_dataset" DROP COLUMN "dataDirectory"`);
15+
await queryRunner.query(`ALTER TABLE "open_data_dk_dataset" DROP COLUMN "documentationUrl"`);
16+
await queryRunner.query(`ALTER TABLE "open_data_dk_dataset" DROP COLUMN "updateFrequency"`);
17+
await queryRunner.query(`ALTER TABLE "open_data_dk_dataset" DROP COLUMN "keywordTags"`);
18+
}
19+
20+
}

src/services/data-management/open-data-dk-sharing.service.ts

Lines changed: 28 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ import { Injectable, Logger } from "@nestjs/common";
33
import { InjectRepository } from "@nestjs/typeorm";
44
import { Repository } from "typeorm";
55

6-
import { DCATRootObject, Dataset, ContactPoint, Distribution } from "@dto/open-data-dk-dcat.dto";
6+
import { ContactPoint, Dataset, DCATRootObject, Distribution } from "@dto/open-data-dk-dcat.dto";
77
import { OpenDataDkDataset } from "@entities/open-data-dk-dataset.entity";
88
import { Organization } from "@entities/organization.entity";
99
import { PayloadDecoderExecutorService } from "./payload-decoder-executor.service";
@@ -17,16 +17,16 @@ import { ChirpstackDeviceService } from "@services/chirpstack/chirpstack-device.
1717

1818
@Injectable()
1919
export class OpenDataDkSharingService {
20+
private readonly BACKEND_BASE_URL = configuration()["backend"]["baseurl"];
21+
private readonly logger = new Logger(OpenDataDkSharingService.name);
22+
2023
constructor(
2124
@InjectRepository(OpenDataDkDataset)
2225
private repository: Repository<OpenDataDkDataset>,
2326
private payloadDecoderExecutorService: PayloadDecoderExecutorService,
2427
private chirpstackDeviceService: ChirpstackDeviceService
2528
) {}
2629

27-
private readonly BACKEND_BASE_URL = configuration()["backend"]["baseurl"];
28-
private readonly logger = new Logger(OpenDataDkSharingService.name);
29-
3030
async getDecodedDataInDataset(dataset: OpenDataDkDataset): Promise<any[] | { error: ErrorCodes }> {
3131
const rawData = await this.repository
3232
.createQueryBuilder("dataset")
@@ -46,6 +46,25 @@ export class OpenDataDkSharingService {
4646
return await this.decodeData(rawData);
4747
}
4848

49+
async createDCAT(organization: Organization): Promise<DCATRootObject> {
50+
const datasets = await this.getAllOpenDataDkSharesForOrganization(organization);
51+
52+
return this.mapToDCAT(organization, datasets);
53+
}
54+
55+
async findById(shareId: number, organizationId: number): Promise<OpenDataDkDataset> {
56+
return await this.findDatasetWithRelations()
57+
.where("dataset.id = :datasetId and org.id = :organizationId", {
58+
datasetId: shareId,
59+
organizationId: organizationId,
60+
})
61+
.getOne();
62+
}
63+
64+
async getAllOpenDataDkSharesForOrganization(organization: Organization): Promise<OpenDataDkDataset[]> {
65+
return this.findDatasetWithRelations().where("org.id = :orgId", { orgId: organization.id }).getMany();
66+
}
67+
4968
private async decodeData(rawData: OpenDataDkDataset) {
5069
const results: any[] = [];
5170
for (const connection of rawData.dataTarget.connections) {
@@ -96,25 +115,6 @@ export class OpenDataDkSharingService {
96115
}
97116
}
98117

99-
async createDCAT(organization: Organization): Promise<DCATRootObject> {
100-
const datasets = await this.getAllOpenDataDkSharesForOrganization(organization);
101-
102-
return this.mapToDCAT(organization, datasets);
103-
}
104-
105-
async findById(shareId: number, organizationId: number): Promise<OpenDataDkDataset> {
106-
return await this.findDatasetWithRelations()
107-
.where("dataset.id = :datasetId and org.id = :organizationId", {
108-
datasetId: shareId,
109-
organizationId: organizationId,
110-
})
111-
.getOne();
112-
}
113-
114-
async getAllOpenDataDkSharesForOrganization(organization: Organization): Promise<OpenDataDkDataset[]> {
115-
return this.findDatasetWithRelations().where("org.id = :orgId", { orgId: organization.id }).getMany();
116-
}
117-
118118
private findDatasetWithRelations() {
119119
return this.repository
120120
.createQueryBuilder("dataset")
@@ -146,7 +146,8 @@ export class OpenDataDkSharingService {
146146
ds.landingPage = undefined;
147147
ds.title = dataset.name;
148148
ds.description = dataset.description;
149-
ds.keyword = dataset.keywords != null ? dataset.keywords : [];
149+
ds.theme = dataset.keywords != null ? dataset.keywords : [];
150+
ds.keyword = dataset.keywordTags != null ? dataset.keywordTags.split(",") : [];
150151
ds.issued = dataset.createdAt;
151152
ds.modified = dataset.updatedAt;
152153
ds.publisher = {
@@ -156,6 +157,9 @@ export class OpenDataDkSharingService {
156157
ds.contactPoint["@type"] = "vcard:Contact";
157158
ds.contactPoint.fn = dataset.authorName;
158159
ds.contactPoint.hasEmail = `mailto:${dataset.authorEmail}`;
160+
ds.documentation = dataset.documentationUrl;
161+
ds.frequency = dataset.updateFrequency;
162+
ds.dataDirectory = dataset.dataDirectory;
159163

160164
ds.distribution = [this.mapDistribution(organization, dataset)];
161165

src/services/data-targets/data-target.service.ts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -307,7 +307,12 @@ export class DataTargetService {
307307

308308
o.description = dto.description;
309309
o.keywords = dto.keywords;
310+
o.keywordTags = dto.keywordTags;
310311
o.resourceTitle = dto.resourceTitle;
312+
313+
o.updateFrequency = dto.updateFrequency;
314+
o.documentationUrl = dto.documentationUrl;
315+
o.dataDirectory = dto.dataDirectory;
311316
return o;
312317
}
313318

0 commit comments

Comments
 (0)