added csv and updated migration to work better hopefully (#7)
Reviewed-on: #7 Co-authored-by: Joseph Nelson <joseph.nelson4456@gmail.com> Co-committed-by: Joseph Nelson <joseph.nelson4456@gmail.com>
This commit was merged in pull request #7.
This commit is contained in:
@@ -1,7 +1,8 @@
|
||||
export const up = (pgm) => {
|
||||
pgm.sql(`
|
||||
ALTER TABLE "items"
|
||||
ADD CONSTRAINT "set_id"
|
||||
ADD COLUMN "set_id" UUID,
|
||||
ADD CONSTRAINT "fk_set_id"
|
||||
FOREIGN KEY ("set_id")
|
||||
REFERENCES "sets"("id")
|
||||
ON DELETE CASCADE;
|
||||
@@ -11,6 +12,7 @@ export const up = (pgm) => {
|
||||
export const down = (pgm) => {
|
||||
pgm.sql(`
|
||||
ALTER TABLE "items"
|
||||
DROP CONSTRAINT "fk_name";
|
||||
DROP COLUMN "set_id",
|
||||
DROP CONSTRAINT "fk_set_id";
|
||||
`)
|
||||
}
|
||||
|
||||
+122
-8
@@ -36,7 +36,9 @@ router.get('/:id', async (req, res) => {
|
||||
})
|
||||
|
||||
// Create a new item
|
||||
router.post('/', [
|
||||
router.post(
|
||||
'/',
|
||||
[
|
||||
check('collection_id').not().isEmpty(),
|
||||
check('image_id').not().isEmpty(),
|
||||
check('productId').not().isEmpty(),
|
||||
@@ -45,21 +47,46 @@ router.post('/', [
|
||||
check('extCardText').not().isEmpty(),
|
||||
check('marketPrice').not().isEmpty(),
|
||||
check('extRarity').not().isEmpty(),
|
||||
check('set_id').not().isEmpty() // Add validation for set_id
|
||||
], async (req, res) => {
|
||||
check('set_id').not().isEmpty(), // Add validation for set_id
|
||||
],
|
||||
async (req, res) => {
|
||||
const errors = validationResult(req)
|
||||
if (!errors.isEmpty()) {
|
||||
return res.status(400).json({ errors: errors.array() })
|
||||
}
|
||||
const { collection_id, image_id, productId, name, cleanName, extCardText, marketPrice, extRarity, set_id } = req.body
|
||||
const {
|
||||
collection_id,
|
||||
image_id,
|
||||
productId,
|
||||
name,
|
||||
cleanName,
|
||||
extCardText,
|
||||
marketPrice,
|
||||
extRarity,
|
||||
set_id,
|
||||
} = req.body
|
||||
const client = await pool.connect()
|
||||
try {
|
||||
const result = await client.query('INSERT INTO items (collection_id, image_id, productId, name, cleanName, extCardText, marketPrice, extRarity, set_id, created_at, updated_at) VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, NOW(), NOW()) RETURNING *', [collection_id, image_id, productId, name, cleanName, extCardText, marketPrice, extRarity, set_id])
|
||||
const result = await client.query(
|
||||
'INSERT INTO items (collection_id, image_id, productId, name, cleanName, extCardText, marketPrice, extRarity, set_id, created_at, updated_at) VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, NOW(), NOW()) RETURNING *',
|
||||
[
|
||||
collection_id,
|
||||
image_id,
|
||||
productId,
|
||||
name,
|
||||
cleanName,
|
||||
extCardText,
|
||||
marketPrice,
|
||||
extRarity,
|
||||
set_id,
|
||||
]
|
||||
)
|
||||
res.status(201).json(result.rows[0])
|
||||
} finally {
|
||||
client.release()
|
||||
}
|
||||
})
|
||||
}
|
||||
)
|
||||
|
||||
// Update an existing item
|
||||
router.put('/:id', async (req, res) => {
|
||||
@@ -76,9 +103,14 @@ router.put('/:id', async (req, res) => {
|
||||
const client = await pool.connect()
|
||||
try {
|
||||
if (Object.keys(updates).length > 0) {
|
||||
const updateFields = Object.keys(updates).map(key => `${key} = $${Object.keys(updates).indexOf(key) + 2}`).join(', ')
|
||||
const updateFields = Object.keys(updates)
|
||||
.map((key) => `${key} = $${Object.keys(updates).indexOf(key) + 2}`)
|
||||
.join(', ')
|
||||
updates.updated_at = 'NOW()'
|
||||
const result = await client.query(`UPDATE items SET ${updateFields}, updated_at = $${Object.keys(updates).length + 1} WHERE id = $1 RETURNING *`, [id, ...Object.values(updates)])
|
||||
const result = await client.query(
|
||||
`UPDATE items SET ${updateFields}, updated_at = $${Object.keys(updates).length + 1} WHERE id = $1 RETURNING *`,
|
||||
[id, ...Object.values(updates)]
|
||||
)
|
||||
return res.json(result.rows[0])
|
||||
}
|
||||
if (result.rows.length === 0) {
|
||||
@@ -106,4 +138,86 @@ router.delete('/:id', async (req, res) => {
|
||||
}
|
||||
})
|
||||
|
||||
// Create a new item from CSV
|
||||
router.post(
|
||||
'/csv',
|
||||
[
|
||||
check('collection_id').not().isEmpty(),
|
||||
check('set_id').not().isEmpty(), // Add validation for set_id
|
||||
],
|
||||
async (req, res) => {
|
||||
const errors = validationResult(req)
|
||||
if (!errors.isEmpty()) {
|
||||
return res.status(400).json({ errors: errors.array() })
|
||||
}
|
||||
const { collection_id, set_id } = req.body
|
||||
const csvBuffer = req.files.file.buffer.toString('utf8')
|
||||
const csvLines = csvBuffer
|
||||
.split('\n')
|
||||
.filter((line) => line.trim().length > 0)
|
||||
const client = await pool.connect()
|
||||
try {
|
||||
// Insert each row into the items table
|
||||
for (const line of csvLines) {
|
||||
const [
|
||||
productId,
|
||||
name,
|
||||
cleanName,
|
||||
imageUrl,
|
||||
categoryId,
|
||||
groupId,
|
||||
url,
|
||||
modifiedOn,
|
||||
imageCount,
|
||||
extCardText,
|
||||
extUPC,
|
||||
lowPrice,
|
||||
midPrice,
|
||||
highPrice,
|
||||
marketPrice,
|
||||
directLowPrice,
|
||||
subTypeName,
|
||||
extNumber,
|
||||
extRarity,
|
||||
extCardType,
|
||||
extHP,
|
||||
extStage,
|
||||
extAttack1,
|
||||
extWeakness,
|
||||
extRetreatCost,
|
||||
extAttack2,
|
||||
extResistance,
|
||||
] = line.split(',').map((value) => value.trim())
|
||||
// Fetch the image from imageUrl
|
||||
const imageResponse = await fetch(imageUrl)
|
||||
const imageBuffer = await imageResponse.buffer()
|
||||
|
||||
// Insert the image into the images table
|
||||
const insertImageResult = await client.query(
|
||||
'INSERT INTO images (file, image) VALUES ($1::TEXT, $2::BYTEA) RETURNING id',
|
||||
[`${productId}.jpg`, imageBuffer]
|
||||
)
|
||||
|
||||
await client.query(
|
||||
'INSERT INTO items (collection_id, image_id, productId, name, cleanName, extCardText, marketPrice, extRarity, set_id, created_at, updated_at) VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, NOW(), NOW())',
|
||||
[
|
||||
collection_id,
|
||||
insertImageResult.rows[0].id,
|
||||
productId,
|
||||
name,
|
||||
cleanName,
|
||||
extCardText,
|
||||
marketPrice,
|
||||
extRarity,
|
||||
set_id,
|
||||
]
|
||||
)
|
||||
}
|
||||
res.status(201).json({ message: 'Items created' })
|
||||
} finally {
|
||||
client.release()
|
||||
}
|
||||
}
|
||||
)
|
||||
|
||||
export default router
|
||||
|
||||
Reference in New Issue
Block a user