Giter Site home page Giter Site logo

e-commerce-app-backend's Introduction

e-commerce-app-backend

To install dependencies:

bun install

To run:

bun run index.ts

This project was created using bun init in bun v1.0.35. Bun is a fast all-in-one JavaScript runtime.

e-commerce-app-backend's People

Contributors

kyzsuukii avatar

Stargazers

Memet Zx avatar

Watchers

 avatar

e-commerce-app-backend's Issues

Backend: mengganti role user

Mengganti role user

d4e4ee2

router.patch(
"/role",
passport.authenticate("jwt", { session: false }),
isAdmin,
body("id").isInt().notEmpty(),
body("role").isString().isIn(["CUSTOMER", "ADMIN"]).notEmpty(),
async (req, res) => {
const db = await conn();
try {
const { id, role } = req.body;
const [result]: any = await db.query("UPDATE auth SET role = ? WHERE id = ?", [role, id]);
if (result.affectedRows === 0) {
return res.status(404).json({ errors: [{ msg: "User not found" }] });
}
return res.status(200).json({ msg: 'User updated successfully' });
} catch (error) {
console.error("Error updating product:", error);
return res
.status(500)
.json({ errors: [{ msg: "Internal Server Error" }] });
} finally {
await db.end();
}
}
);

Backend: menghandle produk yang di upload (revisi 3)

untuk code perubahannya sebagai berikut:

route.post(
"/upload",
passport.authenticate("jwt", { session: false }),
isAdmin,
upload.single("thumbnail"),
body("name").isString(),
body("category").isString(),
body("price")
.toInt()
.isNumeric()
.isLength({ min: 1, max: 6 })
.custom((value) => value >= 0),
body("stock")
.toInt()
.isNumeric()
.isLength({ min: 1, max: 3 })
.custom((value) => value >= 0),
body("description").isString(),
async (req: any, res) => {
const result = validationResult(req);
if (!result.isEmpty()) {
return res.status(400).json({ errors: result.array() });
}
if (!req.file) {
return res.status(400).json({ errors: [{ msg: "No file uploaded" }] });
}
const thumbnail = req.file;
const { name, category, description, price, stock } = req.body;
const db = await conn();
try {
await db.beginTransaction();
const [productResult]: any = await db.execute(
"INSERT INTO products (name, description, price, stock, thumbnail) VALUES (?, ?, ?, ?, ?)",
[name, description, price, stock, thumbnail.path],
);
const { insertId: productId } = productResult;
let [categoryResult]: any = await db.execute(
"INSERT INTO category (name) VALUES (?) ON DUPLICATE KEY UPDATE id=LAST_INSERT_ID(id)",
[category],
);
let categoryId = categoryResult.insertId;
await db.execute(
"INSERT INTO product_category (product_id, category_id) VALUES (?, ?)",
[productId, categoryId],
);
await db.commit();
return res
.status(200)
.json({ msg: "Product uploaded and saved successfully" });
} catch (error) {
await db.rollback();
return res
.status(500)
.json({ errors: [{ msg: "Error saving product" }] });
} finally {
await db.end();
}
},
);

Backend: menghapus product

Menghapus produk dari database juga sekaligus kategori jika tidak ada produk yang menggunakan kategori tersebut.

route.delete(
"/delete",
passport.authenticate("jwt", { session: false }),
isAdmin,
body("id").isInt().notEmpty(),
async (req: any, res) => {
const { id } = req.body;
const db = await conn();
try {
await db.beginTransaction();
const [productResult]: any = await db.query(
"SELECT category_id FROM product_category WHERE product_id = ?",
[id],
);
if (productResult.length === 0) {
await db.rollback();
return res.status(404).json({ errors: [{ msg: "Product not found" }] });
}
const categoryId = productResult[0].category_id;
await db.query("DELETE FROM product_category WHERE product_id = ?", [id]);
const [deleteProductResult]: any = await db.query(
"DELETE FROM products WHERE id = ?",
[id],
);
if (deleteProductResult.affectedRows === 1) {
const [categoryProductsResult]: any = await db.query(
"SELECT COUNT(*) AS count FROM product_category WHERE category_id = ?",
[categoryId],
);
if (categoryProductsResult[0].count === 0) {
await db.query("DELETE FROM category WHERE id = ?", [categoryId]);
}
await db.commit();
return res.json({ message: "Product deleted successfully" });
} else {
await db.rollback();
return res.status(404).json({ errors: [{ msg: "Product not found" }] });
}
} catch (error) {
console.error("Error deleting product:", error);
await db.rollback();
return res
.status(500)
.json({ errors: [{ msg: "Internal server error" }] });
} finally {
await db.end();
}
},
);

