102 lines
3.4 KiB
JavaScript
102 lines
3.4 KiB
JavaScript
"use strict";
|
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
exports.reactionsRoutes = reactionsRoutes;
|
|
const database_1 = require("../../../config/database");
|
|
const auth_1 = require("../middleware/auth");
|
|
// Rebranded reaction emojis (6 standard social reactions)
|
|
const REACTION_EMOJIS = {
|
|
like: '👍',
|
|
love: '❤️',
|
|
laugh: '😂',
|
|
wow: '😮',
|
|
sad: '😢',
|
|
angry: '😠',
|
|
};
|
|
// Format video timestamp as MM:SS or H:MM:SS
|
|
function formatVideoTime(seconds) {
|
|
const h = Math.floor(seconds / 3600);
|
|
const m = Math.floor((seconds % 3600) / 60);
|
|
const s = seconds % 60;
|
|
if (h > 0) {
|
|
return `${h}:${m.toString().padStart(2, '0')}:${s.toString().padStart(2, '0')}`;
|
|
}
|
|
return `${m}:${s.toString().padStart(2, '0')}`;
|
|
}
|
|
async function reactionsRoutes(fastify) {
|
|
// Add reaction (authenticated users only)
|
|
fastify.post('/', {
|
|
preHandler: auth_1.authenticate,
|
|
}, async (request, reply) => {
|
|
const { mediaId, reactionType, videoTimestamp } = request.body;
|
|
const userId = request.user.id;
|
|
// Validate reaction type
|
|
if (!REACTION_EMOJIS[reactionType]) {
|
|
return reply.code(400).send({ message: 'Invalid reaction type' });
|
|
}
|
|
// Check if video exists
|
|
const video = await database_1.prisma.video.findUnique({
|
|
where: { id: mediaId },
|
|
});
|
|
if (!video) {
|
|
return reply.code(404).send({ message: 'Video not found' });
|
|
}
|
|
// Create reaction
|
|
const reaction = await database_1.prisma.videoReaction.create({
|
|
data: {
|
|
mediaId,
|
|
userId,
|
|
reactionType: reactionType, // Cast string to ReactionType enum
|
|
videoTimestamp,
|
|
createdAt: new Date(),
|
|
},
|
|
});
|
|
return {
|
|
success: true,
|
|
reaction: {
|
|
...reaction,
|
|
emoji: REACTION_EMOJIS[reactionType],
|
|
formattedTime: formatVideoTime(videoTimestamp),
|
|
},
|
|
};
|
|
});
|
|
// Get reactions
|
|
fastify.get('/', async (request, reply) => {
|
|
const { mediaId, userId, limit = '50' } = request.query;
|
|
const where = {};
|
|
// Filter by mediaId if provided
|
|
if (mediaId) {
|
|
where.mediaId = parseInt(mediaId);
|
|
}
|
|
// Filter by userId if provided
|
|
if (userId) {
|
|
where.userId = userId;
|
|
}
|
|
const reactions = await database_1.prisma.videoReaction.findMany({
|
|
where,
|
|
orderBy: {
|
|
createdAt: 'desc',
|
|
},
|
|
take: parseInt(limit),
|
|
});
|
|
// Enhance with emojis and formatted times
|
|
const enhancedReactions = reactions.map(r => ({
|
|
...r,
|
|
emoji: REACTION_EMOJIS[r.reactionType] || '❓',
|
|
formattedTime: formatVideoTime(r.videoTimestamp),
|
|
}));
|
|
return {
|
|
reactions: enhancedReactions,
|
|
};
|
|
});
|
|
// Get reaction config (returns available reactions)
|
|
fastify.get('/config', async (request, reply) => {
|
|
return {
|
|
reactions: Object.entries(REACTION_EMOJIS).map(([type, emoji]) => ({
|
|
type,
|
|
emoji,
|
|
label: type.charAt(0).toUpperCase() + type.slice(1),
|
|
})),
|
|
};
|
|
});
|
|
}
|
|
//# sourceMappingURL=reactions.routes.js.map
|