Spaces:
Running
Running
push wardrobe
Browse files- src/index.ts +4 -1
- src/routes/wardrobe.ts +75 -0
- stylegptUI +1 -1
src/index.ts
CHANGED
|
@@ -8,6 +8,7 @@ import { AppDataSource } from "./utils/dataSource";
|
|
| 8 |
import authRoute from "./routes/auth";
|
| 9 |
import uploadRoute from "./routes/upload";
|
| 10 |
import suggestRoute from "./routes/suggest";
|
|
|
|
| 11 |
import profileRoute from "./routes/profile";
|
| 12 |
|
| 13 |
dotenv.config();
|
|
@@ -38,7 +39,8 @@ app.get("/", (req, res) => {
|
|
| 38 |
auth: "/api/auth",
|
| 39 |
profile: "/api/profile",
|
| 40 |
upload: "/api/upload",
|
| 41 |
-
suggest: "/api/suggest"
|
|
|
|
| 42 |
}
|
| 43 |
},
|
| 44 |
technologies: [
|
|
@@ -211,6 +213,7 @@ app.use("/api/auth", authRoute);
|
|
| 211 |
app.use("/api/profile", profileRoute);
|
| 212 |
app.use("/api/upload", uploadRoute);
|
| 213 |
app.use("/api/suggest", suggestRoute);
|
|
|
|
| 214 |
|
| 215 |
const PORT = process.env.PORT || 7860;
|
| 216 |
|
|
|
|
| 8 |
import authRoute from "./routes/auth";
|
| 9 |
import uploadRoute from "./routes/upload";
|
| 10 |
import suggestRoute from "./routes/suggest";
|
| 11 |
+
import wardrobeRoute from "./routes/wardrobe";
|
| 12 |
import profileRoute from "./routes/profile";
|
| 13 |
|
| 14 |
dotenv.config();
|
|
|
|
| 39 |
auth: "/api/auth",
|
| 40 |
profile: "/api/profile",
|
| 41 |
upload: "/api/upload",
|
| 42 |
+
suggest: "/api/suggest",
|
| 43 |
+
wardrobe: "/api/wardrobe"
|
| 44 |
}
|
| 45 |
},
|
| 46 |
technologies: [
|
|
|
|
| 213 |
app.use("/api/profile", profileRoute);
|
| 214 |
app.use("/api/upload", uploadRoute);
|
| 215 |
app.use("/api/suggest", suggestRoute);
|
| 216 |
+
app.use("/api/wardrobe", wardrobeRoute);
|
| 217 |
|
| 218 |
const PORT = process.env.PORT || 7860;
|
| 219 |
|
src/routes/wardrobe.ts
ADDED
|
@@ -0,0 +1,75 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
import express from "express";
|
| 2 |
+
import { AppDataSource } from "../utils/dataSource";
|
| 3 |
+
import { WardrobeItem } from "../entity/WardrobeItem";
|
| 4 |
+
import { authenticateToken, AuthRequest } from "../middleware/auth";
|
| 5 |
+
|
| 6 |
+
const router = express.Router();
|
| 7 |
+
|
| 8 |
+
/**
|
| 9 |
+
* @openapi
|
| 10 |
+
* /api/wardrobe:
|
| 11 |
+
* get:
|
| 12 |
+
* summary: List wardrobe items for the authenticated user
|
| 13 |
+
* tags: [Upload]
|
| 14 |
+
* security:
|
| 15 |
+
* - bearerAuth: []
|
| 16 |
+
* parameters:
|
| 17 |
+
* - in: query
|
| 18 |
+
* name: style
|
| 19 |
+
* schema:
|
| 20 |
+
* type: string
|
| 21 |
+
* enum: [formal, casual, streetwear, sportswear]
|
| 22 |
+
* description: Optional filter by style
|
| 23 |
+
* - in: query
|
| 24 |
+
* name: q
|
| 25 |
+
* schema:
|
| 26 |
+
* type: string
|
| 27 |
+
* description: Optional search term that matches category
|
| 28 |
+
* responses:
|
| 29 |
+
* 200:
|
| 30 |
+
* description: Wardrobe items fetched
|
| 31 |
+
* content:
|
| 32 |
+
* application/json:
|
| 33 |
+
* schema:
|
| 34 |
+
* type: object
|
| 35 |
+
* properties:
|
| 36 |
+
* success:
|
| 37 |
+
* type: boolean
|
| 38 |
+
* items:
|
| 39 |
+
* type: array
|
| 40 |
+
* items:
|
| 41 |
+
* $ref: "#/components/schemas/WardrobeItem"
|
| 42 |
+
* 401:
|
| 43 |
+
* description: Unauthorized
|
| 44 |
+
* 500:
|
| 45 |
+
* description: Server error
|
| 46 |
+
*/
|
| 47 |
+
router.get("/", authenticateToken, async (req: AuthRequest, res) => {
|
| 48 |
+
try {
|
| 49 |
+
const userId = req.userId!;
|
| 50 |
+
const { style, q } = req.query as { style?: string; q?: string };
|
| 51 |
+
|
| 52 |
+
const repo = AppDataSource.getRepository(WardrobeItem);
|
| 53 |
+
const qb = repo
|
| 54 |
+
.createQueryBuilder("wardrobe_item")
|
| 55 |
+
.where("wardrobe_item.userId = :userId", { userId })
|
| 56 |
+
.orderBy("wardrobe_item.createdAt", "DESC");
|
| 57 |
+
|
| 58 |
+
if (style) {
|
| 59 |
+
qb.andWhere("wardrobe_item.style = :style", { style });
|
| 60 |
+
}
|
| 61 |
+
if (q) {
|
| 62 |
+
qb.andWhere("LOWER(wardrobe_item.category) LIKE :q", { q: `%${q.toLowerCase()}%` });
|
| 63 |
+
}
|
| 64 |
+
|
| 65 |
+
const items = await qb.getMany();
|
| 66 |
+
res.json({ success: true, items });
|
| 67 |
+
} catch (error: any) {
|
| 68 |
+
console.error("Wardrobe list error:", error);
|
| 69 |
+
res.status(500).json({ success: false, error: error.message || "Failed to fetch wardrobe" });
|
| 70 |
+
}
|
| 71 |
+
});
|
| 72 |
+
|
| 73 |
+
export default router;
|
| 74 |
+
|
| 75 |
+
|
stylegptUI
CHANGED
|
@@ -1 +1 @@
|
|
| 1 |
-
Subproject commit
|
|
|
|
| 1 |
+
Subproject commit cf8194c3d8c836c4a674be05d2fa2f00e3cce595
|