Changeset c4dd17d for database/drizzle/queries/builds.ts
- Timestamp:
- 12/20/25 04:03:51 (7 months ago)
- Branches:
- main
- Children:
- 5ce5904
- Parents:
- 37bcb87
- File:
-
- 1 edited
-
database/drizzle/queries/builds.ts (modified) (8 diffs)
Legend:
- Unmodified
- Added
- Removed
-
database/drizzle/queries/builds.ts
r37bcb87 rc4dd17d 1 1 import type { Database } from "../db"; 2 import {buildComponentsTable, buildsTable, favoriteBuildsTable, ratingBuildsTable, reviewsTable} from "../schema"; 2 import { 3 buildComponentsTable, 4 buildsTable, 5 componentsTable, 6 favoriteBuildsTable, 7 ratingBuildsTable, 8 reviewsTable, usersTable 9 } from "../schema"; 3 10 import {eq, desc, and, sql, ilike} from "drizzle-orm"; 4 11 … … 72 79 73 80 export async function getApprovedBuilds(db: Database, limit?: number, q?: string) { 74 let queryConditions = [ ];81 let queryConditions = [eq(buildsTable.isApproved, true)]; 75 82 76 83 if (q) { … … 91 98 .where( 92 99 and ( 93 eq(buildsTable.isApproved, true),94 100 ...queryConditions 95 101 ) … … 110 116 name: buildsTable.name, 111 117 created_at: buildsTable.createdAt, 112 total_price: buildsTable.totalPrice 118 total_price: buildsTable.totalPrice, 119 avgRating: sql<number>`AVG(${ratingBuildsTable.value}::float)` 113 120 }) 114 121 .from(buildsTable) … … 120 127 eq(buildsTable.isApproved, true) 121 128 ) 122 .groupBy( 123 buildsTable.id 124 ) 129 .groupBy(buildsTable.id) 125 130 .orderBy( 126 131 desc(sql<number>`AVG(${ratingBuildsTable.value}::float)`) … … 131 136 } 132 137 133 export async function getBuildDetails(db: Database, buildId: number) { 134 const buildDetails = await db 135 .select() 136 .from(buildsTable) 137 .where( 138 eq(buildsTable.id, buildId) 139 ) 140 .limit(1); 141 142 return buildDetails[0] ?? null; 138 export async function getBuildDetails(db: Database, buildId: number, userId?: number) { 139 return db.transaction(async (tx) => { 140 const [buildDetails] = await tx 141 .select({ 142 id: buildsTable.id, 143 userId: buildsTable.userId, 144 name: buildsTable.name, 145 createdAt: buildsTable.createdAt, 146 description: buildsTable.description, 147 totalPrice: buildsTable.totalPrice, 148 isApproved: buildsTable.isApproved, 149 creator: usersTable.username 150 }) 151 .from(buildsTable) 152 .innerJoin( 153 usersTable, 154 eq(buildsTable.userId, usersTable.id) 155 ) 156 .where( 157 eq(buildsTable.id, buildId) 158 ) 159 .limit(1); 160 161 if (!buildDetails) return null; 162 163 const components = await tx 164 .select({ 165 componentId: buildComponentsTable.componentId, 166 component: componentsTable 167 }) 168 .from(buildComponentsTable) 169 .innerJoin( 170 componentsTable, 171 eq(buildComponentsTable.componentId, componentsTable.id) 172 ) 173 .where( 174 eq(buildComponentsTable.buildId, buildId) 175 ); 176 177 const reviews = await tx 178 .select({ 179 username: usersTable.username, 180 content: reviewsTable.content, 181 createdAt: reviewsTable.createdAt 182 }) 183 .from(reviewsTable) 184 .innerJoin( 185 usersTable, 186 eq(reviewsTable.userId, usersTable.id) 187 ) 188 .where( 189 eq(reviewsTable.buildId, buildId) 190 ) 191 .orderBy( 192 desc(reviewsTable.createdAt) 193 ); 194 195 let [ratingStatistics] = await tx 196 .select({ 197 averageRating: sql<number>`COALESCE(AVG(${ratingBuildsTable.value}::float), 0)`.as("averageRating"), 198 ratingCount: sql<number>`COUNT(${ratingBuildsTable.value})`.as("ratingCount") 199 }) 200 .from(ratingBuildsTable) 201 .where( 202 eq(ratingBuildsTable.buildId, buildId) 203 ) 204 .groupBy(ratingBuildsTable.buildId); 205 206 ratingStatistics = { 207 averageRating: Number(ratingStatistics?.averageRating ?? 0), 208 ratingCount: Number(ratingStatistics?.ratingCount ?? 0), 209 } 210 211 let userRating = null; 212 let isFavorite = false; 213 let userReview = null; 214 215 if(userId) { 216 const [rating] = await tx 217 .select() 218 .from(ratingBuildsTable) 219 .where( 220 and( 221 eq(ratingBuildsTable.buildId, buildId), 222 eq(ratingBuildsTable.userId, userId) 223 ) 224 ) 225 .limit(1); 226 227 userRating = rating?.value ? Number(rating.value) : null; 228 229 const [favorite] = await tx 230 .select() 231 .from(favoriteBuildsTable) 232 .where( 233 and( 234 eq(favoriteBuildsTable.buildId, buildId), 235 eq(favoriteBuildsTable.userId, userId) 236 ) 237 ) 238 .limit(1); 239 240 isFavorite = !!favorite; 241 242 const [review] = await tx 243 .select() 244 .from(reviewsTable) 245 .where( 246 and( 247 eq(reviewsTable.buildId, buildId), 248 eq(reviewsTable.userId, userId) 249 ) 250 ) 251 .limit(1); 252 253 userReview = review?.content; 254 } 255 256 return { 257 ...buildDetails, 258 components: components.map(c => c.component), 259 reviews: reviews, 260 ratingStatistics: ratingStatistics, 261 userRating, 262 userReview, 263 isFavorite 264 }; 265 }); 143 266 } 144 267 … … 184 307 userId, 185 308 buildId, 186 value: value .toString()309 value: value 187 310 }) 188 311 .onConflictDoUpdate({ 189 312 target: [ratingBuildsTable.userId, ratingBuildsTable.buildId], 190 313 set: { 191 value: value .toString(),314 value: value, 192 315 }, 193 316 }); … … 275 398 return newBuild.id; 276 399 } 277 278 279
Note:
See TracChangeset
for help on using the changeset viewer.
