Merge pull request 'feat(spirit): added arrack and aquavit' () from spirits-characteristics into staging

Reviewed-on: 
This commit is contained in:
Otto 2025-04-11 07:04:42 +00:00
commit d1857a3ccd
4 changed files with 69 additions and 58 deletions
src

@ -62,7 +62,9 @@ export enum WhiteSpiritVariants {
EauDeVie = 'Eau de Vie',
Grappa = 'Grappa',
Baijiu = 'Baijiu',
Soju = 'Soju'
Soju = 'Soju',
Aquavit = 'Aquavit',
Arrack = 'Arrack'
}
export enum DarkSpiritVariants {
@ -74,6 +76,7 @@ export enum DarkSpiritVariants {
Mezcal = 'Mezcal',
Rum = 'Rum',
Slivovitz = 'Slivovitz',
Arrack = 'Arrack',
Whiskey = 'Whiskey'
}

@ -95,7 +95,9 @@ export const spiritVariantMap: {
'Buckwheat',
'Rice',
'Sweet Potato'
]
],
[WhiteSpiritVariants.Aquavit]: [],
[WhiteSpiritVariants.Arrack]: []
},
[SpiritType.Dark]: {
[DarkSpiritVariants.Absinthe]: ['Jaune', 'Verte'],
@ -139,7 +141,8 @@ export const spiritVariantMap: {
'Corn',
'Oat',
'Rice'
]
],
[DarkSpiritVariants.Arrack]: []
},
[SpiritType.Liqueurs]: {
[LiqueursSpiritVariants.Amaro]: [],
@ -199,7 +202,8 @@ export const spiritCharacteristicsMap: {
WhiteSpiritVariants.Mezcal,
WhiteSpiritVariants.Soju,
WhiteSpiritVariants.Vodka,
WhiteSpiritVariants.Rum
WhiteSpiritVariants.Rum,
WhiteSpiritVariants.Aquavit
],
[SpiritCharacteristics.FruityAndAromatic]: [
WhiteSpiritVariants.Rum,
@ -217,7 +221,8 @@ export const spiritCharacteristicsMap: {
DarkSpiritVariants.Genever,
WhiteSpiritVariants.Gin,
WhiteSpiritVariants.Pastis,
DarkSpiritVariants.Chartreuse
DarkSpiritVariants.Chartreuse,
WhiteSpiritVariants.Aquavit
],
[SpiritCharacteristics.SweetAndSyrupy]: [
@ -235,7 +240,9 @@ export const spiritCharacteristicsMap: {
DarkSpiritVariants.Mezcal,
DarkSpiritVariants.Whiskey,
LiqueursSpiritVariants.Cream,
LiqueursSpiritVariants.Honey
LiqueursSpiritVariants.Honey,
WhiteSpiritVariants.Arrack,
DarkSpiritVariants.Arrack
],
[SpiritCharacteristics.RichAndFullBodied]: [
WhiteSpiritVariants.Baijiu,

@ -20,56 +20,6 @@ export const spiritValidation = (data: unknown): Joi.ValidationResult =>
type: Joi.string()
.valid(...Object.values(SpiritType))
.required(),
characteristics: Joi.array()
.items(
Joi.string().custom((characteristic, helper) => {
if (!Object.values(SpiritCharacteristics).includes(characteristic)) {
return helper.message({
custom: Joi.expression(
`"${characteristic}" is not a valid characteristic. Valid options are [${Object.values(
SpiritCharacteristics
)
.map((option) => `"${option}"`)
.join(', ')}]`
)
})
}
const spiritType: SpiritType = helper.state.ancestors[1].type
const spiritVariant: string | { [key: string]: unknown } =
helper.state.ancestors[1].variant
const spiritVariantName =
typeof spiritVariant === 'string'
? spiritVariant
: Object.keys(spiritVariant)[0]
const variantsInCharacteristic =
spiritCharacteristicsMap[characteristic as SpiritCharacteristics]
const characteristicsInVariant = Object.keys(
spiritCharacteristicsMap
).filter((char) =>
spiritCharacteristicsMap[char as SpiritCharacteristics].includes(
spiritVariantName
)
)
if (!variantsInCharacteristic.includes(spiritVariantName)) {
return helper.message({
custom: Joi.expression(
`"${characteristic}" is not a valid characteristic for "${spiritType} -> ${spiritVariantName}". Valid options are [${characteristicsInVariant
.map((option) => `"${option}"`)
.join(', ')}]`
)
})
}
return characteristic
})
)
.required(),
variant: Joi.alternatives().try(
Joi.string().custom((variant, helper) => {
// return if no value
@ -267,6 +217,57 @@ export const spiritValidation = (data: unknown): Joi.ValidationResult =>
}
)
),
characteristics: Joi.array()
.items(
Joi.string().custom((characteristic, helper) => {
if (!Object.values(SpiritCharacteristics).includes(characteristic)) {
return helper.message({
custom: Joi.expression(
`"${characteristic}" is not a valid characteristic. Valid options are [${Object.values(
SpiritCharacteristics
)
.map((option) => `"${option}"`)
.join(', ')}]`
)
})
}
const spiritType: SpiritType = helper.state.ancestors[1].type
const spiritVariant: string | { [key: string]: unknown } =
helper.state.ancestors[1].variant
const spiritVariantName =
typeof spiritVariant === 'string'
? spiritVariant
: Object.keys(spiritVariant)[0]
const variantsInCharacteristic =
spiritCharacteristicsMap[characteristic as SpiritCharacteristics]
const characteristicsInVariant = Object.keys(
spiritCharacteristicsMap
).filter((char) =>
spiritCharacteristicsMap[char as SpiritCharacteristics].includes(
spiritVariantName
)
)
if (!variantsInCharacteristic.includes(spiritVariantName)) {
return helper.message({
custom: Joi.expression(
`"${characteristic}" is not a valid characteristic for "${spiritType} -> ${spiritVariantName}". Valid options are [${characteristicsInVariant
.map((option) => `"${option}"`)
.join(', ')}]`
)
})
}
return characteristic
})
)
.required(),
ingredients: Joi.array()
.items(Joi.string().valid(...Object.values(Ingredient)))
.required(),
@ -277,7 +278,7 @@ export const spiritValidation = (data: unknown): Joi.ValidationResult =>
vintage: Joi.alternatives()
.try(
Joi.string().valid(...Object.values(VintageOptions)),
Joi.number().min(1000).max(new Date().getFullYear())
Joi.number().min(1700).max(new Date().getFullYear())
)
.required(),
RRPamount: Joi.number().required(),

@ -362,7 +362,7 @@ export const wineValidation = (data: unknown): Joi.ValidationResult =>
vintage: Joi.alternatives()
.try(
Joi.string().valid(...Object.values(VintageOptions)),
Joi.number().min(1000).max(new Date().getFullYear())
Joi.number().min(1700).max(new Date().getFullYear())
)
.required(),
volume: Joi.string()