Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat(metadata): improve asset metadata #346

Merged
merged 9 commits into from
Jul 8, 2024
80 changes: 80 additions & 0 deletions doc/2/controllers/assets/replace-metadata/index.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,80 @@
---
code: true
type: page
title: replaceMetadata
description: Replace asset metadata
---

# replaceMetadata

Replace `metadata` of an asset. It will replace only the fields specified in the request body.

## Query Syntax

### HTTP

```http
URL: http://kuzzle:7512/_/device-manager/:engineId/assets/:_id/metadata
Method: PATCH
```

### Other protocols

```js
{
"controller": "device-manager/assets",
"action": "replaceMetadata",
"engineId": "<engineId>",
"_id": "<assetId>",
"body": {
"metadata": {
"<metadata name>": "<metadata value>"
}
}
}
```

## Arguments

- `engineId`: Engine ID
- `_id`: Asset ID

## Body properties

- `metadata`: Object containing metadata

## Response

```js
{
"action": "replaceMetadata",
"collection": "assets",
"controller": "device-manager/assets",
"error": null,
"headers": {},
"index": /** index */,
"node": /** node */,
"requestId": /** request id */,
"result": {
"_id": /** asset id */,
"_source": {
"groups": [],
"lastMeasuredAt": null,
"linkedDevices": [],
"measures": {
/** mesures */
},
"metadata": {
/** REPLACED METADATA */
},
"model": /** asset model */,
"reference": /** asset reference */,
"_kuzzle_info": {
/** data management info */
}
}
},
"status": 200,
"volatile": null
}
```
54 changes: 54 additions & 0 deletions lib/modules/asset/AssetService.ts
Original file line number Diff line number Diff line change
Expand Up @@ -134,6 +134,60 @@ export class AssetService extends BaseService {
});
}

/**
* Replace an asset metadata
*/
public async replaceMetadata(
engineId: string,
assetId: string,
metadata: Metadata,
request: KuzzleRequest,
): Promise<KDocument<AssetContent>> {
const asset = await this.get(engineId, assetId, request);

for (const key in metadata) {
if (key in asset._source.metadata) {
asset._source.metadata[key] = metadata[key];
}
}

const updatedPayload = await this.app.trigger<EventAssetUpdateBefore>(
"device-manager:asset:update:before",
{ asset, metadata },
);

const updatedAsset = await this.sdk.document.replace<AssetContent>(
engineId,
InternalCollection.ASSETS,
assetId,
updatedPayload.asset._source,
);

await this.assetHistoryService.add<AssetHistoryEventMetadata>(engineId, [
{
asset: updatedAsset._source,
event: {
metadata: {
names: Object.keys(flattenObject(updatedPayload.metadata)),
},
name: "metadata",
},
id: updatedAsset._id,
timestamp: Date.now(),
},
]);

await this.app.trigger<EventAssetUpdateAfter>(
"device-manager:asset:update:after",
{
asset: updatedAsset,
metadata: updatedPayload.metadata,
},
);

return updatedAsset;
}

/**
* Update or Create an asset metadata
*/
Expand Down
27 changes: 27 additions & 0 deletions lib/modules/asset/AssetsController.ts
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@ import {
ApiAssetSearchResult,
ApiAssetUpdateResult,
ApiAssetMigrateTenantResult,
ApiAssetMetadataReplaceResult,
} from "./types/AssetApi";

export class AssetsController {
Expand Down Expand Up @@ -65,6 +66,15 @@ export class AssetsController {
handler: this.update.bind(this),
http: [{ path: "device-manager/:engineId/assets/:_id", verb: "put" }],
},
replaceMetadata: {
handler: this.replaceMetadata.bind(this),
http: [
{
path: "device-manager/:engineId/assets/:_id/metadata",
verb: "patch",
},
],
},
getMeasures: {
handler: this.getMeasures.bind(this),
http: [
Expand Down Expand Up @@ -168,6 +178,23 @@ export class AssetsController {
return AssetSerializer.serialize(updatedAsset);
}

async replaceMetadata(
request: KuzzleRequest,
): Promise<ApiAssetMetadataReplaceResult> {
const assetId = request.getId();
const engineId = request.getString("engineId");
const metadata = request.getBodyObject("metadata");

const updatedAsset = await this.assetService.replaceMetadata(
engineId,
assetId,
metadata,
request,
);

return AssetSerializer.serialize(updatedAsset);
}

async create(request: KuzzleRequest): Promise<ApiAssetCreateResult> {
const engineId = request.getString("engineId");
const model = request.getBodyString("model");
Expand Down
14 changes: 14 additions & 0 deletions lib/modules/asset/types/AssetApi.ts
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,20 @@ export interface ApiAssetUpdateRequest extends AssetsControllerRequest {
}
export type ApiAssetUpdateResult = KDocument<AssetContent>;

export interface ApiAssetMetadataReplaceRequest
extends AssetsControllerRequest {
action: "replaceMetadata";

_id: string;

refresh?: string;

body: {
metadata: Metadata;
};
}
export type ApiAssetMetadataReplaceResult = KDocument<AssetContent>;

export interface ApiAssetUpsertRequest extends AssetsControllerRequest {
action: "upsert";

Expand Down
2 changes: 2 additions & 0 deletions lib/modules/model/types/ModelContent.ts
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,8 @@ export interface MeasureModelContent extends KDocumentContent {
}
interface MetadataProperty {
type: string;
strategy?: string;
format?: string;
}

export interface MetadataMappings {
Expand Down
Loading