aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorOla Aunronning <olaa@yahooinc.com>2023-10-24 14:14:44 +0200
committerOla Aunronning <olaa@yahooinc.com>2023-10-24 14:14:44 +0200
commit1e92bd3eaac015e2794298e392a69bb8b218a57b (patch)
treee35c907b06cc4f8ee32fd97a0815a3785a19fd39
parent900209e698fc4921103c505ed357eb368059e1a4 (diff)
Wrap attributes in StringWrapper
-rw-r--r--controller-api/src/main/java/com/yahoo/vespa/hosted/controller/tenant/Email.java4
-rw-r--r--controller-api/src/main/java/com/yahoo/vespa/hosted/controller/tenant/PurchaseOrder.java21
-rw-r--r--controller-api/src/main/java/com/yahoo/vespa/hosted/controller/tenant/TaxCode.java21
-rw-r--r--controller-api/src/main/java/com/yahoo/vespa/hosted/controller/tenant/TenantBilling.java22
-rw-r--r--controller-server/src/main/java/com/yahoo/vespa/hosted/controller/persistence/TenantSerializer.java14
-rw-r--r--controller-server/src/main/java/com/yahoo/vespa/hosted/controller/restapi/application/ApplicationApiHandler.java35
-rw-r--r--controller-server/src/test/java/com/yahoo/vespa/hosted/controller/persistence/TenantSerializerTest.java8
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();