Skip to content

Commit

Permalink
Add create validation
Browse files Browse the repository at this point in the history
refs #101
  • Loading branch information
franthormel committed Jun 17, 2024
1 parent db651af commit 5cadc1e
Show file tree
Hide file tree
Showing 6 changed files with 20 additions and 14 deletions.
4 changes: 2 additions & 2 deletions .env.vault
Original file line number Diff line number Diff line change
Expand Up @@ -16,8 +16,8 @@ DOTENV_VAULT_PRODUCTION="A/W28lRgCRRUOTxGt4RdzMY69YeNqu5CuYq3SPLvlsZ8TaW3ihMBrgq
DOTENV_VAULT_PRODUCTION_VERSION=8

# development
DOTENV_VAULT_DEVELOPMENT="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"
DOTENV_VAULT_DEVELOPMENT_VERSION=12
DOTENV_VAULT_DEVELOPMENT="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"
DOTENV_VAULT_DEVELOPMENT_VERSION=13

#/----------------settings/metadata-----------------/
DOTENV_VAULT="vlt_25bfa346010eb87a1ac6f8001177a2ef582884addd9df70b71781f110357a53a"
Expand Down
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -102,7 +102,7 @@ LISTING_ADDRESS_CITY_MAX=64
LISTING_ADDRESS_STATE_MIN=1
LISTING_ADDRESS_STATE_MAX=64
LISTING_ADDRESS_ZIP_MIN=1
LISTING_ADDRESS_ZIP_MIN=0
LISTING_ADDRESS_ZIP_MAX=64
LISTING_ADDRESS_LON_MIN =180
Expand Down
16 changes: 11 additions & 5 deletions app/listing/create/action.ts
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ import { ValidatorError } from "@/lib/validation";
import { ListingCreateFormValidator } from "@/lib/validation/listing/create";
import { IMAGE_URLS } from "./_data/listing-images";
import { ListingCreateFormState } from "./type";
import { ListingPreviewFormValidator } from "@/lib/validation/listing/preview";

/**
* Fetch six (6) to 12 image URLs meant to be used for listing photos.
Expand Down Expand Up @@ -80,9 +81,9 @@ export async function createListingNew(
return noErrorState;
}

// Prepare submitted form data
const formDataUtils = new FormDataUtils(formData);
const imageUrls = await fetchRandomImages();
// Prepare submitted form data
const formListing: ListingCreateForm = {
price: formDataUtils.getNumber("price", 0),
deposit: formDataUtils.getNumber("deposit", 0),
Expand All @@ -100,11 +101,16 @@ export async function createListingNew(
addressZipcode: formDataUtils.getString("addressZipcode", ""),
};

console.log("Form = ", formListing);
const validator = new ListingPreviewFormValidator(formListing);
const result = validator.validate();

// TODO: Validated submitted data
// TODO: If valid, go to create
// TODO: If not valid, return errors
if (result.success) {
// TODO: If valid, go to create
// TODO: .. then redirect to its details page
} else {
// TODO: If not valid, return errors
console.log("errors: ", result.error.errors);
}

return noErrorState;
}
Expand Down
2 changes: 1 addition & 1 deletion app/listing/create/page.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -607,7 +607,7 @@ export default function ListingCreatePage() {
name='addressZipcode'
type="text"
optional={true}
minLength={Number(process.env.LISTING_ADDRESS_ZIP_MIN ?? 1)}
minLength={Number(process.env.LISTING_ADDRESS_ZIP_MIN ?? 0)}
maxLength={Number(process.env.LISTING_ADDRESS_ZIP_MAX ?? 64)}
onChange={(e) => {
const value = e.target.value;
Expand Down
8 changes: 4 additions & 4 deletions lib/validation/listing/preview.ts
Original file line number Diff line number Diff line change
@@ -1,13 +1,13 @@
import { ListingPreviewForm } from "@/lib/types/listing";
import { ListingCreateForm, ListingPreviewForm } from "@/lib/types/listing";
import { Validator, ValidatorError } from "..";
import { LISTING_PREVIEW_VALIDATOR } from "./validators";

export class ListingPreviewFormValidator
implements Validator<ListingPreviewForm>
implements Validator<ListingPreviewForm | ListingCreateForm>
{
input: ListingPreviewForm;
input: ListingPreviewForm | ListingCreateForm;

constructor(input: ListingPreviewForm) {
constructor(input: ListingPreviewForm | ListingCreateForm) {
this.input = input;
}

Expand Down
2 changes: 1 addition & 1 deletion lib/validation/listing/validators.ts
Original file line number Diff line number Diff line change
Expand Up @@ -187,7 +187,7 @@ export const ADDRESS_STATE_VALIDATOR = z
});

// Address zip
const ADDRESS_ZIP_MIN = Number(process.env.LISTING_ADDRESS_ZIP_MIN ?? 1);
const ADDRESS_ZIP_MIN = Number(process.env.LISTING_ADDRESS_ZIP_MIN ?? 0);
const ADDRESS_ZIP_MAX = Number(process.env.LISTING_ADDRESS_ZIP_MAX ?? 64);
export const ADDRESS_ZIP_VALIDATOR = z
.string({
Expand Down

0 comments on commit 5cadc1e

Please sign in to comment.