Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
94 commits
Select commit Hold shift + click to select a range
7a05317
feat(asset-service): add tokenized RWA marketplace backend and admin …
guymoyo Feb 8, 2026
c8bbe31
refactor(asset-service): replace order book with single-price model
guymoyo Feb 9, 2026
2acbf23
refactor(asset-service): remove annualYield and auto-derive treasury …
guymoyo Feb 9, 2026
4b6f728
docs(asset-service): fix fee examples and add glossary to accounting …
guymoyo Feb 9, 2026
e5f94cd
fix(asset-service): route trading fees to separate fee collection acc…
guymoyo Feb 9, 2026
df3319d
docs(asset-service): fix sell totalAmount in customer API guide
guymoyo Feb 9, 2026
eee4fc4
feat(asset-service): add mint supply, instant price history, and cleanup
guymoyo Feb 9, 2026
0082431
feat(asset-service): simplify trade API with JWT auth, auto-accounts,…
guymoyo Feb 9, 2026
92b46a4
refactor(asset-service): merge holdings into positions, remove Holdin…
guymoyo Feb 9, 2026
70471e7
refactor(asset-service): atomic Fineract provisioning via Batch API +…
guymoyo Feb 9, 2026
ba0c8ee
fix(asset-service): security, data integrity, and validation hardening
guymoyo Feb 9, 2026
ff1293a
feat(asset-manager-app): add error handling, form validation, and que…
guymoyo Feb 9, 2026
6a766b2
fix(asset-service): trading safety, balance checks, tests, frontend h…
guymoyo Feb 9, 2026
d519c45
fix(asset-service): auth, security, robustness, and observability har…
guymoyo Feb 9, 2026
def3a50
fix(asset-service): transaction ordering, validation, and defense-in-…
guymoyo Feb 9, 2026
23eb186
feat(asset-service): comprehensive hardening — resilience, tests, UX,…
guymoyo Feb 9, 2026
8955194
fix(asset-service): security and resilience hardening
guymoyo Feb 9, 2026
a9052b9
fix(asset-service): pagination stability, dialog a11y, cache invalida…
guymoyo Feb 9, 2026
3f9ffc8
fix(payment-gateway): comprehensive security and resilience hardening
guymoyo Feb 9, 2026
683f59c
fix(asset-service): consolidate migrations, fix test imports, add tra…
guymoyo Feb 10, 2026
3b7df71
feat(asset-manager): add dev security toggle, edit/mint dialogs, prom…
guymoyo Feb 10, 2026
a5ec935
fix(asset-manager): add missing sidebar translations and welcome name…
guymoyo Feb 10, 2026
aa53d94
fix(auth): unified logout redirect to portal home via gateway chain
guymoyo Feb 10, 2026
666ac25
feat(account-manager): add client type selection (person/entity) to c…
guymoyo Feb 11, 2026
88a15a6
feat(asset-service): configurable spread with dedicated revenue tracking
guymoyo Feb 11, 2026
8fec0d9
test(payment-gateway): add comprehensive unit and integration tests (…
guymoyo Feb 11, 2026
04cb397
fix(asset-service): patch idempotency key escalation and stale order …
guymoyo Feb 11, 2026
b092808
fix(customer-registration): comprehensive security hardening and reme…
guymoyo Feb 11, 2026
445f69e
fix(payment-gateway): security and logic hardening across 6 phases
guymoyo Feb 11, 2026
245cfcb
feat(asset-service): add bond/fixed-income instrument support
guymoyo Feb 11, 2026
f30b661
test(asset-service): add Cucumber BDD tests with OpenAPI contract val…
guymoyo Feb 12, 2026
f01d947
Merge pull request #178 from ADORSYS-GIS/self-service
nancymuyeh Feb 12, 2026
0e7d548
Merge branch 'self-service' into feature/asset-service
NkwaTambe Feb 12, 2026
b522e2b
refactor(asset-service): extract hardcoded XAF currency into configur…
guymoyo Feb 13, 2026
e62ed7f
feat(asset-service): add bond benefit projections to trade preview an…
guymoyo Feb 13, 2026
2875dd7
feat(asset-service): add scheduled archival for trade_log and orders …
guymoyo Feb 13, 2026
0501868
feat(asset-service): add admin order resolution with MANUALLY_CLOSED …
guymoyo Feb 13, 2026
a1b59f5
fix: correct WAT timezone from Africa/Lagos to Africa/Douala across s…
guymoyo Feb 13, 2026
ec78ac6
docs(asset-service): update all guides for bonds, archival, scheduler…
guymoyo Feb 13, 2026
cf8b16c
fix: distorted translation keys
Elwizzy12 Feb 13, 2026
187354d
Merge branch 'feature/asset-service' of github.com:ADORSYS-GIS/finera…
Elwizzy12 Feb 13, 2026
a63d878
fix: distorted translation keys
Elwizzy12 Feb 13, 2026
61a4e2a
fix: fix issues related to asset management
Elwizzy12 Feb 13, 2026
93c9eaf
feat(ci): add workflow to buld and push images of new services
nancymuyeh Feb 13, 2026
bf4c28a
feat(ci): test ci on current branch
nancymuyeh Feb 13, 2026
e549bc1
feat(ci): test ci on current branch
nancymuyeh Feb 16, 2026
6c54aec
feat(ci): test ci on current branch
nancymuyeh Feb 16, 2026
90235c9
feat(payment): update mtnmomoclient
nancymuyeh Feb 17, 2026
81c26d9
Merge remote-tracking branch 'origin' into feature/asset-service
nancymuyeh Feb 17, 2026
db85bc6
feat(ci): re-enable safebranch sanitization for image tags
nancymuyeh Feb 17, 2026
fa61365
Merge branch 'self-service' into feature/asset-service
nancymuyeh Feb 17, 2026
c9b5369
fix(asset-service): unify asset category constants across frontend
guymoyo Feb 17, 2026
4e19d95
fix(asset-service): remove redundant currencyCode field from create-a…
guymoyo Feb 17, 2026
1d6ee46
feat(asset-service): add best-effort rollback for Fineract resources …
guymoyo Feb 17, 2026
ff0fcd9
feat(asset-service): resolve GL accounts at startup and add currency …
guymoyo Feb 17, 2026
12720ce
fix(asset-service): fix savings lookup, currency registration, and JW…
guymoyo Feb 17, 2026
63cf42f
feat(asset-service): add validityDate validation and form field helpe…
guymoyo Feb 17, 2026
18a508d
feat(asset-service): post trading fees to GL income account via journ…
guymoyo Feb 17, 2026
1192c5a
fix(asset-manager): switch auth mode from basic to oauth
guymoyo Feb 17, 2026
060c137
feat(asset-service): add coupon forecast, balance check, and manual t…
guymoyo Feb 17, 2026
17266ec
feat(asset-manager): add descriptions to coupon forecast card fields
guymoyo Feb 17, 2026
66be4d9
refactor(asset-manager): remove OHLC and manual price override from a…
guymoyo Feb 17, 2026
2440100
fix(asset-service): allocate treasury balance proportionally in coupo…
guymoyo Feb 17, 2026
6b2fcc3
feat(asset-service): create dedicated XAF treasury account per asset
guymoyo Feb 17, 2026
bea94d6
feat(asset-service): add subscription period and capital opened perce…
guymoyo Feb 18, 2026
3fe42e4
feat(asset-service): add Fineract entity names to asset detail and re…
guymoyo Feb 18, 2026
03e6311
fix(asset-manager): redirect to login on CORS-blocked auth redirects
guymoyo Feb 19, 2026
b4a42b4
feat(asset-service): add public recent trades endpoint for an asset
guymoyo Feb 19, 2026
f9c5e2c
feat(asset-service): add portfolio allocation, yield, and history API
guymoyo Feb 19, 2026
7ce4abc
docs(asset-service): document recent trades, portfolio history, coupo…
guymoyo Feb 19, 2026
5585168
feat(asset-service): add bond principal redemption at maturity
guymoyo Feb 19, 2026
6ae2978
fix(payment-gateway): address 15 security and reliability issues from…
guymoyo Feb 19, 2026
8d77cf5
feat(e2e-tests): add end-to-end BDD test suite with real Fineract int…
guymoyo Feb 19, 2026
e203143
fix(asset-service): fix 4 critical trading issues from code review
guymoyo Feb 19, 2026
e31e54e
fix(asset-service): configurable local lock timeout + store Fineract …
guymoyo Feb 19, 2026
b084d07
fix(asset-service, e2e-tests): resolve all E2E test failures (18/18 p…
guymoyo Feb 19, 2026
c0ce670
fix(payment-gateway): address 6 security and reliability issues from …
guymoyo Feb 19, 2026
3e146ab
fix(asset-service): copy exec-classified JAR in Dockerfile
guymoyo Feb 19, 2026
7faffef
feat(e2e-tests): expand E2E coverage to 57 scenarios across asset and…
guymoyo Feb 19, 2026
3ebd5cf
fix(asset-service): rename PricePointDto field to match frontend cont…
guymoyo Feb 20, 2026
24e5363
fix(asset-service): skip duplicate price history snapshots
guymoyo Feb 20, 2026
8a221c6
fix(asset-manager): show utilization with 2 decimals and add TVL tooltip
guymoyo Feb 20, 2026
e7a7154
feat(asset-service): add trading enhancements and admin tools
guymoyo Feb 21, 2026
d4bca6a
feat(asset-service): add admin dashboard, audit log, and income calendar
guymoyo Feb 21, 2026
b363fb8
feat(asset-service): add non-bond income parity, exposure limits, and…
guymoyo Feb 21, 2026
eb1c54a
fix(asset-manager): register audit-log and income-calendar routes and…
guymoyo Feb 21, 2026
18a036f
feat(asset-service): add Flyway migration V14 for audit_log table
guymoyo Feb 21, 2026
6f27ddb
test(asset-service): add tests for admin dashboard, audit log, and in…
guymoyo Feb 21, 2026
ec01816
fix(asset-manager): reorder coupon cards so forecast appears before p…
guymoyo Feb 21, 2026
efe07e8
feat(asset-service): add order filtering, detail view, reconciliation…
guymoyo Feb 21, 2026
3d15be0
fix(e2e-tests): resolve all 4 remaining E2E test failures (75/75 pass…
guymoyo Feb 21, 2026
acdbd82
feat(frontend): add asset owner label, Fineract deep links, and trans…
guymoyo Feb 21, 2026
3ee6c87
docs(asset-service): add reconciliation manual correction procedures
guymoyo Feb 21, 2026
1648cdd
docs(asset-service): add comprehensive feature reference catalog
guymoyo Feb 22, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
42 changes: 42 additions & 0 deletions .github/workflows/build-backend.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
name: Build Backend

on:
push:
branches:
- main
- develop
paths:
- "backend/**"
- ".github/workflows/build-backend.yml"
pull_request:
branches:
- main
- develop
paths:
- "backend/**"
- ".github/workflows/build-backend.yml"

jobs:
build:
name: Build Backend Services
runs-on: ubuntu-latest

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

- name: Set up JDK 17
uses: actions/setup-java@v4
with:
java-version: "17"
distribution: "temurin"
cache: "maven"

- name: Build asset-service
run: mvn -B package --file backend/asset-service/pom.xml

- name: Build customer-registration-service
run: mvn -B package --file backend/customer-registration-service/pom.xml

- name: Build payment-gateway-service
run: mvn -B package --file backend/payment-gateway-service/pom.xml
172 changes: 172 additions & 0 deletions .github/workflows/publish-backend-images.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,172 @@
name: Publish Backend Docker Images

on:
push:
branches:
- develop
- main
paths:
- 'backend/**'
- '.github/workflows/publish-backend-images.yml'
workflow_dispatch:
inputs:
services:
description: 'Services to build (comma-separated: asset-service,customer-registration-service,payment-gateway-service or "all")'
required: false
default: 'all'

permissions:
contents: read
packages: write

env:
REGISTRY: ghcr.io

jobs:
determine-services:
name: Determine Services to Build
runs-on: ubuntu-latest
outputs:
services: ${{ steps.set-services.outputs.services }}

steps:
- name: Set services matrix
id: set-services
run: |
if [ "${{ github.event.inputs.services }}" == "all" ] || [ "${{ github.event.inputs.services }}" == "" ]; then
echo 'services=["asset-service","customer-registration-service","payment-gateway-service"]' >> $GITHUB_OUTPUT
else
SERVICES=$(echo "${{ github.event.inputs.services }}" | jq -R 'split(",") | map(. | gsub(" "; ""))')
echo "services=$SERVICES" >> $GITHUB_OUTPUT
fi

build-and-push:
name: Build and Push ${{ matrix.service }}
runs-on: ubuntu-latest
needs: determine-services

strategy:
matrix:
service: ${{ fromJson(needs.determine-services.outputs.services) }}
fail-fast: false

steps:
- name: Checkout code
uses: actions/checkout@v4
with:
fetch-depth: 0

- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v3

- name: Log in to GitHub Container Registry
uses: docker/login-action@v3
with:
registry: ${{ env.REGISTRY }}
username: ${{ github.actor }}
password: ${{ secrets.GITHUB_TOKEN }}

- name: Extract metadata
id: meta
run: |
# Extract branch name
BRANCH=${GITHUB_HEAD_REF:-${GITHUB_REF#refs/heads/}}
echo "branch=$BRANCH" >> $GITHUB_OUTPUT

# Extract git hashes
SHORT_SHA=$(git rev-parse --short HEAD)
LONG_SHA=$(git rev-parse HEAD)
echo "short_sha=$SHORT_SHA" >> $GITHUB_OUTPUT
echo "long_sha=$LONG_SHA" >> $GITHUB_OUTPUT

# Determine image tags
if [ "$BRANCH" == "develop" ]; then
TAGS="develop,$SHORT_SHA,$LONG_SHA"
elif [ "$BRANCH" == "main" ]; then
TAGS="main,$SHORT_SHA,$LONG_SHA"
else
SAFE_BRANCH=$(echo "$BRANCH" | sed 's/[^a-zA-Z0-9._-]/-/g')
TAGS="$SAFE_BRANCH,$SHORT_SHA"
fi

echo "tags=$TAGS" >> $GITHUB_OUTPUT
echo "Image tags: $TAGS"

- name: Determine Context Directory
id: context
run: |
SERVICE="${{ matrix.service }}"
DIR="backend/$SERVICE"
echo "dir=$DIR" >> $GITHUB_OUTPUT
echo "Building context: $DIR"

- name: Build and push ${{ matrix.service }} image
uses: docker/build-push-action@v5
with:
context: ${{ steps.context.outputs.dir }}
file: ${{ steps.context.outputs.dir }}/Dockerfile
push: true
tags: |
${{ env.REGISTRY }}/adorsys-gis/fineract-apps/${{ matrix.service }}:${{ steps.meta.outputs.short_sha }}
${{ env.REGISTRY }}/adorsys-gis/fineract-apps/${{ matrix.service }}:${{ steps.meta.outputs.branch }}
labels: |
org.opencontainers.image.source=${{ github.server_url }}/${{ github.repository }}
org.opencontainers.image.revision=${{ steps.meta.outputs.long_sha }}
org.opencontainers.image.created=${{ github.event.repository.updated_at }}
cache-from: type=gha
cache-to: type=gha,mode=max

- name: Generate build summary
run: |
echo "### ${{ matrix.service }} Image Built Successfully! 🎉" >> $GITHUB_STEP_SUMMARY
echo "" >> $GITHUB_STEP_SUMMARY
echo "**Registry**: \`${{ env.REGISTRY }}\`" >> $GITHUB_STEP_SUMMARY
echo "**Repository**: \`adorsys-gis/fineract-apps/${{ matrix.service }}\`" >> $GITHUB_STEP_SUMMARY
echo "**Tags**: \`${{ steps.meta.outputs.tags }}\`" >> $GITHUB_STEP_SUMMARY
echo "" >> $GITHUB_STEP_SUMMARY
echo "**Pull Command**:" >> $GITHUB_STEP_SUMMARY
echo "\`\`\`bash" >> $GITHUB_STEP_SUMMARY
echo "docker pull ${{ env.REGISTRY }}/adorsys-gis/fineract-apps/${{ matrix.service }}:${{ steps.meta.outputs.short_sha }}" >> $GITHUB_STEP_SUMMARY
echo "\`\`\`" >> $GITHUB_STEP_SUMMARY

trigger-gitops-update:
name: Trigger GitOps Update
needs: build-and-push
if: github.ref == 'refs/heads/develop' || github.ref == 'refs/heads/main'
runs-on: ubuntu-latest

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

- name: Extract metadata
id: meta
run: |
BRANCH=${GITHUB_HEAD_REF:-${GITHUB_REF#refs/heads/}}
SHORT_SHA=$(git rev-parse --short HEAD)
echo "branch=$BRANCH" >> $GITHUB_OUTPUT
echo "short_sha=$SHORT_SHA" >> $GITHUB_OUTPUT

- name: Trigger GitOps repo update
env:
GH_TOKEN: ${{ secrets.GITOPS_PAT }}
run: |
BRANCH="${{ steps.meta.outputs.branch }}"
TAG="${{ steps.meta.outputs.short_sha }}"

# Trigger update for all backend services
gh api \
--method POST \
-H "Accept: application/vnd.github+json" \
/repos/adorsys-gis/fineract-gitops/dispatches \
-f event_type='update-backend-images' \
-f client_payload[tag]="$TAG" \
-f client_payload[branch]="$BRANCH" \
-f client_payload[services]='["asset-service","customer-registration-service","payment-gateway-service" ]'

echo "### GitOps Update Triggered" >> $GITHUB_STEP_SUMMARY
echo "" >> $GITHUB_STEP_SUMMARY
echo "**Tag**: \`$TAG\`" >> $GITHUB_STEP_SUMMARY
echo "**Branch**: \`$BRANCH\`" >> $GITHUB_STEP_SUMMARY
echo "" >> $GITHUB_STEP_SUMMARY
echo "A PR will be created in the fineract-gitops repository to update image tags." >> $GITHUB_STEP_SUMMARY
4 changes: 2 additions & 2 deletions .github/workflows/publish-frontend-images.yml
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,7 @@ jobs:
id: set-apps
run: |
if [ "${{ github.event.inputs.apps }}" == "all" ] || [ "${{ github.event.inputs.apps }}" == "" ]; then
echo 'apps=["admin","account-manager","branch-manager","cashier","reporting","accounting"]' >> $GITHUB_OUTPUT
echo 'apps=["admin","account-manager","branch-manager","cashier","reporting","accounting","asset-manager","self-service"]' >> $GITHUB_OUTPUT
else
APPS=$(echo "${{ github.event.inputs.apps }}" | jq -R 'split(",") | map(. | gsub(" "; ""))')
echo "apps=$APPS" >> $GITHUB_OUTPUT
Expand Down Expand Up @@ -156,7 +156,7 @@ jobs:
-f event_type='update-frontend-images' \
-f client_payload[tag]="$TAG" \
-f client_payload[branch]="$BRANCH" \
-f client_payload[apps]='["admin","account-manager","branch-manager","cashier","reporting","accounting"]'
-f client_payload[apps]='["admin","account-manager","branch-manager","cashier","reporting","accounting","asset-manager","self-service"]'

echo "### GitOps Update Triggered" >> $GITHUB_STEP_SUMMARY
echo "" >> $GITHUB_STEP_SUMMARY
Expand Down
11 changes: 10 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,12 @@ node_modules
dist
tsconfig.tsbuildinfo
.idea

# Eclipse / Spring Tool Suite
.classpath
.project
.factorypath
.settings/
coverage
# TanStack Router
.tanstack/
Expand All @@ -22,4 +28,7 @@ user-sync-service/.env.local
# Java build artifacts
**/target/
*.class
*.jar
*.jar

# Spec files
backend/asset-service/spec.md
3 changes: 3 additions & 0 deletions Dockerfile.account-manager
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,9 @@ COPY frontend/account-manager-app/ ./frontend/account-manager-app/
RUN corepack enable pnpm && \
pnpm install --frozen-lockfile

# Build UI package TypeScript declarations (required by project references)
RUN cd packages/ui && npx tsc --build

# Build the account manager app
RUN pnpm --filter account-manager-app build

Expand Down
13 changes: 13 additions & 0 deletions Dockerfile.asset-manager
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
FROM node:22-alpine AS builder
RUN corepack enable && corepack prepare pnpm@latest --activate
WORKDIR /app
COPY pnpm-lock.yaml pnpm-workspace.yaml package.json ./
COPY packages/ packages/
COPY frontend/asset-manager-app/ frontend/asset-manager-app/
RUN pnpm install --frozen-lockfile
RUN pnpm --filter asset-manager-app build

FROM nginx:alpine
COPY --from=builder /app/frontend/asset-manager-app/dist /usr/share/nginx/html
COPY frontend/asset-manager-app/nginx.conf /etc/nginx/conf.d/default.conf
EXPOSE 80
3 changes: 3 additions & 0 deletions Dockerfile.branch-manager
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,9 @@ COPY frontend/branchmanager-app/ ./frontend/branchmanager-app/
RUN corepack enable pnpm && \
pnpm install --frozen-lockfile

# Build UI package TypeScript declarations (required by project references)
RUN cd packages/ui && npx tsc --build

# Build the branch manager app
RUN pnpm --filter branchmanager-app build

Expand Down
3 changes: 3 additions & 0 deletions Dockerfile.cashier
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,9 @@ COPY frontend/cashier-app/ ./frontend/cashier-app/
RUN corepack enable pnpm && \
pnpm install --frozen-lockfile

# Build UI package TypeScript declarations (required by project references)
RUN cd packages/ui && npx tsc --build

# Build the cashier app
RUN pnpm --filter cashier-app build

Expand Down
21 changes: 21 additions & 0 deletions backend/asset-service/Dockerfile
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
# Build stage
FROM maven:3.9-eclipse-temurin-21-alpine AS builder
WORKDIR /app
COPY pom.xml .
RUN mvn dependency:go-offline -B
COPY lombok.config .
COPY src src
RUN mvn package -DskipTests -B

# Runtime stage
FROM eclipse-temurin:21-jre-alpine
WORKDIR /app
RUN addgroup -g 1001 -S appgroup && adduser -u 1001 -S appuser -G appgroup
COPY --from=builder /app/target/*-exec.jar app.jar
RUN chown -R appuser:appgroup /app
USER appuser
HEALTHCHECK --interval=30s --timeout=3s --start-period=60s --retries=3 \
CMD wget --quiet --tries=1 --spider http://localhost:8083/actuator/health || exit 1
EXPOSE 8083
ENV JAVA_OPTS="-XX:+UseContainerSupport -XX:MaxRAMPercentage=75.0 -Djava.security.egd=file:/dev/./urandom"
ENTRYPOINT ["sh", "-c", "java $JAVA_OPTS -jar app.jar"]
Loading
Loading