Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions server/app.js
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@ import commentRouter from './routes/comment.route.js';
import profileRouter from './routes/features/profile.route.js';
import movieRouter from './routes/movie.route.js';
import tmdbRouter from './routes/tmdb.routes.js';
import shareRouter from './routes/features/generateReviewImage.route.js';
import "./cron/trending.cron.js";
import { fetchAndStoreTrending } from './services/trending.service.js';
import { fetchAndStoreTopRated } from './services/topRated.service.js';
Expand All @@ -38,6 +39,7 @@ app.use(`${BASE_URL}/movies`, tmdbRouter);
app.use(`${BASE_URL}/movies`, movieRouter);
app.use(`${BASE_URL}/history`, historyRouter);
app.use(`${BASE_URL}/watchlist`, watchListRouter);
app.use(`${BASE_URL}`, shareRouter);
app.use(`${BASE_URL}`, profileRouter);
app.use(`${BASE_URL}`, commentRouter);
app.use(`${BASE_URL}`, reviewRouter);
Expand Down
3 changes: 3 additions & 0 deletions server/config/env.js
Original file line number Diff line number Diff line change
Expand Up @@ -5,10 +5,13 @@ config({ path: `.env.${env}.local` });
export const {
PORT,
BASE_URL,
CLIENT_URL,
NODE_ENV,
DB_URI,
JWT_SECRET,
JWT_EXPIRES_IN,
TMDB_BASE_URL,
TMDB_BACKDROP_BASE_URL,
TMDB_POSTER_BASE_URL,
TMDB_KEY
} = process.env;
53 changes: 53 additions & 0 deletions server/controllers/features/generateReviewImage.controller.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,53 @@
import generateReviewImage from '../../utils/generateReviewImage.util.js';
import Review from '../../models/review.model.js';
import History from '../../models/history.model.js';
import { CLIENT_URL, TMDB_BACKDROP_BASE_URL, TMDB_POSTER_BASE_URL } from '../../config/env.js';

export const shareReviewImage = async (req, res) => {
try {
const { reviewId } = req.params;
const clientURL = CLIENT_URL;

const review = await Review.findById(reviewId)
.populate('movieId', '_id title posterPath backdropPath releaseDate genreNames')
.populate('userId', '_id firstName lastName pfp');

if (!review) {
return res.status(404).json({
success: false,
error: "Review not found"
});
}

const history = await History.findOne({ userId: review.userId._id, movieId: review.movieId._id });

const reviewLink = `${clientURL}/reviews/${reviewId}`;

const imageBuffer = await generateReviewImage({
backdropUrl: TMDB_BACKDROP_BASE_URL + review.movieId.backdropPath,
posterUrl: TMDB_POSTER_BASE_URL + review.movieId.posterPath,
title: review.movieId.title,
genres: review.movieId.genreNames,
year: review.movieId.releaseDate ? review.movieId.releaseDate.split("-")[0] : "N/A",
reviewText: review.review,
likeCount: review.likedBy.length.toString(),
username: review.userId.firstName + " " + review.userId.lastName,
userAvatarUrl: review.userId.pfp,
rating: history.rating ? history.rating.toString() : "0",
reviewDate: review.createdAt.toDateString().split(" ").slice(1, 3).join(" ") + ", " + review.createdAt.getFullYear(),
linkToReview: reviewLink
});

res.set('Content-Type', 'image/png');
res.set(`Content-Disposition`, `attachment; filename="${reviewId}.png"`);
res.send(imageBuffer);

} catch (error) {
console.error("Share review image error:", error);

return res.status(500).json({
success: false,
error: error.message,
});
}
}
Loading
Loading