hs-office-coopshares: add non-negative validation
This commit is contained in:
@@ -26,7 +26,6 @@ import static net.hostsharing.hsadminng.hs.office.generated.api.v1.model.HsOffic
|
||||
import static net.hostsharing.hsadminng.hs.office.generated.api.v1.model.HsOfficeCoopSharesTransactionTypeResource.SUBSCRIPTION;
|
||||
|
||||
@RestController
|
||||
|
||||
public class HsOfficeCoopSharesTransactionController implements HsOfficeCoopSharesApi {
|
||||
|
||||
@Autowired
|
||||
@@ -71,7 +70,7 @@ public class HsOfficeCoopSharesTransactionController implements HsOfficeCoopShar
|
||||
|
||||
final var uri =
|
||||
MvcUriComponentsBuilder.fromController(getClass())
|
||||
.path("/api/hs/office/CoopSharesTransactions/{id}")
|
||||
.path("/api/hs/office/coopsharestransactions/{id}")
|
||||
.buildAndExpand(entityToSave.getUuid())
|
||||
.toUri();
|
||||
final var mapped = map(saved, HsOfficeCoopSharesTransactionResource.class);
|
||||
@@ -82,7 +81,7 @@ public class HsOfficeCoopSharesTransactionController implements HsOfficeCoopShar
|
||||
final var violations = new ArrayList<String>();
|
||||
validateSubscriptionTransaction(requestBody, violations);
|
||||
validateCancellationTransaction(requestBody, violations);
|
||||
validateSharesCount(requestBody, violations);
|
||||
validateshareCount(requestBody, violations);
|
||||
if (violations.size() > 0) {
|
||||
throw new ValidationException("[" + join(", ", violations) + "]");
|
||||
}
|
||||
@@ -92,9 +91,9 @@ public class HsOfficeCoopSharesTransactionController implements HsOfficeCoopShar
|
||||
final HsOfficeCoopSharesTransactionInsertResource requestBody,
|
||||
final ArrayList<String> violations) {
|
||||
if (requestBody.getTransactionType() == SUBSCRIPTION
|
||||
&& requestBody.getSharesCount() < 0) {
|
||||
violations.add("for %s, sharesCount must be positive but is \"%d\"".formatted(
|
||||
requestBody.getTransactionType(), requestBody.getSharesCount()));
|
||||
&& requestBody.getShareCount() < 0) {
|
||||
violations.add("for %s, shareCount must be positive but is \"%d\"".formatted(
|
||||
requestBody.getTransactionType(), requestBody.getShareCount()));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -102,18 +101,18 @@ public class HsOfficeCoopSharesTransactionController implements HsOfficeCoopShar
|
||||
final HsOfficeCoopSharesTransactionInsertResource requestBody,
|
||||
final ArrayList<String> violations) {
|
||||
if (requestBody.getTransactionType() == CANCELLATION
|
||||
&& requestBody.getSharesCount() > 0) {
|
||||
violations.add("for %s, sharesCount must be negative but is \"%d\"".formatted(
|
||||
requestBody.getTransactionType(), requestBody.getSharesCount()));
|
||||
&& requestBody.getShareCount() > 0) {
|
||||
violations.add("for %s, shareCount must be negative but is \"%d\"".formatted(
|
||||
requestBody.getTransactionType(), requestBody.getShareCount()));
|
||||
}
|
||||
}
|
||||
|
||||
private static void validateSharesCount(
|
||||
private static void validateshareCount(
|
||||
final HsOfficeCoopSharesTransactionInsertResource requestBody,
|
||||
final ArrayList<String> violations) {
|
||||
if (requestBody.getSharesCount() == 0) {
|
||||
violations.add("sharesCount must not be 0 but is \"%d\"".formatted(
|
||||
requestBody.getSharesCount()));
|
||||
if (requestBody.getShareCount() == 0) {
|
||||
violations.add("shareCount must not be 0 but is \"%d\"".formatted(
|
||||
requestBody.getShareCount()));
|
||||
}
|
||||
}
|
||||
|
||||
|
@@ -18,7 +18,7 @@ components:
|
||||
format: uuid
|
||||
transactionType:
|
||||
$ref: '#/components/schemas/HsOfficeCoopSharesTransactionType'
|
||||
sharesCount:
|
||||
shareCount:
|
||||
type: integer
|
||||
valueDate:
|
||||
type: string
|
||||
@@ -37,7 +37,7 @@ components:
|
||||
nullable: false
|
||||
transactionType:
|
||||
$ref: '#/components/schemas/HsOfficeCoopSharesTransactionType'
|
||||
sharesCount:
|
||||
shareCount:
|
||||
type: integer
|
||||
valueDate:
|
||||
type: string
|
||||
@@ -51,7 +51,7 @@ components:
|
||||
required:
|
||||
- membershipUuid
|
||||
- transactionType
|
||||
- sharesCount
|
||||
- shareCount
|
||||
- valueDate
|
||||
- reference
|
||||
additionalProperties: false
|
||||
|
@@ -20,6 +20,33 @@ create table if not exists hs_office_coopsharestransaction
|
||||
);
|
||||
--//
|
||||
|
||||
-- ============================================================================
|
||||
--changeset hs-office-coopshares-SHARE-COUNT-CONSTRAINT:1 endDelimiter:--//
|
||||
-- ----------------------------------------------------------------------------
|
||||
|
||||
create or replace function checkSharesByMembershipUuid(forMembershipUuid UUID, newShareCount integer)
|
||||
returns boolean
|
||||
language plpgsql as $$
|
||||
declare
|
||||
currentShareCount integer;
|
||||
totalShareCount integer;
|
||||
begin
|
||||
select sum(cst.shareCount)
|
||||
from hs_office_coopsharestransaction cst
|
||||
where cst.membershipUuid = forMembershipUuid
|
||||
into currentShareCount;
|
||||
totalShareCount := currentShareCount + newShareCount;
|
||||
if totalShareCount < 0 then
|
||||
raise exception '[400] coop shares transaction would result in a negative number of shares';
|
||||
end if;
|
||||
return true;
|
||||
end; $$;
|
||||
|
||||
alter table hs_office_coopsharestransaction
|
||||
add constraint hs_office_coopshares_positive
|
||||
check ( checkSharesByMembershipUuid(membershipUuid, shareCount) );
|
||||
|
||||
--//
|
||||
|
||||
-- ============================================================================
|
||||
--changeset hs-office-coopshares-MAIN-TABLE-JOURNAL:1 endDelimiter:--//
|
||||
|
Reference in New Issue
Block a user