first commit

This commit is contained in:
tusuii
2026-02-19 17:25:38 +05:30
commit 09ea6d4efb
72 changed files with 24296 additions and 0 deletions

View File

@@ -0,0 +1,200 @@
const Wardrobe = require('../../models/mongodb/Wardrobe');
// @desc Add item to wardrobe
// exports.addItem = async (req, res, next) => {
// try {
// const itemData = req.body;
// let wardrobe = await Wardrobe.findByUserId(req.user.id);
// if (!wardrobe) {
// wardrobe = new Wardrobe({ userId: req.user.id, name: 'My Wardrobe' });
// }
// await wardrobe.addItem(itemData);
// // res.status(201).json({
// // success: true,
// // message: 'Item added successfully',
// // data: { wardrobe },
// // });
// return res.status(201).json({
// statusCode: 201,
// status: true,
// message: 'Item added successfully',
// data: { wardrobe },
// });
// } catch (error) {
// next(error);
// }
// };
exports.addItem = async (req, res, next) => {
try {
const itemData = { ...req.body };
// ✅ FIX: map image → images array
if (itemData.image) {
itemData.images = [
{
url: itemData.image,
isPrimary: true,
}
];
delete itemData.image; // prevent schema pollution
}
let wardrobe = await Wardrobe.findByUserId(req.user.id);
if (!wardrobe) {
wardrobe = new Wardrobe({
userId: req.user.id,
name: 'My Wardrobe',
});
}
await wardrobe.addItem(itemData);
return res.status(201).json({
statusCode: 201,
status: true,
message: 'Item added successfully',
data: { wardrobe },
});
} catch (error) {
next(error);
}
};
// @desc Update wardrobe item
exports.updateItem = async (req, res, next) => {
try {
const { itemId } = req.params;
const updateData = req.body;
const wardrobe = await Wardrobe.findByUserId(req.user.id);
// if (!wardrobe) {
// return res.status(404).json({ success: false, message: 'Wardrobe not found' });
// }
if (!wardrobe) {
return res.status(404).json({
statusCode: 404,
status: false,
message: 'Wardrobe not found',
});
}
await wardrobe.updateItem(itemId, updateData);
// res.json({ success: true, message: 'Item updated successfully', data: { wardrobe } });
return res.json({
statusCode: 200,
status: true,
message: 'Item updated successfully',
data: { wardrobe },
});
} catch (error) {
next(error);
}
};
// @desc Remove item from wardrobe
exports.removeItem = async (req, res, next) => {
try {
const { itemId } = req.params;
const wardrobe = await Wardrobe.findByUserId(req.user.id);
// if (!wardrobe) {
// return res.status(404).json({ success: false, message: 'Wardrobe not found' });
// }
if (!wardrobe) {
return res.status(404).json({
statusCode: 404,
status: false,
message: 'Wardrobe not found',
});
}
await wardrobe.removeItem(itemId);
// res.json({ success: true, message: 'Item removed successfully', data: { wardrobe } });
return res.json({
statusCode: 200,
status: true,
message: 'Item removed successfully',
data: { wardrobe },
});
} catch (error) {
next(error);
}
};
// @desc Get items by category
// exports.getItemsByCategory = async (req, res, next) => {
// try {
// const { category } = req.params;
// const wardrobe = await Wardrobe.findByUserId(req.user.id);
// // if (!wardrobe) return res.status(404).json({ success: false, message: 'Wardrobe not found' });
// if (!wardrobe) {
// return res.status(404).json({
// statusCode: 404,
// status: false,
// message: 'Wardrobe not found',
// });
// }
// const items = wardrobe.getItemsByCategory(category);
// // res.json({ success: true, data: { items } });
// return res.json({
// statusCode: 200,
// status: true,
// message: 'Items fetched successfully',
// data: { items },
// });
// } catch (error) {
// next(error);
// }
// };
// controllers/wardrobeController.js
exports.getItemsByCategory = async (req, res, next) => {
try {
const { category } = req.params;
const wardrobe = await Wardrobe.findByUserId(req.user.id);
if (!wardrobe) {
return res.status(404).json({
statusCode: 404,
status: false,
message: "Wardrobe not found",
});
}
const items = wardrobe.getItemsByCategory(category) || [];
return res.json({
statusCode: 200,
status: true,
message: "Items fetched successfully",
data: { items },
});
} catch (error) {
console.error("Error fetching items by category:", error);
return res.status(500).json({
statusCode: 500,
status: false,
message: "Internal server error",
});
}
};

View File

@@ -0,0 +1,66 @@
const Wardrobe = require('../../models/mongodb/Wardrobe');
// @desc Get user's wardrobe
exports.getWardrobe = async (req, res, next) => {
try {
let wardrobe = await Wardrobe.findByUserId(req.user.id);
if (!wardrobe) {
wardrobe = new Wardrobe({
userId: req.user.id,
name: 'My Wardrobe',
});
await wardrobe.save();
}
// res.json({ success: true, data: { wardrobe } });
return res.status(200).json({
statusCode: 200,
status: true,
message: "Wardrobe fetched successfully",
data: { wardrobe },
});
} catch (error) {
next(error);
}
};
// @desc Update wardrobe details
exports.updateWardrobe = async (req, res, next) => {
try {
const { name, description, isPublic, shareSettings } = req.body;
let wardrobe = await Wardrobe.findByUserId(req.user.id);
if (!wardrobe) {
wardrobe = new Wardrobe({
userId: req.user.id,
name: name || 'My Wardrobe',
description,
isPublic: isPublic || false,
shareSettings: shareSettings || { allowViewing: false, allowRecommendations: false },
});
} else {
wardrobe.name = name || wardrobe.name;
wardrobe.description = description;
wardrobe.isPublic = isPublic ?? wardrobe.isPublic;
wardrobe.shareSettings = shareSettings || wardrobe.shareSettings;
}
await wardrobe.save();
// res.json({
// success: true,
// message: 'Wardrobe updated successfully',
// data: { wardrobe },
// });
return res.status(200).json({
statusCode: 200,
status: true,
message: "Wardrobe updated successfully",
data: { wardrobe },
});
} catch (error) {
next(error);
}
};

