Skip to content

Commit

Permalink
feat(metadata): improve asset metadata (#346)
Browse files Browse the repository at this point in the history
* feat: add optional property 'strategy' in MetadataProperty

* feat: add optional property 'format' in MetadataProperty

* feat: implement replace metadata

* renaming: change asset metadata replace naming

* style: fix to pass linter

* documentation: definition of replaceMetadata in the asset controller

* feat: change put to patch for the http verb to be more meaningful

* documentation: update http method

* Update doc/2/controllers/assets/replace-metadata/index.md

Co-authored-by: Alexandre Bouthinon <bouthinon.alexandre@gmail.com>

KZLPRD-323

---------

Co-authored-by: Eric <31733541+etrousset@users.noreply.github.com>
Co-authored-by: Alexandre Bouthinon <bouthinon.alexandre@gmail.com>
  • Loading branch information
3 people authored and sebtiz13 committed Jul 8, 2024
1 parent 17eda8b commit 2eb5887
Show file tree
Hide file tree
Showing 5 changed files with 177 additions and 0 deletions.
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;
}

interface MetadataObject {
Expand Down

0 comments on commit 2eb5887

Please sign in to comment.