From 43e91074ef4c04d3e00f66276606c076056d5e43 Mon Sep 17 00:00:00 2001 From: MallanagoudaB Date: Fri, 17 Apr 2026 17:44:15 +0530 Subject: [PATCH 1/6] bugfix/BUG-4750-api-status-issue --- src/module/entities/helper.js | 33 +++++++++++++++++++++++++++++++- src/module/entityTypes/helper.js | 16 +++++++++++++++- 2 files changed, 47 insertions(+), 2 deletions(-) diff --git a/src/module/entities/helper.js b/src/module/entities/helper.js index 0353c8a..db007ca 100644 --- a/src/module/entities/helper.js +++ b/src/module/entities/helper.js @@ -1870,6 +1870,19 @@ module.exports = class UserProjectsHelper { return singleEntity }) ) + + // Check if ALL records failed + const allFailed = entityUploadedData.every( + (entity) => entity.status === CONSTANTS.apiResponses.ENTITIES_FAILED + ) + + // If all failed → throw FIELD_MISSING error + if (allFailed) { + throw { + status: HTTP_STATUS_CODE.bad_request.status, + message: CONSTANTS.apiResponses.FIELD_MISSING, + } + } if (entityUploadedData.findIndex((entity) => entity === undefined) >= 0) { throw CONSTANTS.apiResponses.SOMETHING_WRONG_INSERTED_UPDATED } @@ -2002,7 +2015,25 @@ module.exports = class UserProjectsHelper { }) ) - // Check for any undefined values in entityUploadedData array + // multiple failure statuses + const failedStatuses = [ + CONSTANTS.apiResponses.ENTITIES_UPDATE_FAILED, + CONSTANTS.apiResponses.INVALID_OR_MISSING_SYSTEM_ID, + CONSTANTS.apiResponses.ENTITY_NOT_FOUND, + CONSTANTS.apiResponses.NO_INFORMATION_TO_UPDATE, + ] + + // Check if ALL records failed + const allFailed = entityUploadedData.every((entity) => failedStatuses.includes(entity.status)) + + // Check if ALL records failed + if (allFailed) { + throw { + status: HTTP_STATUS_CODE.bad_request.status, + message: CONSTANTS.apiResponses.FIELD_MISSING, + } + } + if (entityUploadedData.findIndex((entity) => entity === undefined) >= 0) { throw CONSTANTS.apiResponses.SOMETHING_WRONG_INSERTED_UPDATED } diff --git a/src/module/entityTypes/helper.js b/src/module/entityTypes/helper.js index 58c8775..44939cd 100644 --- a/src/module/entityTypes/helper.js +++ b/src/module/entityTypes/helper.js @@ -358,7 +358,21 @@ module.exports = class UserProjectsHelper { }) ) - return resolve(entityTypesUploadedData) + // Check if ALL records failed + const allFailed = entityTypesUploadedData.every( + (entity) => + entity.status === CONSTANTS.apiResponses.ENTITY_TYPE_FAILED || + entity.status === CONSTANTS.common.FAILURE || + entity.status === CONSTANTS.apiResponses.FAILURE + ) + + // If all failed → throw error + if (allFailed) { + throw { + status: HTTP_STATUS_CODE.bad_request.status, + message: CONSTANTS.apiResponses.FIELD_MISSING, + } + } } catch (error) { return reject(error) } From 77a6cb795ef3193a53185aaf9b7f71e147af50db Mon Sep 17 00:00:00 2001 From: MallanagoudaB Date: Mon, 20 Apr 2026 11:34:16 +0530 Subject: [PATCH 2/6] revert-back --- src/module/entities/helper.js | 33 +------------------------------- src/module/entityTypes/helper.js | 16 +--------------- 2 files changed, 2 insertions(+), 47 deletions(-) diff --git a/src/module/entities/helper.js b/src/module/entities/helper.js index db007ca..0353c8a 100644 --- a/src/module/entities/helper.js +++ b/src/module/entities/helper.js @@ -1870,19 +1870,6 @@ module.exports = class UserProjectsHelper { return singleEntity }) ) - - // Check if ALL records failed - const allFailed = entityUploadedData.every( - (entity) => entity.status === CONSTANTS.apiResponses.ENTITIES_FAILED - ) - - // If all failed → throw FIELD_MISSING error - if (allFailed) { - throw { - status: HTTP_STATUS_CODE.bad_request.status, - message: CONSTANTS.apiResponses.FIELD_MISSING, - } - } if (entityUploadedData.findIndex((entity) => entity === undefined) >= 0) { throw CONSTANTS.apiResponses.SOMETHING_WRONG_INSERTED_UPDATED } @@ -2015,25 +2002,7 @@ module.exports = class UserProjectsHelper { }) ) - // multiple failure statuses - const failedStatuses = [ - CONSTANTS.apiResponses.ENTITIES_UPDATE_FAILED, - CONSTANTS.apiResponses.INVALID_OR_MISSING_SYSTEM_ID, - CONSTANTS.apiResponses.ENTITY_NOT_FOUND, - CONSTANTS.apiResponses.NO_INFORMATION_TO_UPDATE, - ] - - // Check if ALL records failed - const allFailed = entityUploadedData.every((entity) => failedStatuses.includes(entity.status)) - - // Check if ALL records failed - if (allFailed) { - throw { - status: HTTP_STATUS_CODE.bad_request.status, - message: CONSTANTS.apiResponses.FIELD_MISSING, - } - } - + // Check for any undefined values in entityUploadedData array if (entityUploadedData.findIndex((entity) => entity === undefined) >= 0) { throw CONSTANTS.apiResponses.SOMETHING_WRONG_INSERTED_UPDATED } diff --git a/src/module/entityTypes/helper.js b/src/module/entityTypes/helper.js index 44939cd..58c8775 100644 --- a/src/module/entityTypes/helper.js +++ b/src/module/entityTypes/helper.js @@ -358,21 +358,7 @@ module.exports = class UserProjectsHelper { }) ) - // Check if ALL records failed - const allFailed = entityTypesUploadedData.every( - (entity) => - entity.status === CONSTANTS.apiResponses.ENTITY_TYPE_FAILED || - entity.status === CONSTANTS.common.FAILURE || - entity.status === CONSTANTS.apiResponses.FAILURE - ) - - // If all failed → throw error - if (allFailed) { - throw { - status: HTTP_STATUS_CODE.bad_request.status, - message: CONSTANTS.apiResponses.FIELD_MISSING, - } - } + return resolve(entityTypesUploadedData) } catch (error) { return reject(error) } From b2c6f8c9d3c4f5b0723a2e0efe140b2b19da710a Mon Sep 17 00:00:00 2001 From: MallanagoudaB Date: Mon, 20 Apr 2026 12:43:39 +0530 Subject: [PATCH 3/6] added-flag-flow-for-error --- src/controllers/v1/entities.js | 18 +++-- src/controllers/v1/entityTypes.js | 21 +++--- src/generics/constants/api-responses.js | 2 + src/module/entities/helper.js | 87 +++++-------------------- src/module/entityTypes/helper.js | 21 ++++-- 5 files changed, 57 insertions(+), 92 deletions(-) diff --git a/src/controllers/v1/entities.js b/src/controllers/v1/entities.js index 08ae63d..b887d32 100644 --- a/src/controllers/v1/entities.js +++ b/src/controllers/v1/entities.js @@ -1000,7 +1000,7 @@ module.exports = class Entities extends Abstract { ) // Check if new entities were created successfully - if (newEntityData.length > 0) { + if (newEntityData.hasSuccess) { const fileName = `Entity-Upload` let fileStream = new FileStream(fileName) let input = fileStream.initStream() @@ -1016,14 +1016,17 @@ module.exports = class Entities extends Abstract { // Push each new entity into the file stream for processing await Promise.all( - newEntityData.map(async (newEntity) => { + newEntityData.data.map(async (newEntity) => { input.push(newEntity) }) ) input.push(null) } else { - throw CONSTANTS.apiResponses.SOMETHING_WENT_WRONG + throw { + status: HTTP_STATUS_CODE.bad_request.status, + message: CONSTANTS.apiResponses.ALL_RECORDS_FAILED_TO_PROCESS, + } } } catch (error) { return reject({ @@ -1071,7 +1074,7 @@ module.exports = class Entities extends Abstract { let newEntityData = await entitiesHelper.bulkUpdate(entityCSVData, translationFile, req.userDetails) // Check if entities were updated successfully - if (newEntityData.length > 0) { + if (newEntityData.hasSuccess) { const fileName = `Entity-Upload` let fileStream = new FileStream(fileName) let input = fileStream.initStream() @@ -1086,14 +1089,17 @@ module.exports = class Entities extends Abstract { })() await Promise.all( - newEntityData.map(async (newEntity) => { + newEntityData.data.map(async (newEntity) => { input.push(newEntity) }) ) input.push(null) } else { - throw new Error(CONSTANTS.apiResponses.SOMETHING_WENT_WRONG) + throw { + status: HTTP_STATUS_CODE.bad_request.status, + message: CONSTANTS.apiResponses.ALL_RECORDS_FAILED_TO_UPDATE, + } } } catch (error) { return reject({ diff --git a/src/controllers/v1/entityTypes.js b/src/controllers/v1/entityTypes.js index a81751f..87e3bca 100644 --- a/src/controllers/v1/entityTypes.js +++ b/src/controllers/v1/entityTypes.js @@ -278,8 +278,7 @@ module.exports = class EntityTypes extends Abstract { // Call 'entityTypesHelper.bulkCreate' to create multiple entity types from CSV data and user details const newEntityTypeData = await entityTypesHelper.bulkCreate(entityTypesCSVData, req.userDetails) - // Check if entity types were created successfully - if (newEntityTypeData.length > 0 && newEntityTypeData[0].status === CONSTANTS.apiResponses.SUCCESS) { + if (newEntityTypeData.hasSuccess) { const fileName = `EntityType-Upload` let fileStream = new FileStream(fileName) let input = fileStream.initStream() @@ -294,16 +293,17 @@ module.exports = class EntityTypes extends Abstract { })() await Promise.all( - newEntityTypeData.map(async (entityType) => { + newEntityTypeData.data.map(async (entityType) => { input.push(entityType) }) ) input.push(null) } else { - const error = new Error(CONSTANTS.apiResponses.ENTITY_TYPE_CREATION_FAILED) - error.status = HTTP_STATUS_CODE.bad_request.status - throw error + throw { + status: HTTP_STATUS_CODE.bad_request.status, + message: CONSTANTS.apiResponses.ALL_RECORDS_FAILED_TO_PROCESS, + } } } catch (error) { return reject({ @@ -343,7 +343,7 @@ module.exports = class EntityTypes extends Abstract { let newEntityTypeData = await entityTypesHelper.bulkUpdate(entityTypesCSVData, req.userDetails) // Check if entity types were updated successfully - if (newEntityTypeData.length > 0) { + if (newEntityTypeData.hasSuccess) { const fileName = `EntityType-Upload` let fileStream = new FileStream(fileName) let input = fileStream.initStream() @@ -358,14 +358,17 @@ module.exports = class EntityTypes extends Abstract { })() await Promise.all( - newEntityTypeData.map(async (entityType) => { + newEntityTypeData.data.map(async (entityType) => { input.push(entityType) }) ) input.push(null) } else { - throw CONSTANTS.apiResponses.ENTITY_TYPE_NOT_UPDATED + throw { + status: HTTP_STATUS_CODE.bad_request.status, + message: CONSTANTS.apiResponses.ALL_RECORDS_FAILED_TO_UPDATE, + } } } catch (error) { return reject({ diff --git a/src/generics/constants/api-responses.js b/src/generics/constants/api-responses.js index 2f76711..d4234df 100644 --- a/src/generics/constants/api-responses.js +++ b/src/generics/constants/api-responses.js @@ -80,4 +80,6 @@ module.exports = { ENTITIES_DELETED_SUCCESSFULLY: 'ENTITIES_DELETED_SUCCESSFULLY', ADMIN_ROLE_REQUIRED: 'Access denied: Admin role required', NOT_A_VALID_MONGOID: 'externalId cannot be a Mongo ObjectId', + ALL_RECORDS_FAILED_TO_PROCESS: 'All records failed to process', + ALL_RECORDS_FAILED_TO_UPDATE: 'All records failed to Update', } diff --git a/src/module/entities/helper.js b/src/module/entities/helper.js index 0353c8a..65ab808 100644 --- a/src/module/entities/helper.js +++ b/src/module/entities/helper.js @@ -1718,45 +1718,8 @@ module.exports = class UserProjectsHelper { static bulkCreate(entityType, programId, solutionId, userDetails, entityCSVData, translationFile) { return new Promise(async (resolve, reject) => { try { - // let solutionsDocument = new Array() - // if (programId && solutionId) { - - // solutionsDocument = await database.models.entityTypes - // .find( - // { - // externalId: solutionId, - // programExternalId: programId, - // }, - // { - // programId: 1, - // externalId: 1, - // subType: 1, - // entityType: 1, - // entityTypeId: 1, - // } - // ) - // .lean() - // } - - // let solutionsData - - // if (solutionsDocument.length) { - // solutionsData = solutionsDocument.reduce( - // (ac, entities) => ({ - // ...ac, - // [entities.metaInformation.externalId]: { - // subType: entities.subType, - // solutionId: entities._id, - // programId: entities.programId, - // entityType: entities.entityType, - // entityTypeId: entities.entityTypeId, - // newEntities: new Array(), - // }, - // }), - // {} - // ) - // } - + // Flag to track if at least one record is successfully processed + let hasSuccess = false // Find the entity type document based on the provided entityType let tenantId = userDetails.tenantAndOrgInfo.tenantId let orgId = userDetails.tenantAndOrgInfo.orgId[0] @@ -1841,9 +1804,6 @@ module.exports = class UserProjectsHelper { if (translationFile) { entityCreation['translations'] = translationFile[entityCreation.metaInformation.name] } - - // if (solutionsData && singleEntity._solutionId && singleEntity._solutionId != '') - // singleEntity['createdByProgramId'] = solutionsData[singleEntity._solutionId]['programId'] let newEntity = await entitiesQueries.create(entityCreation) if (!newEntity._id) { return @@ -1854,19 +1814,8 @@ module.exports = class UserProjectsHelper { if (singleEntity._SYSTEM_ID) { singleEntity.status = CONSTANTS.apiResponses.SUCCESS singleEntity.message = CONSTANTS.apiResponses.SUCCESS + hasSuccess = true } - - // if ( - // solutionsData && - // singleEntity._solutionId && - // singleEntity._solutionId != '' && - // newEntity.entityType == solutionsData[singleEntity._solutionId]['entityType'] - // ) { - // solutionsData[singleEntity._solutionId].newEntities.push(newEntity._id) - // } - - // await this.pushEntitiesToElasticSearch([singleEntity["_SYSTEM_ID"]]); - return singleEntity }) ) @@ -1874,23 +1823,11 @@ module.exports = class UserProjectsHelper { throw CONSTANTS.apiResponses.SOMETHING_WRONG_INSERTED_UPDATED } - // solutionsData && - // (await Promise.all( - // Object.keys(solutionsData).map(async (solutionExternalId) => { - // if (solutionsData[solutionExternalId].newEntities.length > 0) { - // await database.models.solutions.updateOne( - // { _id: solutionsData[solutionExternalId].solutionId }, - // { - // $addToSet: { - // entities: { $each: solutionsData[solutionExternalId].newEntities }, - // }, - // } - // ) - // } - // }) - // )) - - return resolve(entityUploadedData) + // return resolve(entityUploadedData) + return resolve({ + data: entityUploadedData, + hasSuccess, + }) } catch (error) { return reject(error) } @@ -1910,6 +1847,8 @@ module.exports = class UserProjectsHelper { static bulkUpdate(entityCSVData, translationFile, userDetails) { return new Promise(async (resolve, reject) => { try { + // Flag to track if at least one record is successfully processed + let hasSuccess = false let tenantId = userDetails.tenantAndOrgInfo.tenantId const entityUploadedData = await Promise.all( entityCSVData.map(async (singleEntity) => { @@ -1993,6 +1932,7 @@ module.exports = class UserProjectsHelper { } else { singleEntity['status'] = CONSTANTS.apiResponses.SUCCESS singleEntity['message'] = CONSTANTS.apiResponses.SUCCESS + hasSuccess = true } } else { singleEntity['status'] = CONSTANTS.apiResponses.NO_INFORMATION_TO_UPDATE @@ -2007,7 +1947,10 @@ module.exports = class UserProjectsHelper { throw CONSTANTS.apiResponses.SOMETHING_WRONG_INSERTED_UPDATED } - return resolve(entityUploadedData) + return resolve({ + data: entityUploadedData, + hasSuccess, + }) } catch (error) { return reject(error) } diff --git a/src/module/entityTypes/helper.js b/src/module/entityTypes/helper.js index 58c8775..3bd1e7c 100644 --- a/src/module/entityTypes/helper.js +++ b/src/module/entityTypes/helper.js @@ -29,6 +29,8 @@ module.exports = class UserProjectsHelper { console.log(userDetails, '<--userDetails in bulkCreate entityTypesCSVData') return new Promise(async (resolve, reject) => { try { + // Flag to track if at least one record is successfully processed + let hasSuccess = false const entityTypesUploadedData = await Promise.all( entityTypesCSVData.map(async (entityType) => { try { @@ -107,8 +109,9 @@ module.exports = class UserProjectsHelper { ) ) if (newEntityType._id) { - entityType['_SYSTEM_ID'] = newEntityType._id - entityType.status = CONSTANTS.apiResponses.SUCCESS + ;(entityType['_SYSTEM_ID'] = newEntityType._id), + (entityType.status = CONSTANTS.apiResponses.SUCCESS), + (hasSuccess = true) } else { entityType['_SYSTEM_ID'] = '' entityType.status = CONSTANTS.apiResponses.FAILURE @@ -123,7 +126,10 @@ module.exports = class UserProjectsHelper { }) ) - return resolve(entityTypesUploadedData) + return resolve({ + data: entityTypesUploadedData, + hasSuccess, + }) } catch (error) { return reject(error) } @@ -260,6 +266,8 @@ module.exports = class UserProjectsHelper { static bulkUpdate(entityTypesCSVData, userDetails) { return new Promise(async (resolve, reject) => { try { + // Flag to track if at least one record is successfully processed + let hasSuccess = false let tenantId = userDetails.tenantAndOrgInfo.tenantId // Process each entity type in the provided array asynchronously const entityTypesUploadedData = await Promise.all( @@ -343,7 +351,7 @@ module.exports = class UserProjectsHelper { if (updateEntityType._id) { entityType['_SYSTEM_ID'] = updateEntityType._id - entityType.status = CONSTANTS.common.SUCCESS + ;(entityType.status = CONSTANTS.common.SUCCESS), (hasSuccess = true) } else { entityType['_SYSTEM_ID'] = '' entityType.status = CONSTANTS.common.FAILURE @@ -358,7 +366,10 @@ module.exports = class UserProjectsHelper { }) ) - return resolve(entityTypesUploadedData) + return resolve({ + data: entityTypesUploadedData, + hasSuccess, + }) } catch (error) { return reject(error) } From 41ce0b067cff5409eece67bd0190f19c567ca9c6 Mon Sep 17 00:00:00 2001 From: MallanagoudaB Date: Mon, 20 Apr 2026 12:53:02 +0530 Subject: [PATCH 4/6] added-flag-flow-for-error --- src/generics/constants/api-responses.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/generics/constants/api-responses.js b/src/generics/constants/api-responses.js index d4234df..f3929fd 100644 --- a/src/generics/constants/api-responses.js +++ b/src/generics/constants/api-responses.js @@ -81,5 +81,5 @@ module.exports = { ADMIN_ROLE_REQUIRED: 'Access denied: Admin role required', NOT_A_VALID_MONGOID: 'externalId cannot be a Mongo ObjectId', ALL_RECORDS_FAILED_TO_PROCESS: 'All records failed to process', - ALL_RECORDS_FAILED_TO_UPDATE: 'All records failed to Update', + ALL_RECORDS_FAILED_TO_UPDATE: 'All records failed to update', } From 7329ee5c50cc30e0a4888b7ccffb71435367e572 Mon Sep 17 00:00:00 2001 From: MallanagoudaB Date: Mon, 20 Apr 2026 13:44:27 +0530 Subject: [PATCH 5/6] added-release-notes --- src/controllers/v1/entities.js | 4 ++-- src/controllers/v1/entityTypes.js | 4 ++-- src/module/entityTypes/helper.js | 1 - src/release-notes/staging/release-3.4.1_RC1.md | 7 +++++++ 4 files changed, 11 insertions(+), 5 deletions(-) create mode 100644 src/release-notes/staging/release-3.4.1_RC1.md diff --git a/src/controllers/v1/entities.js b/src/controllers/v1/entities.js index b887d32..65b030c 100644 --- a/src/controllers/v1/entities.js +++ b/src/controllers/v1/entities.js @@ -1000,7 +1000,7 @@ module.exports = class Entities extends Abstract { ) // Check if new entities were created successfully - if (newEntityData.hasSuccess) { + if (newEntityData.hasSuccess && newEntityData.data.length > 0) { const fileName = `Entity-Upload` let fileStream = new FileStream(fileName) let input = fileStream.initStream() @@ -1074,7 +1074,7 @@ module.exports = class Entities extends Abstract { let newEntityData = await entitiesHelper.bulkUpdate(entityCSVData, translationFile, req.userDetails) // Check if entities were updated successfully - if (newEntityData.hasSuccess) { + if (newEntityData.hasSuccess && newEntityData.data.length > 0) { const fileName = `Entity-Upload` let fileStream = new FileStream(fileName) let input = fileStream.initStream() diff --git a/src/controllers/v1/entityTypes.js b/src/controllers/v1/entityTypes.js index 87e3bca..e5509a0 100644 --- a/src/controllers/v1/entityTypes.js +++ b/src/controllers/v1/entityTypes.js @@ -278,7 +278,7 @@ module.exports = class EntityTypes extends Abstract { // Call 'entityTypesHelper.bulkCreate' to create multiple entity types from CSV data and user details const newEntityTypeData = await entityTypesHelper.bulkCreate(entityTypesCSVData, req.userDetails) - if (newEntityTypeData.hasSuccess) { + if (newEntityTypeData.hasSuccess && newEntityTypeData.data.length > 0) { const fileName = `EntityType-Upload` let fileStream = new FileStream(fileName) let input = fileStream.initStream() @@ -343,7 +343,7 @@ module.exports = class EntityTypes extends Abstract { let newEntityTypeData = await entityTypesHelper.bulkUpdate(entityTypesCSVData, req.userDetails) // Check if entity types were updated successfully - if (newEntityTypeData.hasSuccess) { + if (newEntityTypeData.hasSuccess && newEntityTypeData.data.length > 0) { const fileName = `EntityType-Upload` let fileStream = new FileStream(fileName) let input = fileStream.initStream() diff --git a/src/module/entityTypes/helper.js b/src/module/entityTypes/helper.js index 3bd1e7c..a3ec997 100644 --- a/src/module/entityTypes/helper.js +++ b/src/module/entityTypes/helper.js @@ -26,7 +26,6 @@ module.exports = class UserProjectsHelper { * @returns {JSON} - uploaded entity information. */ static bulkCreate(entityTypesCSVData, userDetails) { - console.log(userDetails, '<--userDetails in bulkCreate entityTypesCSVData') return new Promise(async (resolve, reject) => { try { // Flag to track if at least one record is successfully processed diff --git a/src/release-notes/staging/release-3.4.1_RC1.md b/src/release-notes/staging/release-3.4.1_RC1.md new file mode 100644 index 0000000..7abf3bf --- /dev/null +++ b/src/release-notes/staging/release-3.4.1_RC1.md @@ -0,0 +1,7 @@ +# 🚀 Entity-Service Release 4.0.1 + +## 🐞 Bug Fixes + +- **4721** – When there is miss-matching external id's in csv file.createMappingCsv API gives success message. +- **4750** - API returns 200 success response even when mandatory fields are missing during entity bulk creation. + . From 9fd23b2d2030321742a533fe2bdbf291c0fbf4dc Mon Sep 17 00:00:00 2001 From: MallanagoudaB Date: Mon, 20 Apr 2026 13:46:48 +0530 Subject: [PATCH 6/6] added-release-notes --- .../staging/{release-3.4.1_RC1.md => release-3.4.1_RC_2.md} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename src/release-notes/staging/{release-3.4.1_RC1.md => release-3.4.1_RC_2.md} (100%) diff --git a/src/release-notes/staging/release-3.4.1_RC1.md b/src/release-notes/staging/release-3.4.1_RC_2.md similarity index 100% rename from src/release-notes/staging/release-3.4.1_RC1.md rename to src/release-notes/staging/release-3.4.1_RC_2.md