Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
39 commits
Select commit Hold shift + click to select a range
e9cf645
Issue #251045 feat: Hierarchical Categories Implementation
vaivk369 Jan 8, 2026
554d27a
added details API
vaivk369 Jan 8, 2026
030f146
Issue #000 fix: metainformation added
vaivk369 Jan 8, 2026
ceb9598
Issue #000 fix: parent_id is not defined
vaivk369 Jan 8, 2026
173caa3
Issue #000 fix: parent_id is not defined
vaivk369 Jan 8, 2026
5aa79a8
Coderabbit comments resolved
vaivk369 Jan 8, 2026
a77b037
Resolving commnets
vaivk369 Jan 9, 2026
a6b6f27
Resolving commnets
vaivk369 Jan 9, 2026
785dbe9
Resolving commnets
vaivk369 Jan 9, 2026
28fe71d
Update .env.sample
AbhilashKD Jan 10, 2026
567f3fd
Merge pull request #1 from vaivk369/new-dev
vaivk369 Jan 10, 2026
be237cf
Create brac-dev-deployment.yaml
AbhilashKD Jan 10, 2026
4883172
Explicitly export AWS variables in deployment script
AbhilashKD Jan 10, 2026
73288b4
Update brac-dev-deployment.yaml
AbhilashKD Jan 10, 2026
c6880eb
Issue #000 fix: if entityId is passed to the importFromLibray, error …
vaivk369 Jan 12, 2026
119f728
Issue #000 fix: if entityId is passed to the importFromLibray, error …
vaivk369 Jan 12, 2026
3c71067
Merge pull request #2 from vaivk369/import-lib-entityID
vaivk369 Jan 12, 2026
ee6f92b
Issue #000 fix: ProgramUser mapping
vaivk369 Jan 20, 2026
09709aa
Merge pull request #3 from vaivk369/vk-idp-mt
vaivk369 Jan 20, 2026
df605d8
Routes added
vaivk369 Jan 20, 2026
90ab393
Routes added
vaivk369 Jan 20, 2026
567600d
Merge branch 'develop' into vk-idp-mt
vaivk369 Jan 20, 2026
d05b050
Merge pull request #4 from vaivk369/vk-idp-mt
vaivk369 Jan 20, 2026
af22646
Issue#252622 Feat: Importing project from multiple templates
Sachintechjoomla Jan 20, 2026
f381ced
Issue#252622 Feat: Importing project from multiple templates
Sachintechjoomla Jan 20, 2026
e4489a1
Issue#252622 Feat: Importing project from multiple templates
Sachintechjoomla Jan 20, 2026
91ec872
Routes added
vaivk369 Jan 20, 2026
8a3a639
Merge branch 'vk-idp-mt' of github.com:vaivk369/sl-project-service in…
vaivk369 Jan 20, 2026
7507135
Merge pull request #5 from vaivk369/vk-idp-mt
vaivk369 Jan 20, 2026
07f7e35
filter by search and status
vaivk369 Jan 20, 2026
92cf1ed
Merge pull request #6 from vaivk369/vk-idp-mt
vaivk369 Jan 20, 2026
31c6edd
Issue #000 fix: limit and page not working
vaivk369 Jan 21, 2026
38354e4
Merge pull request #7 from vaivk369/vk-idp-mt
vaivk369 Jan 21, 2026
73cada4
Issue#252622 Feat: Importing project from multiple templates
Sachintechjoomla Jan 21, 2026
f630f70
Merge pull request #8 from Sachintechjoomla/Issue#252622
vaivk369 Jan 21, 2026
79d5a80
Issue #000 fix: getEntities by entityId
vaivk369 Jan 21, 2026
60906ab
Feat: API to update the specific entity of the LC entities
vaivk369 Jan 21, 2026
3d62845
Feat: API to update the specific entity of the LC entities
vaivk369 Jan 21, 2026
bee293d
Issue #000 fix: updating overview count on craeteOrUpdate and updateE…
vaivk369 Jan 21, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .env.sample
Original file line number Diff line number Diff line change
Expand Up @@ -98,4 +98,4 @@ ORG_UPDATES_TOPIC = elevate_project_org_extension_event_listener

USER_ACCOUNT_EVENT_TOPIC = elevate_user_account_event_listener // Kafka topic to listen user account events
SESSION_VERIFICATION_METHOD = user_service_authenticated // session verification method
USER_SERVICE_INTERNAL_ACCESS_TOKEN_HEADER_KEY = internal_access_token // user service's internal access token header key
USER_SERVICE_INTERNAL_ACCESS_TOKEN_HEADER_KEY = internal_access_token // user service's internal access token header key.
81 changes: 81 additions & 0 deletions .github/workflows/brac-dev-deployment.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,81 @@
name: Dev Build & Deploy Project Service (BRAC)

on:
push:
branches:
- develop