Backend: Mengupdate detail product

penambahan route API untuk mengupdate informasi produk di database seperti:

  • Nama produk
  • Category Produk
  • Deskripsi produk
  • Harga produk
  • Stok produk

Untuk fitur penggantian thumbnail gambar produk belum didukung, namun sedang dalam proses pengembangan (Work in Progress).

perubahan secara lebih detail silahkan check di sini: Commit 173b75567d16514f7a1bc63bce71cd0544995341.

dan beberapa commit perubahan di bagian backend hari ini: https://github.com/kyzsuukii/e-commerce-app-backend/commits/dashboard-dev/?since=2024-04-06&until=2024-04-06

Backend: Mendapatkan semua product beserta detail

route.get(
"/all",
passport.authenticate("jwt", { session: false }),
isAdmin,
async (req: any, res) => {
const { limit: queryLimit } = req.query;
const db = await conn();
try {
let query =
"SELECT p.id, p.name, p.description, p.price, p.stock, p.thumbnail, GROUP_CONCAT(c.name SEPARATOR ', ') AS category FROM products p LEFT JOIN product_category pc ON p.id = pc.product_id LEFT JOIN category c ON pc.category_id = c.id GROUP BY p.id";
const params = [];
const limit = parseInt(queryLimit, 10);
if (!isNaN(limit) && limit > 0) {
query += " LIMIT ?";
params.push(limit);
}
const [products]: any = await db.execute(query, params);
res.json(products);
} catch (error) {
console.error("Error fetching products:", error);
res.status(500).json({ errors: [{ msg: "Error fetching products" }] });
} finally {
await db.end();
}
},
);

Backend: Mendapatkan detail product berdasarkan id

route.get(
"/get/:id",
passport.authenticate("jwt", { session: false }),
isAdmin,
async (req: any, res) => {
const { id } = req.params;
const db = await conn();
try {
const [product]: any = await db.execute(
"SELECT p.id, p.name, p.description, p.price, p.stock, p.thumbnail, (SELECT GROUP_CONCAT(c.name SEPARATOR ', ') FROM product_category pc JOIN category c ON pc.category_id = c.id WHERE pc.product_id = p.id) AS category FROM products p WHERE p.id = ?",
[id],
);
if (!product[0]) {
return res.status(404).json({ errors: [{ msg: "Product not found" }] });
}
res.json(product[0]);
} catch (error) {
console.error("Error fetching product:", error);
res.status(500).json({ errors: [{ msg: "Error fetching product" }] });
} finally {
await db.end();
}
},
);

Backend: Mendapatkan semua user

route mengdapatkan semua user dari database

c280b11

router.get("/all", passport.authenticate("jwt", { session: false }), isAdmin, async (req, res) => {
const db = await conn();
try {
const [users]: any = await db.query('SELECT id, email, role FROM auth WHERE id != ?', [req.user?.id]);
return res.status(200).json({ users });
} catch (error) {
console.error("Error updating product:", error);
return res.status(500).json({ errors: [{ msg: "Internal Server Error" }] });
} finally {
await db.end();
}
})

Backend: menghapus user dari database

Menghapus user dari database

1af0bb4

router.delete('/delete', passport.authenticate('jwt', { session: false }), isAdmin, body('id').isInt().notEmpty(), async (req, res) => {
const db = await conn();
try {
const { id } = req.body;
const [result]: any = await db.query('DELETE FROM auth WHERE id = ?', [id]);
if (result.affectedRows === 0) {
return res.status(404).json({ errors: [{ msg: "User not found" }] });
}
return res.status(200).json({ msg: 'User deleted successfully' });
} catch (error) {
console.error("Error updating product:", error);
return res.status(500).json({ errors: [{ msg: "Internal Server Error" }] });
} finally {
await db.end();
}
})

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.