diff options
author | Ola Aunronning <olaa@yahooinc.com> | 2023-10-24 14:14:44 +0200 |
---|---|---|
committer | Ola Aunronning <olaa@yahooinc.com> | 2023-10-24 14:14:44 +0200 |
commit | 1e92bd3eaac015e2794298e392a69bb8b218a57b (patch) | |
tree | e35c907b06cc4f8ee32fd97a0815a3785a19fd39 | |
parent | 900209e698fc4921103c505ed357eb368059e1a4 (diff) |
Wrap attributes in StringWrapper
7 files changed, 89 insertions, 36 deletions
diff --git a/controller-api/src/main/java/com/yahoo/vespa/hosted/controller/tenant/Email.java b/controller-api/src/main/java/com/yahoo/vespa/hosted/controller/tenant/Email.java index c1c8a780df1..702a183e7af 100644 --- a/controller-api/src/main/java/com/yahoo/vespa/hosted/controller/tenant/Email.java +++ b/controller-api/src/main/java/com/yahoo/vespa/hosted/controller/tenant/Email.java @@ -36,6 +36,10 @@ public class Email { return new Email(emailAddress, isVerified); } + public boolean isBlank() { + return emailAddress.isBlank(); + } + @Override public boolean equals(Object o) { if (this == o) return true; diff --git a/controller-api/src/main/java/com/yahoo/vespa/hosted/controller/tenant/PurchaseOrder.java b/controller-api/src/main/java/com/yahoo/vespa/hosted/controller/tenant/PurchaseOrder.java new file mode 100644 index 00000000000..d222864a388 --- /dev/null +++ b/controller-api/src/main/java/com/yahoo/vespa/hosted/controller/tenant/PurchaseOrder.java @@ -0,0 +1,21 @@ +// Copyright Vespa.ai. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. +package com.yahoo.vespa.hosted.controller.tenant; + +import ai.vespa.validation.StringWrapper; + +import static ai.vespa.validation.Validation.requireLength; + +/** + * @author olaa + */ +public class PurchaseOrder extends StringWrapper<PurchaseOrder> { + + public PurchaseOrder(String value) { + super(value); + requireLength(value, "purchase order length", 0, 64); + } + + public static PurchaseOrder empty() { + return new PurchaseOrder(""); + } +} diff --git a/controller-api/src/main/java/com/yahoo/vespa/hosted/controller/tenant/TaxCode.java b/controller-api/src/main/java/com/yahoo/vespa/hosted/controller/tenant/TaxCode.java new file mode 100644 index 00000000000..39176d2428d --- /dev/null +++ b/controller-api/src/main/java/com/yahoo/vespa/hosted/controller/tenant/TaxCode.java @@ -0,0 +1,21 @@ +// Copyright Vespa.ai. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. +package com.yahoo.vespa.hosted.controller.tenant; + +import ai.vespa.validation.StringWrapper; + +import static ai.vespa.validation.Validation.requireLength; + +/** + * @author olaa + */ +public class TaxCode extends StringWrapper<TaxCode> { + + public TaxCode(String value) { + super(value); + requireLength(value, "tax code length", 0, 64); + } + + public static TaxCode empty() { + return new TaxCode(""); + } +} diff --git a/controller-api/src/main/java/com/yahoo/vespa/hosted/controller/tenant/TenantBilling.java b/controller-api/src/main/java/com/yahoo/vespa/hosted/controller/tenant/TenantBilling.java index 1f8e59d7993..ee23ae31183 100644 --- a/controller-api/src/main/java/com/yahoo/vespa/hosted/controller/tenant/TenantBilling.java +++ b/controller-api/src/main/java/com/yahoo/vespa/hosted/controller/tenant/TenantBilling.java @@ -10,11 +10,11 @@ public class TenantBilling { private final TenantContact contact; private final TenantAddress address; - private final String taxCode; - private final String purchaseOrder; - private final String invoiceEmail; + private final TaxCode taxCode; + private final PurchaseOrder purchaseOrder; + private final Email invoiceEmail; - public TenantBilling(TenantContact contact, TenantAddress address, String taxCode, String purchaseOrder, String invoiceEmail) { + public TenantBilling(TenantContact contact, TenantAddress address, TaxCode taxCode, PurchaseOrder purchaseOrder, Email invoiceEmail) { this.contact = Objects.requireNonNull(contact); this.address = Objects.requireNonNull(address); this.taxCode = Objects.requireNonNull(taxCode); @@ -23,7 +23,7 @@ public class TenantBilling { } public static TenantBilling empty() { - return new TenantBilling(TenantContact.empty(), TenantAddress.empty(), "", "", ""); + return new TenantBilling(TenantContact.empty(), TenantAddress.empty(), TaxCode.empty(), PurchaseOrder.empty(), Email.empty()); } public TenantContact contact() { @@ -34,15 +34,15 @@ public class TenantBilling { return address; } - public String getTaxCode() { + public TaxCode getTaxCode() { return taxCode; } - public String getPurchaseOrder() { + public PurchaseOrder getPurchaseOrder() { return purchaseOrder; } - public String getInvoiceEmail() { + public Email getInvoiceEmail() { return invoiceEmail; } @@ -54,15 +54,15 @@ public class TenantBilling { return new TenantBilling(this.contact, updatedAddress, this.taxCode, this.purchaseOrder, this.invoiceEmail); } - public TenantBilling withTaxCode(String updatedTaxCode) { + public TenantBilling withTaxCode(TaxCode updatedTaxCode) { return new TenantBilling(this.contact, this.address, updatedTaxCode, this.purchaseOrder, this.invoiceEmail); } - public TenantBilling withPurchaseOrder(String updatedPurchaseOrder) { + public TenantBilling withPurchaseOrder(PurchaseOrder updatedPurchaseOrder) { return new TenantBilling(this.contact, this.address, this.taxCode, updatedPurchaseOrder, this.invoiceEmail); } - public TenantBilling withInvoiceEmail(String updatedInvoiceEmail) { + public TenantBilling withInvoiceEmail(Email updatedInvoiceEmail) { return new TenantBilling(this.contact, this.address, this.taxCode, this.purchaseOrder, updatedInvoiceEmail); } diff --git a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/persistence/TenantSerializer.java b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/persistence/TenantSerializer.java index 087e7d54e12..c733ccc0a5e 100644 --- a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/persistence/TenantSerializer.java +++ b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/persistence/TenantSerializer.java @@ -28,6 +28,8 @@ import com.yahoo.vespa.hosted.controller.tenant.CloudTenant; import com.yahoo.vespa.hosted.controller.tenant.DeletedTenant; import com.yahoo.vespa.hosted.controller.tenant.Email; import com.yahoo.vespa.hosted.controller.tenant.LastLoginInfo; +import com.yahoo.vespa.hosted.controller.tenant.PurchaseOrder; +import com.yahoo.vespa.hosted.controller.tenant.TaxCode; import com.yahoo.vespa.hosted.controller.tenant.Tenant; import com.yahoo.vespa.hosted.controller.tenant.TenantAddress; import com.yahoo.vespa.hosted.controller.tenant.TenantBilling; @@ -285,9 +287,9 @@ public class TenantSerializer { } private TenantBilling tenantInfoBillingContactFromSlime(Inspector billingObject) { - var taxCode = billingObject.field(taxCodeField).asString(); - var purchaseOrder = billingObject.field(purchaseOrderField).asString(); - var invoiceEmail = billingObject.field(invoiceEmailField).asString(); + var taxCode = new TaxCode(billingObject.field(taxCodeField).asString()); + var purchaseOrder = new PurchaseOrder(billingObject.field(purchaseOrderField).asString()); + var invoiceEmail = new Email(billingObject.field(invoiceEmailField).asString(), false); return TenantBilling.empty() .withContact(TenantContact.from( @@ -359,9 +361,9 @@ public class TenantSerializer { billingCursor.setString("email", billingContact.contact().email().getEmailAddress()); billingCursor.setBool("emailVerified", billingContact.contact().email().isVerified()); billingCursor.setString("phone", billingContact.contact().phone()); - billingCursor.setString(taxCodeField, billingContact.getTaxCode()); - billingCursor.setString(purchaseOrderField, billingContact.getPurchaseOrder()); - billingCursor.setString(invoiceEmailField, billingContact.getInvoiceEmail()); + billingCursor.setString(taxCodeField, billingContact.getTaxCode().value()); + billingCursor.setString(purchaseOrderField, billingContact.getPurchaseOrder().value()); + billingCursor.setString(invoiceEmailField, billingContact.getInvoiceEmail().getEmailAddress()); toSlime(billingContact.address(), billingCursor); } diff --git a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/restapi/application/ApplicationApiHandler.java b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/restapi/application/ApplicationApiHandler.java index d1d65f85dd3..c108040c7a1 100644 --- a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/restapi/application/ApplicationApiHandler.java +++ b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/restapi/application/ApplicationApiHandler.java @@ -127,6 +127,8 @@ import com.yahoo.vespa.hosted.controller.tenant.DeletedTenant; import com.yahoo.vespa.hosted.controller.tenant.Email; import com.yahoo.vespa.hosted.controller.tenant.LastLoginInfo; import com.yahoo.vespa.hosted.controller.tenant.PendingMailVerification; +import com.yahoo.vespa.hosted.controller.tenant.PurchaseOrder; +import com.yahoo.vespa.hosted.controller.tenant.TaxCode; import com.yahoo.vespa.hosted.controller.tenant.Tenant; import com.yahoo.vespa.hosted.controller.tenant.TenantAddress; import com.yahoo.vespa.hosted.controller.tenant.TenantBilling; @@ -694,9 +696,9 @@ public class ApplicationApiHandler extends AuditLoggingRequestHandler { contact.setString("email", billingContact.contact().email().getEmailAddress()); contact.setBool("emailVerified", billingContact.contact().email().isVerified()); contact.setString("phone", billingContact.contact().phone()); - root.setString("taxCode", billingContact.getTaxCode()); - root.setString("purchaseOrder", billingContact.getPurchaseOrder()); - root.setString("invoiceEmail", billingContact.getInvoiceEmail()); + root.setString("taxCode", billingContact.getTaxCode().value()); + root.setString("purchaseOrder", billingContact.getPurchaseOrder().value()); + root.setString("invoiceEmail", billingContact.getInvoiceEmail().getEmailAddress()); toSlime(billingContact.address(), root); // will create "address" on the parent } @@ -706,14 +708,15 @@ public class ApplicationApiHandler extends AuditLoggingRequestHandler { private SlimeJsonResponse putTenantInfoBilling(CloudTenant cloudTenant, Inspector inspector) { var info = cloudTenant.info(); - var contact = info.billingContact().contact(); - var address = info.billingContact().address(); + var billing = info.billingContact(); + var contact = billing.contact(); + var address = billing.address(); var mergedContact = updateBillingContact(inspector.field("contact"), cloudTenant.name(), contact); - var mergedAddress = updateTenantInfoAddress(inspector.field("address"), info.billingContact().address()); - var mergedTaxCode = getString(inspector.field("taxCode"), info.billingContact().getTaxCode()); - var mergedPurchaseOrder = getString(inspector.field("purchaseOrder"), info.billingContact().getPurchaseOrder()); - var mergedInvoiceEmail = getString(inspector.field("invoiceEmail"), info.billingContact().getInvoiceEmail()); + var mergedAddress = updateTenantInfoAddress(inspector.field("address"), billing.address()); + var mergedTaxCode = optional("taxCode", inspector).map(TaxCode::new).orElse(billing.getTaxCode()); + var mergedPurchaseOrder = optional("purchaseOrder", inspector).map(PurchaseOrder::new).orElse(billing.getPurchaseOrder()); + var mergedInvoiceEmail = optional("invoiceEmail", inspector).map(mail -> new Email(mail, false)).orElse(billing.getInvoiceEmail()); var mergedBilling = info.billingContact() .withContact(mergedContact) @@ -775,7 +778,7 @@ public class ApplicationApiHandler extends AuditLoggingRequestHandler { } if (! mergedInfo.billingContact().getInvoiceEmail().isBlank()) { // TODO: Validate invoice email is set if collection method is INVOICE - if (! mergedInfo.billingContact().getInvoiceEmail().contains("@")) + if (! mergedInfo.billingContact().getInvoiceEmail().getEmailAddress().contains("@")) throw new IllegalArgumentException("'Invoice email' needs to be an email address"); } } @@ -799,9 +802,9 @@ public class ApplicationApiHandler extends AuditLoggingRequestHandler { billingCursor.setString("email", billingContact.contact().email().getEmailAddress()); billingCursor.setBool("emailVerified", billingContact.contact().email().isVerified()); billingCursor.setString("phone", billingContact.contact().phone()); - billingCursor.setString("taxCode", billingContact.getTaxCode()); - billingCursor.setString("purchaseOrder", billingContact.getPurchaseOrder()); - billingCursor.setString("invoiceEmail", billingContact.getInvoiceEmail()); + billingCursor.setString("taxCode", billingContact.getTaxCode().value()); + billingCursor.setString("purchaseOrder", billingContact.getPurchaseOrder().value()); + billingCursor.setString("invoiceEmail", billingContact.getInvoiceEmail().getEmailAddress()); toSlime(billingContact.address(), billingCursor); } @@ -931,9 +934,9 @@ public class ApplicationApiHandler extends AuditLoggingRequestHandler { private TenantBilling updateTenantInfoBillingContact(Inspector insp, TenantName tenantName, TenantBilling oldContact) { if (!insp.valid()) return oldContact; - var taxCode = getString(insp.field("taxCode"), oldContact.getTaxCode()); - var purchaseOrder = getString(insp.field("purchaseOrder"), oldContact.getPurchaseOrder()); - var invoiceEmail = getString(insp.field("purchaseOrder"), oldContact.getInvoiceEmail()); + var taxCode = optional("taxCode", insp).map(TaxCode::new).orElse(oldContact.getTaxCode()); + var purchaseOrder = optional("purchaseOrder", insp).map(PurchaseOrder::new).orElse(oldContact.getPurchaseOrder()); + var invoiceEmail = optional("invoiceEmail", insp).map(mail -> new Email(mail, false)).orElse(oldContact.getInvoiceEmail()); return TenantBilling.empty() .withContact(updateBillingContact(insp, tenantName, oldContact.contact())) .withAddress(updateTenantInfoAddress(insp.field("address"), oldContact.address())) diff --git a/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/persistence/TenantSerializerTest.java b/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/persistence/TenantSerializerTest.java index 31794aad350..bab5aec8cf7 100644 --- a/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/persistence/TenantSerializerTest.java +++ b/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/persistence/TenantSerializerTest.java @@ -24,6 +24,8 @@ import com.yahoo.vespa.hosted.controller.tenant.CloudTenant; import com.yahoo.vespa.hosted.controller.tenant.DeletedTenant; import com.yahoo.vespa.hosted.controller.tenant.Email; import com.yahoo.vespa.hosted.controller.tenant.LastLoginInfo; +import com.yahoo.vespa.hosted.controller.tenant.PurchaseOrder; +import com.yahoo.vespa.hosted.controller.tenant.TaxCode; import com.yahoo.vespa.hosted.controller.tenant.TenantAddress; import com.yahoo.vespa.hosted.controller.tenant.TenantBilling; import com.yahoo.vespa.hosted.controller.tenant.TenantContact; @@ -235,9 +237,9 @@ public class TenantSerializerTest { .withCountry("Sodor") .withAddress("Central Station") .withRegion("Irish Sea")) - .withPurchaseOrder("PO42") - .withTaxCode("1234L") - .withInvoiceEmail("billing@mycomp.any") + .withPurchaseOrder(new PurchaseOrder("PO42")) + .withTaxCode(new TaxCode("1234L")) + .withInvoiceEmail(new Email("billing@mycomp.any", false)) ); Slime slime = new Slime(); |