first commit
This commit is contained in:
200
src/controllers/wardrobe/wardrobeItemController.js
Normal file
200
src/controllers/wardrobe/wardrobeItemController.js
Normal 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",
|
||||
});
|
||||
}
|
||||
};
|
||||
66
src/controllers/wardrobe/wardrobeMainController.js
Normal file
66
src/controllers/wardrobe/wardrobeMainController.js
Normal 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);
|
||||
}
|
||||
};
|
||||
48
src/controllers/wardrobe/wardrobePublicController.js
Normal file
48
src/controllers/wardrobe/wardrobePublicController.js
Normal 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);
|
||||
}
|
||||
};
|
||||
29
src/controllers/wardrobe/wardrobeRecommendationController.js
Normal file
29
src/controllers/wardrobe/wardrobeRecommendationController.js
Normal 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);
|
||||
}
|
||||
};
|
||||
52
src/controllers/wardrobe/wardrobeSearchController.js
Normal file
52
src/controllers/wardrobe/wardrobeSearchController.js
Normal 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);
|
||||
}
|
||||
};
|
||||
39
src/controllers/wardrobe/wardrobeStatsController.js
Normal file
39
src/controllers/wardrobe/wardrobeStatsController.js
Normal 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);
|
||||
}
|
||||
};
|
||||
Reference in New Issue
Block a user