feat: added spirit model and routes #24
src
@ -6,7 +6,8 @@ import {
|
||||
nostrRouter,
|
||||
reviewsRouter,
|
||||
winesRouter,
|
||||
sakeRouter
|
||||
sakeRouter,
|
||||
spiritsRouter
|
||||
} from './routes'
|
||||
import { Routes } from './types'
|
||||
|
||||
@ -22,6 +23,7 @@ connectToDatabase()
|
||||
app.use(Routes.Reviews, reviewsRouter)
|
||||
app.use(Routes.Wines, winesRouter)
|
||||
app.use(Routes.Sake, sakeRouter)
|
||||
app.use(Routes.Spirits, spiritsRouter)
|
||||
|
||||
app.listen(port, () => {
|
||||
console.log(`Server started at http://localhost:${port}`)
|
||||
|
@ -3,3 +3,4 @@ export * from './nostrEvent'
|
||||
export * from './review'
|
||||
export * from './wine'
|
||||
export * from './sake'
|
||||
export * from './spirit'
|
||||
|
29
src/models/spirit.ts
Normal file
29
src/models/spirit.ts
Normal file
@ -0,0 +1,29 @@
|
||||
import { ObjectId } from 'mongodb'
|
||||
import { SpiritType } from '../types'
|
||||
import { Alpha2Code } from 'i18n-iso-countries'
|
||||
import { CurrencyCode } from 'currency-codes-ts/dist/types'
|
||||
|
||||
export class Spirit {
|
||||
constructor(
|
||||
public productCodeEAN: string, // Article Number (https://en.wikipedia.org/wiki/International_Article_Number)
|
||||
public productCodeUPC: string, // Product Code (https://en.wikipedia.org/wiki/Universal_Product_Code)
|
||||
public productCodeSKU: string, // Stock keeping unit (https://en.wikipedia.org/wiki/Stock_keeping_unit)
|
||||
public country: Alpha2Code, // two-letter country codes defined in ISO 3166-1 (https://en.wikipedia.org/wiki/ISO_3166-1_alpha-2)
|
||||
public region: string, // appellation, village, sub-region, vineyard
|
||||
public name: string, // label
|
||||
public producerId: ObjectId, // product producer
|
||||
public type: SpiritType, // spirit type
|
||||
// TODO: add SpiritVariant type
|
||||
public variant: string, // vodka, rum, liqueur cream, etc
|
||||
public ingredients: string[], // an array of ingredients(flavouring)
|
||||
public alcohol: number, // alcohol percentage
|
||||
public standardDrinks: number, // number representing an amount of standard drinks per bottle
|
||||
public vintage: string, // year, nv (non-vintage) or mv (multi-vintage)
|
||||
public RRPamount: number, // 20
|
||||
public RRPcurrency: CurrencyCode, // USD
|
||||
public description: string, // detailed description of the product
|
||||
public url?: string, // e.g. producer's website
|
||||
public image?: string, // (optional image URL)cellar.social
|
||||
public id?: ObjectId // database object id
|
||||
) {}
|
||||
}
|
@ -3,3 +3,4 @@ export * from './nostr.router'
|
||||
export * from './reviews.router'
|
||||
export * from './wines.router'
|
||||
export * from './sake.router'
|
||||
export * from './spirits.router'
|
||||
|
46
src/routes/spirits.router.ts
Normal file
46
src/routes/spirits.router.ts
Normal file
@ -0,0 +1,46 @@
|
||||
import express, { Request, Response } from 'express'
|
||||
import { collections } from '../services/database.service'
|
||||
import { Spirit } from '../models'
|
||||
|
||||
// Global Config
|
||||
export const spiritsRouter = express.Router()
|
||||
|
||||
spiritsRouter.use(express.json())
|
||||
|
||||
// GET
|
||||
spiritsRouter.get('/', async (_req: Request, res: Response) => {
|
||||
try {
|
||||
const spirits = await collections.spirits?.find({}).toArray()
|
||||
|
||||
res.status(200).send(spirits)
|
||||
} catch (error: unknown) {
|
||||
console.error(error)
|
||||
|
||||
if (error instanceof Error) {
|
||||
res.status(500).send(error.message)
|
||||
}
|
||||
}
|
||||
})
|
||||
|
||||
// POST
|
||||
spiritsRouter.post('/', async (req: Request, res: Response) => {
|
||||
try {
|
||||
const spirit = req.body as Spirit
|
||||
|
||||
const result = await collections.spirits?.insertOne(spirit)
|
||||
|
||||
if (result) {
|
||||
res
|
||||
.status(201)
|
||||
.send(`Successfully created a new spirit with id ${result.insertedId}`)
|
||||
} else {
|
||||
res.status(500).send('Failed to create a new spirit.')
|
||||
}
|
||||
} catch (error: unknown) {
|
||||
console.error(error)
|
||||
|
||||
if (error instanceof Error) {
|
||||
res.status(400).send(error.message)
|
||||
}
|
||||
}
|
||||
})
|
@ -9,6 +9,7 @@ export const collections: {
|
||||
[DBcollections.Reviews]?: mongoDB.Collection
|
||||
[DBcollections.Wines]?: mongoDB.Collection
|
||||
[DBcollections.Sake]?: mongoDB.Collection
|
||||
[DBcollections.Spirits]?: mongoDB.Collection
|
||||
} = {}
|
||||
|
||||
// Initialize Connection
|
||||
@ -36,12 +37,16 @@ export async function connectToDatabase() {
|
||||
)
|
||||
const winesCollection: mongoDB.Collection = db.collection(DBcollections.Wines)
|
||||
const sakeCollection: mongoDB.Collection = db.collection(DBcollections.Sake)
|
||||
const spiritsCollection: mongoDB.Collection = db.collection(
|
||||
DBcollections.Spirits
|
||||
)
|
||||
|
||||
collections.users = usersCollection
|
||||
collections.nostrEvents = nostrEventsCollection
|
||||
collections.reviews = reviewsCollection
|
||||
collections.wines = winesCollection
|
||||
collections.sake = sakeCollection
|
||||
collections.spirits = spiritsCollection
|
||||
|
||||
console.log(
|
||||
`Successfully connected to database: ${db.databaseName} and collections:
|
||||
|
@ -3,5 +3,6 @@ export enum DBcollections {
|
||||
NostrEvents = 'nostrEvents',
|
||||
Reviews = 'reviews',
|
||||
Wines = 'wines',
|
||||
Sake = 'sake'
|
||||
Sake = 'sake',
|
||||
Spirits = 'spirits'
|
||||
}
|
||||
|
@ -13,3 +13,5 @@ export type SakeDesignation =
|
||||
| 'mirin:new'
|
||||
| 'mirin:true'
|
||||
| 'mirin:salt'
|
||||
|
||||
export type SpiritType = 'white' | 'dark' | 'liqueurs'
|
||||
|
@ -3,5 +3,6 @@ export enum Routes {
|
||||
NostrEvents = '/nostr',
|
||||
Reviews = '/reviews',
|
||||
Wines = '/wines',
|
||||
Sake = '/sake'
|
||||
Sake = '/sake',
|
||||
Spirits = '/spirits'
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user