Skip to content

Commit

Permalink
fix: #OBS-I452 Dataset alias attach and detach functionality
Browse files Browse the repository at this point in the history
  • Loading branch information
JeraldJF committed Jan 16, 2025
1 parent ad844b9 commit 49868a1
Show file tree
Hide file tree
Showing 5 changed files with 134 additions and 0 deletions.
45 changes: 45 additions & 0 deletions api-service/src/controllers/DatasetAlias/AttachAlias.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
import { Request, Response } from "express";
import { schemaValidation } from "../../services/ValidationService";
import AttachAliasSchema from "./AttachAliasValidationSchema.json"
import { obsrvError } from "../../types/ObsrvError";
import _ from "lodash";
import { datasetService } from "../../services/DatasetService";
import { Op } from "sequelize";
import { Dataset } from "../../models/Dataset";
import { ResponseHandler } from "../../helpers/ResponseHandler";
import httpStatus from "http-status";


const validateRequest = async (req: Request) => {

const isRequestValid: Record<string, any> = schemaValidation(req.body, AttachAliasSchema)
if (!isRequestValid.isValid) {
throw obsrvError("", "DATASET_ALIAS_INPUT_INVALID", isRequestValid.message, "BAD_REQUEST", 400)
}

const { dataset_id, alias_name: alias } = _.get(req, ["body", "request"])
const dataset = await datasetService.getDataset(dataset_id, ["id", "name", "alias"], true);
if (_.isEmpty(dataset)) {
throw obsrvError(dataset_id, "DATASET_NOT_EXISTS", `Dataset does not exists with id:${dataset_id}`, "NOT_FOUND", 404);
}

if (_.get(dataset, "alias")) {
throw obsrvError(dataset_id, "DATASET_ALIAS_EXISTS", `Dataset already has alias associated with it. Please detach the existing alias and try again`, "CONFLICT", 409);
}

const datasetList = await datasetService.findDatasets({ [Op.or]: [{ dataset_id: alias }, { name: alias }, { alias }] }, ["id"]);
const draftDatasetList = await datasetService.findDraftDatasets({ [Op.or]: [{ dataset_id: alias }, { name: alias }] }, ["id"]);
if (!(_.isEmpty(datasetList) && _.isEmpty(draftDatasetList))) {
throw obsrvError(dataset_id, "DATASET_ALIAS_NOT_UNIQUE", `Dataset alias must be unique. The alias '${alias}' cannot be the same as the dataset id, dataset name or alias name of any other dataset.`, "CONFLICT", 409);
}

}

const attachAlias = async (req: Request, res: Response) => {
await validateRequest(req)
const { dataset_id, alias_name } = _.get(req, ["body", "request"])
await Dataset.update({ alias: alias_name }, { where: { id: dataset_id } });
ResponseHandler.successResponse(req, res, { status: httpStatus.OK, data: { message: `Dataset alias name attached successfully`, dataset_id } });
}

export default attachAlias;
Original file line number Diff line number Diff line change
@@ -0,0 +1,54 @@
{
"type": "object",
"properties": {
"id": {
"type": "string",
"enum": [
"api.datasets.alias.attach"
]
},
"ver": {
"type": "string"
},
"ts": {
"type": "string"
},
"params": {
"type": "object",
"properties": {
"msgid": {
"type": "string"
}
},
"required": [
"msgid"
],
"additionalProperties": false
},
"request": {
"type": "object",
"properties": {
"dataset_id": {
"type": "string"
},
"alias_name": {
"type": "string",
"minLength": 1
}
},
"required": [
"dataset_id",
"alias_name"
],
"additionalProperties": false
}
},
"required": [
"id",
"ver",
"ts",
"params",
"request"
],
"additionalProperties": false
}
27 changes: 27 additions & 0 deletions api-service/src/controllers/DatasetAlias/DetachAlias.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
import { Request, Response } from "express";
import { datasetService } from "../../services/DatasetService";
import { obsrvError } from "../../types/ObsrvError";
import { Dataset } from "../../models/Dataset";
import { ResponseHandler } from "../../helpers/ResponseHandler";
import httpStatus from "http-status";
import _ from "lodash";

const validateDataset = async (dataset_id: string) => {
const dataset = await datasetService.getDataset(dataset_id, ["alias"], true);
if (!dataset) {
throw obsrvError(dataset_id, "DATASET_NOT_FOUND", `Dataset with the given dataset_id:${dataset_id} not found`, "NOT_FOUND", 404);
}
if (!_.get(dataset, "alias")) {
throw obsrvError(dataset_id, "DATASET_ALIAS_NOT_EXISTS", `Dataset does not have any alias associated with it`, "NOT_FOUND", 404);
}
return _.get(dataset, "alias")
}

const detachAlias = async (req: Request, res: Response) => {
const dataset_id = req.params.dataset_id
const alias_name=await validateDataset(dataset_id);
await Dataset.update({ alias: null }, { where: { id: dataset_id } });
ResponseHandler.successResponse(req, res, { status: httpStatus.OK, data: { message: `Dataset alias name '${alias_name}' detached successfully`, dataset_id } });
}

export default detachAlias;
4 changes: 4 additions & 0 deletions api-service/src/models/Dataset.ts
Original file line number Diff line number Diff line change
Expand Up @@ -75,6 +75,10 @@ export const Dataset = sequelize.define("datasets", {
entry_topic: {
type: DataTypes.STRING,
allowNull: false
},
alias: {
type: DataTypes.STRING,
allowNull: true
}
}, {
tableName: "datasets",
Expand Down
4 changes: 4 additions & 0 deletions api-service/src/routes/Router.ts
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,8 @@ import telemetryActions from "../telemetry/telemetryActions";
import datasetMetrics from "../controllers/DatasetMetrics/DatasetMetricsController";
import checkRBAC from "../middlewares/RBAC_middleware";
import connectorRegisterController from "../controllers/ConnectorRegister/ConnectorRegisterController";
import attachAlias from "../controllers/DatasetAlias/AttachAlias";
import detachAlias from "../controllers/DatasetAlias/DetachAlias";

export const router = express.Router();

Expand Down Expand Up @@ -60,6 +62,8 @@ router.post("/connectors/list", setDataToRequestObject("api.connectors.list"), o
router.get("/connectors/read/:id", setDataToRequestObject("api.connectors.read"), onRequest({entity: Entity.Management }), telemetryAuditStart({action: telemetryActions.readConnectors, operationType: OperationType.GET}), checkRBAC.handler(), ConnectorsRead);
router.post("/datasets/import", setDataToRequestObject("api.datasets.import"), onRequest({ entity: Entity.Management }), checkRBAC.handler(), DatasetImport);
router.post("/connector/register", setDataToRequestObject("api.connector.register"), onRequest({ entity: Entity.Management }), connectorRegisterController);
router.post("/datasets/alias/attach", setDataToRequestObject("api.datasets.alias.attach"), onRequest({ entity: Entity.Management }), checkRBAC.handler(), attachAlias);
router.delete("/datasets/alias/detach/:dataset_id", setDataToRequestObject("api.datasets.alias.detach"), onRequest({ entity: Entity.Management }), checkRBAC.handler(), detachAlias);
//Wrapper Service
router.post("/obsrv/data/sql-query", setDataToRequestObject("api.obsrv.data.sql-query"), onRequest({ entity: Entity.Data_out }), checkRBAC.handler(), sqlQuery);
router.post("/data/metrics", setDataToRequestObject("api.data.metrics"), onRequest({ entity: Entity.Data_out }), datasetMetrics)
Expand Down

0 comments on commit 49868a1

Please sign in to comment.