believer/movies-graphql-postgres

View on GitHub
lib/graphql/resolvers/queries/feed.js

Summary

Maintainability
A
0 mins
Test Coverage
const { movieLaterals, movieSelects } = require('../../../utils/helpers')
const { verifyToken } = require('../../../services/token')

module.exports = async (_, { limit, offset }, { db, token }) => {
  try {
    const user = await verifyToken(token)

    const sql = `
      SELECT 
        distinct on (m.id, v.view_date) m.*, 
        rate.rating,
        views.views,
        usr.user,
        ${movieSelects}
      FROM
        (
          SELECT 
          ARRAY (
            SELECT 
              u.id 
            FROM 
              friends AS f 
              INNER JOIN users AS u ON u.id = f.friend_id 
            WHERE 
              user_id = ${user.id}
          ) as friends_ids
        ) as friends, 
        LATERAL (
          SELECT * 
          FROM views 
          WHERE user_id = ${user.id} OR user_id = ANY(friends.friends_ids)
          ORDER BY view_date DESC
          OFFSET ${offset} 
          LIMIT ${limit}
        ) as v, 
        LATERAL (
          SELECT *,
          EXTRACT(YEAR FROM release_date) as year
          FROM movies WHERE id = v.movie_id
        ) as m, 
        LATERAL (
          SELECT
            jsonb_build_object(
              'id', id,
              'name', name,
              'email', email) as user
          FROM users WHERE id = v.user_id
        ) as usr,
        LATERAL (
          SELECT rating
          FROM ratings
          WHERE movie_id = v.movie_id AND user_id = v.user_id
        ) as rate,
        LATERAL (
          SELECT 
          ARRAY (
            SELECT to_char(view_date, 'YYYY-MM-DD HH24:MI:SS')
            FROM views 
            WHERE 
              movie_id = v.movie_id 
              AND user_id = v.user_id
          ) as views
        ) as views, 
        ${movieLaterals}
      ORDER BY 
        v.view_date DESC
    `

    return await db.query(sql)
  } catch (e) {
    throw new Error(e)
  }
}