View File

@@ -0,0 +1,48 @@
const Wardrobe = require('../../models/mongodb/Wardrobe');
// @desc Get public wardrobes
exports.getPublicWardrobes = async (req, res, next) => {
try {
const { page = 1, limit = 20 } = req.query;
const skip = (page - 1) * limit;
const wardrobes = await Wardrobe.findPublicWardrobes(parseInt(limit), parseInt(skip));
// res.json({ success: true, data: { wardrobes } });
return res.status(200).json({
statusCode: 200,
status: true,
message: "Public wardrobes fetched successfully",
data: { wardrobes },
});
} catch (error) {
next(error);
}
};
// @desc Get public wardrobe by ID
exports.getPublicWardrobeById = async (req, res, next) => {
try {
const wardrobe = await Wardrobe.findOne({ _id: req.params.id, isPublic: true });
// if (!wardrobe) return res.status(404).json({ success: false, message: 'Wardrobe not found' });
if (!wardrobe) {
return res.status(404).json({
statusCode: 404,
status: false,
message: "Wardrobe not found",
});
}
// res.json({ success: true, data: { wardrobe } });
return res.status(200).json({
statusCode: 200,
status: true,
message: "Public wardrobe fetched successfully",
data: { wardrobe },
});
} catch (error) {
next(error);
}
};

View File

@@ -0,0 +1,29 @@
const Wardrobe = require('../../models/mongodb/Wardrobe');
// @desc Generate outfit recommendations
exports.getRecommendations = async (req, res, next) => {
try {
const wardrobe = await Wardrobe.findByUserId(req.user.id);
// if (!wardrobe) return res.status(404).json({ success: false, message: 'Wardrobe not found' });
if (!wardrobe) {
return res.status(404).json({
statusCode: 404,
status: false,
message: "Wardrobe not found",
data: null
});
}
const recommendations = wardrobe.generateOutfitRecommendations();
// res.json({ success: true, data: { recommendations } });
return res.status(200).json({
statusCode: 200,
status: true,
message: "Recommendations fetched successfully",
data: { recommendations }
});
} catch (error) {
next(error);
}
};

View File

@@ -0,0 +1,52 @@
const Wardrobe = require('../../models/mongodb/Wardrobe');
// @desc Search wardrobe items
exports.searchItems = async (req, res, next) => {
try {
const { query, tags, category } = req.query;
const wardrobe = await Wardrobe.findByUserId(req.user.id);
// if (!wardrobe) return res.status(404).json({ success: false, message: 'Wardrobe not found' });
if (!wardrobe) {
return res.status(404).json({
statusCode: 404,
status: false,
message: "Wardrobe not found",
data: null
});
}
let items = wardrobe.items.filter(item => item.isActive);
if (category) items = items.filter(item => item.category === category);
if (tags) {
const tagArray = tags.split(',');
items = items.filter(item =>
tagArray.some(tag =>
item.aiTags.includes(tag) || item.userTags.includes(tag)
)
);
}
if (query) {
const searchTerm = query.toLowerCase();
items = items.filter(item =>
item.name.toLowerCase().includes(searchTerm) ||
item.brand?.toLowerCase().includes(searchTerm) ||
item.description?.toLowerCase().includes(searchTerm)
);
}
// res.json({ success: true, data: { items } });
return res.status(200).json({
statusCode: 200,
status: true,
message: "Items fetched successfully",
data: { items }
});
} catch (error) {
next(error);
}
};

View File

@@ -0,0 +1,39 @@
const Wardrobe = require('../../models/mongodb/Wardrobe');
// @desc Get wardrobe statistics
exports.getStats = async (req, res, next) => {
try {
const wardrobe = await Wardrobe.findByUserId(req.user.id);
// if (!wardrobe) return res.status(404).json({ success: false, message: 'Wardrobe not found' });
if (!wardrobe) {
return res.status(404).json({
statusCode: 404,
status: false,
message: "Wardrobe not found",
data: null
});
}
const stats = {
totalItems: wardrobe.totalItems,
categoryCounts: wardrobe.categoryCounts,
recentItems: wardrobe.items
.sort((a, b) => new Date(b.createdAt) - new Date(a.createdAt))
.slice(0, 5),
mostWornItems: wardrobe.items
.sort((a, b) => (b.purchaseCount || 0) - (a.purchaseCount || 0))
.slice(0, 5),
};
// res.json({ success: true, data: { stats } });
return res.status(200).json({
statusCode: 200,
status: true,
message: "Wardrobe statistics fetched successfully",
data: { stats }
});
} catch (error) {
next(error);
}
};