1
0

hs-office-coopshares: add non-negative validation

This commit is contained in:
Michael Hoennig
2022-10-20 14:08:19 +02:00
parent 22bca20c49
commit dc0835fa25
6 changed files with 95 additions and 33 deletions

View File

@@ -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()));
}
}

View File

@@ -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

View File

@@ -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:--//