env:
AWS_REGION: ${{ secrets.AWS_REGION }}
ECR_REPOSITORY: ${{ secrets.ECR_REPOSITORY_BRAC }}
AWS_ACCOUNT_ID: ${{ secrets.AWS_ACCOUNT_ID }}

jobs:
build-and-deploy:
runs-on: ubuntu-latest

permissions:
contents: read

steps:
- name: Checkout code
uses: actions/checkout@v4

# =========================
# AWS Authentication
# =========================
- name: Configure AWS credentials
uses: aws-actions/configure-aws-credentials@v4
with:
aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
aws-region: ${{ env.AWS_REGION }}

# =========================
# Login to Amazon ECR
# =========================
- name: Login to Amazon ECR
uses: aws-actions/amazon-ecr-login@v2

# =========================
# Build & Push Image
# =========================
- name: Build and Push Docker Image to ECR
uses: docker/build-push-action@v5
with:
context: .
push: true
tags: |
${{ env.AWS_ACCOUNT_ID }}.dkr.ecr.${{ env.AWS_REGION }}.amazonaws.com/${{ env.ECR_REPOSITORY }}:latest-brac
${{ env.AWS_ACCOUNT_ID }}.dkr.ecr.${{ env.AWS_REGION }}.amazonaws.com/${{ env.ECR_REPOSITORY }}:${{ github.sha }}

# =========================
# Deploy on Server
# =========================
- name: Deploy Stack
uses: appleboy/ssh-action@master
with:
host: ${{ secrets.HOST_NAME_DEV }}
username: ${{ secrets.USERNAME_DEV }}
key: ${{ secrets.SSH_KEY_DEV }}
port: ${{ secrets.PORT_DEV }}
script: |
set -e

# Export AWS variables explicitly
export AWS_REGION="${{ secrets.AWS_REGION }}"
export AWS_ACCOUNT_ID="${{ secrets.AWS_ACCOUNT_ID }}"

cd ${{ secrets.TARGET_DIR_DEV }}

if [ -f .env ]; then
mv .env .env-bkp
fi

echo '${{ secrets.DEV_ENV_BRAC }}' > .env

aws ecr get-login-password --region "$AWS_REGION" \
| docker login --username AWS \
--password-stdin "$AWS_ACCOUNT_ID.dkr.ecr.$AWS_REGION.amazonaws.com"

