| | 1 | == Views == |
| | 2 | |
| | 3 | === 1) View for Approved Builds Page === |
| | 4 | |
| | 5 | **Purpose:** \\ |
| | 6 | -Shows all the approved builds built by users, sorted by price by default \\ |
| | 7 | -Calculates average ratings for each build, so the user can compare the builds with that metric. \\ |
| | 8 | -Includes all data needed for filtering (name search using the build names) and sorting (by price, rating and date). \\ |
| | 9 | {{{ |
| | 10 | CREATE OR REPLACE VIEW v_approved_builds_browse AS |
| | 11 | SELECT |
| | 12 | b.id, |
| | 13 | b.user_id, |
| | 14 | b.name, |
| | 15 | b.created_at, |
| | 16 | b.total_price, |
| | 17 | u.username AS creator_username, |
| | 18 | COUNT(DISTINCT fb.user_id) AS favorite_count, |
| | 19 | COUNT(DISTINCT rb.user_id) AS total_ratings, |
| | 20 | COALESCE(AVG(rb.value::float), 0) AS avg_rating, |
| | 21 | COUNT(DISTINCT r.id) AS review_count |
| | 22 | FROM build b |
| | 23 | JOIN users u ON u.id = b.user_id |
| | 24 | LEFT JOIN favorite_build fb ON fb.build_id = b.id |
| | 25 | LEFT JOIN rating_build rb ON rb.build_id = b.id |
| | 26 | LEFT JOIN review r ON r.build_id = b.id |
| | 27 | WHERE b.is_approved = TRUE |
| | 28 | GROUP BY b.id, b.user_id, b.name, b.created_at, b.total_price, u.username; |
| | 29 | }}} |
| | 30 | |
| | 31 | === 2) View for User Dashboard === |
| | 32 | **Purpose:** \\ |
| | 33 | -Shows the user's created builds with their metrics \\ |
| | 34 | -Shows the user's favorited builds from other creators \\ |
| | 35 | -Combines data from both queries to one view \\ |
| | 36 | -Includes average ratings for all the builds displayed \\ |
| | 37 | {{{ |
| | 38 | CREATE OR REPLACE VIEW v_user_dashboard_data AS |
| | 39 | WITH user_created_builds AS ( |
| | 40 | SELECT |
| | 41 | b.id AS build_id, |
| | 42 | b.user_id AS dashboard_user_id, |
| | 43 | b.user_id AS creator_id, |
| | 44 | u.username AS creator_username, |
| | 45 | b.name, |
| | 46 | b.created_at, |
| | 47 | b.total_price, |
| | 48 | b.is_approved, |
| | 49 | 'created' AS build_source, |
| | 50 | COALESCE(AVG(rb.value::float), 0) AS avg_rating, |
| | 51 | COUNT(DISTINCT rb.user_id) AS rating_count |
| | 52 | FROM build b |
| | 53 | JOIN users u ON u.id = b.user_id |
| | 54 | LEFT JOIN rating_build rb ON rb.build_id = b.id |
| | 55 | GROUP BY b.id, b.user_id, u.username, b.name, b.created_at, b.total_price, b.is_approved |
| | 56 | ), |
| | 57 | user_favorited_builds AS ( |
| | 58 | SELECT |
| | 59 | b.id AS build_id, |
| | 60 | fb.user_id AS dashboard_user_id, |
| | 61 | b.user_id AS creator_id, |
| | 62 | u.username AS creator_username, |
| | 63 | b.name, |
| | 64 | b.created_at, |
| | 65 | b.total_price, |
| | 66 | b.is_approved, |
| | 67 | 'favorited' AS build_source, |
| | 68 | COALESCE(AVG(rb.value::float), 0) AS avg_rating, |
| | 69 | COUNT(DISTINCT rb.user_id) AS rating_count |
| | 70 | FROM favorite_build fb |
| | 71 | JOIN build b ON b.id = fb.build_id |
| | 72 | JOIN users u ON u.id = b.user_id |
| | 73 | LEFT JOIN rating_build rb ON rb.build_id = b.id |
| | 74 | GROUP BY b.id, fb.user_id, b.user_id, u.username, b.name, b.created_at, b.total_price, b.is_approved |
| | 75 | ) |
| | 76 | SELECT * FROM user_created_builds |
| | 77 | UNION ALL |
| | 78 | SELECT * FROM user_favorited_builds; |
| | 79 | }}} |
| | 80 | |
| | 81 | === 3) View for Build Details Page === |
| | 82 | **Purpose:** \\ |
| | 83 | -Pre-joins build with the creator's username \\ |
| | 84 | -Aggregates rating statistics \\ |
| | 85 | -Counts reviews and favorites for the build \\ |
| | 86 | {{{ |
| | 87 | CREATE OR REPLACE VIEW v_build_details_summary AS |
| | 88 | SELECT |
| | 89 | b.id AS build_id, |
| | 90 | b.user_id, |
| | 91 | b.name, |
| | 92 | b.created_at, |
| | 93 | b.description, |
| | 94 | b.total_price, |
| | 95 | b.is_approved, |
| | 96 | u.username AS creator_username, |
| | 97 | COALESCE(AVG(rb.value::float), 0) AS average_rating, |
| | 98 | COUNT(DISTINCT rb.user_id) AS rating_count, |
| | 99 | COUNT(DISTINCT r.id) AS review_count, |
| | 100 | COUNT(DISTINCT fb.user_id) AS favorite_count |
| | 101 | FROM build b |
| | 102 | JOIN users u ON u.id = b.user_id |
| | 103 | LEFT JOIN rating_build rb ON rb.build_id = b.id |
| | 104 | LEFT JOIN review r ON r.build_id = b.id |
| | 105 | LEFT JOIN favorite_build fb ON fb.build_id = b.id |
| | 106 | GROUP BY b.id, b.user_id, b.name, b.created_at, b.description, |
| | 107 | b.total_price, b.is_approved, u.username; |
| | 108 | }}} |
| | 109 | |
| | 110 | === 4) View for Admin Dashboard === |
| | 111 | **Purpose:** \\ |
| | 112 | -Shows component and build suggestions waiting for approval or rejection \\ |
| | 113 | -Shows user information for both builds and components \\ |
| | 114 | -Provides data for the admin verification queue \\ |
| | 115 | {{{ |
| | 116 | CREATE OR REPLACE VIEW v_admin_pending_items AS |
| | 117 | WITH pending_builds AS ( |
| | 118 | SELECT |
| | 119 | b.id, |
| | 120 | 'build' AS item_type, |
| | 121 | b.user_id, |
| | 122 | u.username, |
| | 123 | u.email, |
| | 124 | b.name AS item_name, |
| | 125 | b.description, |
| | 126 | b.created_at AS submitted_date, |
| | 127 | b.total_price, |
| | 128 | NULL AS component_type, |
| | 129 | NULL AS link, |
| | 130 | 'pending' AS status |
| | 131 | FROM build b |
| | 132 | JOIN users u ON u.id = b.user_id |
| | 133 | WHERE b.is_approved = FALSE |
| | 134 | ), |
| | 135 | pending_suggestions AS ( |
| | 136 | SELECT |
| | 137 | s.id, |
| | 138 | 'suggestion' AS item_type, |
| | 139 | s.user_id, |
| | 140 | u.username, |
| | 141 | u.email, |
| | 142 | s.component_type AS item_name, |
| | 143 | s.description, |
| | 144 | NULL::DATE AS submitted_date, |
| | 145 | NULL::NUMERIC AS total_price, |
| | 146 | s.component_type, |
| | 147 | s.link, |
| | 148 | s.status |
| | 149 | FROM suggestions s |
| | 150 | JOIN users u ON u.id = s.user_id |
| | 151 | WHERE s.status = 'pending' |
| | 152 | ) |
| | 153 | SELECT * FROM pending_builds |
| | 154 | UNION ALL |
| | 155 | SELECT * FROM pending_suggestions |
| | 156 | ORDER BY item_type, id DESC; |
| | 157 | }}} |