#46: BankAccount.kt

plugins/org.projectforge.plugins.banking/src/main/kotlin/org/projectforge/plugins/banking/BankAccount.kt

Path: ./plugins/.../BankAccount.kt · Type: Kotlin REST DTO · Lines: 65 · Source: GitHub

65 lines · 36 code · 24 comments · 5 blank

What it does

A REST Data Transfer Object for bank accounts — bridges between the BankAccountDO entity (#48) and the REST API JSON format. Extends BaseDTO<BankAccountDO> which auto-maps simple fields (name, iban, bic, etc.) between DO and DTO. Manual conversion handles the 6 access lists that are stored as CSV integers in the database but exposed as structured JSON arrays in the API.

API JSON Database (DO) "fullAccessGroups": [ fullAccessGroupIds = "12,45,78" {"id": 12, "name": "Finance"}, {"id": 45, "name": "Admins"} ] copyFrom() ▼ copyTo() ▲ "fullAccessUsers": [ fullAccessUserIds = "3,7" {"id": 3, "name": "Alice"}, {"id": 7, "name": "Bob"} ]

6 access lists

Access levelGroups fieldUsers fieldStored as
Full accessfullAccessGroupsfullAccessUsersfullAccessGroupIds / fullAccessUserIds
Read-onlyreadonlyAccessGroupsreadonlyAccessUsersreadonlyAccessGroupIds / readonlyAccessUserIds
MinimalminimalAccessGroupsminimalAccessUsersminimalAccessGroupIds / minimalAccessUserIds

Conversion flow

// API response: DO → DTO
45 override fun copyFrom(src: BankAccountDO) {
46   super.copyFrom(src)                    ← auto-copies: name, iban, bic, etc.
47   fullAccessGroups = Group.toGroupList(src.fullAccessGroupIds)  ← "12,45,78" → [Group, Group]
49   readonlyAccessGroups = Group.toGroupList(src.readonlyAccessGroupIds)
50   ...
53 }

// API request: DTO → DO
56 override fun copyTo(dest: BankAccountDO) {
57   super.copyTo(dest)
58   dest.fullAccessGroupIds = Group.toLongList(fullAccessGroups)  ← [Group, Group] → "12,45,78"
60   ...
64 }

Physical vs logical package

File is at plugins/.../banking/BankAccount.kt but declares package org.projectforge.rest.dto — the DTO lives with the plugin source but belongs to the REST DTO package. This pattern keeps DTOs co-located with their plugin modules while sharing a namespace with all other DTOs for consistency in API serialization.