./deploy.sh
70 changes: 70 additions & 0 deletions constants/interface-routes/elevate-project/configs.json
Original file line number Diff line number Diff line change
Expand Up @@ -905,6 +905,62 @@
],
"service": "project"
},
{
"sourceRoute": "/project/v1/library/categories/delete/:id",
"type": "DELETE",
"priority": "MUST_HAVE",
"inSequence": false,
"orchestrated": false,
"targetPackages": [
{
"basePackageName": "project",
"packageName": "elevate-project"
}
],
"service": "project"
},
{
"sourceRoute": "/project/v1/library/categories/details/:id",
"type": "GET",
"priority": "MUST_HAVE",
"inSequence": false,
"orchestrated": false,
"targetPackages": [
{
"basePackageName": "project",
"packageName": "elevate-project"
}
],
"service": "project"
},
{
"sourceRoute": "/project/v1/programUsers/createOrUpdate",
"type": "POST",
"priority": "MUST_HAVE",
"inSequence": false,
"orchestrated": false,
"targetPackages": [
{
"basePackageName": "project",
"packageName": "elevate-project"
}
],
"service": "project"
},
{
"sourceRoute": "/project/v1/programUsers/getEntities",
"type": "GET",
"priority": "MUST_HAVE",
"inSequence": false,
"orchestrated": false,
"targetPackages": [
{
"basePackageName": "project",
"packageName": "elevate-project"
}
],
"service": "project"
},
{
"sourceRoute": "/project/v1/programs/create",
"type": "POST",
Expand Down Expand Up @@ -1521,6 +1577,20 @@
],
"service": "project"
},
{
"sourceRoute": "/project/v1/userProjects/createProjectPlan",
"type": "POST",
"priority": "MUST_HAVE",
"inSequence": false,
"orchestrated": false,
"targetPackages": [
{
"basePackageName": "project",
"packageName": "elevate-project"
}
],
"service": "project"
},
{
"sourceRoute": "/project/v1/userProjects/update",
"type": "POST",
Expand Down
67 changes: 63 additions & 4 deletions controllers/v1/library/categories.js
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,7 @@ module.exports = class LibraryCategories extends Abstract {
}

/**
* @api {get} /improvement-project/api/v1/library/categories/projects/:categoryExternalId?page=:page&limit=:limit&search=:search&sort=:sort
* @api {get} /improvement-project/api/v1/library/categories/projects/:categoryExternalId?page=:page&limit=:limit&search=:search&sort=:sort
* List of library projects.
* @apiVersion 1.0.0
* @apiGroup Library Categories
Expand All @@ -56,7 +56,7 @@ module.exports = class LibraryCategories extends Abstract {
"description" : "Test template description",
"createdAt": "2020-08-31T05:59:12.230Z"
}
],
],
"count": 7
}
}
Expand Down Expand Up @@ -179,7 +179,7 @@ module.exports = class LibraryCategories extends Abstract {
}

/**
* @api {get} /improvement-project/api/v1/library/categories/list
* @api {get} /improvement-project/api/v1/library/categories/list
* List of library categories.
* @apiVersion 1.0.0
* @apiGroup Library Categories
Expand Down Expand Up @@ -240,7 +240,66 @@ module.exports = class LibraryCategories extends Abstract {
async list(req) {
return new Promise(async (resolve, reject) => {
try {
let projectCategories = await libraryCategoriesHelper.list(req)
let projectCategories = await libraryCategoriesHelper.list(req.searchText, req.query, req.userDetails)

projectCategories.result = projectCategories.data

return resolve(projectCategories)
} catch (error) {
return reject({
status: error.status || HTTP_STATUS_CODE.internal_server_error.status,
message: error.message || HTTP_STATUS_CODE.internal_server_error.message,
errorObject: error,
})
}
})
}

/**
* delete a library category
* @method
* @name delete
* @param {Object} req - requested data
* @returns {Array} Library categories.
*/

async delete(req) {
return new Promise(async (resolve, reject) => {
try {
const filterQuery = {
_id: req.params._id,
}
let projectCategories = await libraryCategoriesHelper.delete(filterQuery, req.userDetails)

projectCategories.result = projectCategories.data

return resolve(projectCategories)
} catch (error) {
return reject({
status: error.status || HTTP_STATUS_CODE.internal_server_error.status,
message: error.message || HTTP_STATUS_CODE.internal_server_error.message,
errorObject: error,
})
}
})
}

/**
* read a library category
* @method
* @name details
* @param {Object} req - requested data
* @returns {Array} Library categories.
*/

async details(req) {
return new Promise(async (resolve, reject) => {
try {
const filterQuery = {
_id: req.params._id,
getChildren: req.query.getChildren === 'true',
}
let projectCategories = await libraryCategoriesHelper.details(filterQuery, req.userDetails)

projectCategories.result = projectCategories.data

Expand Down
94 changes: 83 additions & 11 deletions controllers/v1/programUsers.js
Original file line number Diff line number Diff line change
Expand Up @@ -2,21 +2,93 @@
* name : programUsers.js
* author : Ankit Shahu
* created-date : 9-Jan-2023
* Description : PII data related controller.
*/
* Description : Program Users related controller.
*/

const programUsersHelper = require(MODULES_BASE_PATH + '/programUsers/helper')

/**
* programUsers
* @class
* programUsers
* @class
*/
module.exports = class ProgramUsers extends Abstract {
constructor() {
super("programUsers");
}
constructor() {
super('programUsers')
}

static get name() {
return 'programUsers'
}

/**
* Create or update program user
* Supports: create, update, add entity, update status
* Routes to updateEntity if entityId and entityUpdates are provided
* @method
* @name createOrUpdate
* @param {Object} req - request object
* @returns {Object} response with status and result
*/
async createOrUpdate(req) {
return new Promise(async (resolve, reject) => {
try {
// Check if this is an entity-specific update
if (req.body.entityId && req.body.entityUpdates) {
const result = await programUsersHelper.updateEntity(req.body, req.userDetails)
return resolve(result)
}

// Regular createOrUpdate flow
const result = await programUsersHelper.createOrUpdate(req.body, req.userDetails)

static get name() {
return "programUsers";
}
return resolve(result)
} catch (error) {
return reject({
status: HTTP_STATUS_CODE.internal_server_error.status,
message: error.message || 'Internal server error',
})
}
})
}

};
/**
* Get entities from a program user with pagination and search
* @method
* @name getEntities
* @param {Object} req - request object
* @returns {Object} paginated list of entities
*/
async getEntities(req) {
return new Promise(async (resolve, reject) => {
try {
const { userId, programId, programExternalId, status, search = '', entityId = '' } = req.query
const { pageNo = 1, pageSize = 20 } = req

if (!userId || (!programId && !programExternalId)) {
return reject({
status: HTTP_STATUS_CODE.bad_request.status,
message: 'userId and either programId or programExternalId are required',
})
}
// Call helper
const result = await programUsersHelper.getEntitiesWithPagination(
userId,
programId,
programExternalId,
parseInt(pageNo),
parseInt(pageSize),
status,
search,
entityId,
req.userDetails
)
return resolve(result)
} catch (error) {
return reject({
status: HTTP_STATUS_CODE.internal_server_error.status,
message: error.message || 'Internal server error',
})
}
})
}
}
Loading