Skip to main content

Database Queries Reference

The lib/db/queries/ directory contains 23+ query modules organized by domain. Each module encapsulates Drizzle ORM queries for a specific feature area, following the Single Responsibility Principle.

Module Overview

All query modules are barrel-exported from lib/db/queries/index.ts for convenient importing:

import { getUser, getUserByEmail } from '@/lib/db/queries';

Query Modules

activity.queries.ts

Activity logging and retrieval for the audit trail system.

Key Functions:

  • Log user activities (sign-in, sign-up, account changes)
  • Query activity history by user or date range

auth.queries.ts

Authentication-related database operations.

Key Functions:

  • Find user by email for credential authentication
  • Create and verify password reset tokens
  • Manage verification tokens

client.queries.ts

The largest query module (37KB), handling all client-facing operations.

Key Functions:

  • Client profile CRUD operations
  • Client item submissions and management
  • Client dashboard data aggregation
  • Search and filter client data
  • Paginated listing queries

comment.queries.ts

Comment system operations.

Key Functions:

  • Create, update, and soft-delete comments
  • Fetch comments by item with pagination
  • Comment moderation queries (admin)
  • Rating aggregation

company.queries.ts

Company management queries.

Key Functions:

  • Company CRUD operations
  • Company search and filtering
  • Item-company association management
  • Company statistics and analytics

dashboard.queries.ts

Dashboard data aggregation for both admin and client dashboards.

Key Functions:

  • Admin dashboard statistics (total users, items, revenue)
  • Client dashboard statistics (submissions, views, engagement)
  • Time-series data for charts
  • Activity summaries

engagement.queries.ts

Aggregated engagement metrics across views, votes, favorites, and comments.

Key Functions:

  • Get engagement scores for items
  • Aggregate view counts
  • Calculate popularity metrics
  • Engagement rankings

integration-mapping.queries.ts

CRM integration mapping operations.

Key Functions:

  • Create and update integration mappings
  • Look up CRM IDs from Ever IDs and vice versa
  • Track sync timestamps and version hashes
  • Bulk mapping operations

item.queries.ts

Core item queries (items are stored in Git, but metadata is tracked in the database).

Key Functions:

  • Item metadata operations
  • Item view tracking
  • Item engagement data

item-audit.queries.ts

Item audit log operations.

Key Functions:

  • Record item creation, update, deletion, and review actions
  • Query audit history for specific items
  • Filter audit logs by action type, performer, or date range

item-view.queries.ts

Item view tracking and analytics.

Key Functions:

  • Record unique daily views (deduplicated by viewer ID and date)
  • Query view counts by item and date range
  • View analytics aggregation

location-index.queries.ts

Location-based search and indexing.

Key Functions:

  • Geospatial queries for nearby items
  • Location index management
  • Distance calculations
  • Location-based search with filters

moderation.queries.ts

Content moderation system.

Key Functions:

  • Create and manage content reports
  • Update report status and resolution
  • Record moderation actions
  • Moderation statistics and queue management

newsletter.queries.ts

Newsletter subscription management.

Key Functions:

  • Subscribe and unsubscribe operations
  • Check subscription status
  • List active subscribers
  • Track email send history

payment.queries.ts

Payment-related database operations.

Key Functions:

  • Payment provider management
  • Payment account linking
  • Transaction recording
  • Payment history queries

report.queries.ts

Content reporting system queries.

Key Functions:

  • Create reports (item or comment)
  • List reports with filters and pagination
  • Update report status
  • Report analytics

subscription.queries.ts

Subscription lifecycle management (17KB).

Key Functions:

  • Create and update subscriptions
  • Subscription status transitions
  • Subscription history recording
  • Find subscriptions by user or provider ID
  • Renewal and cancellation operations
  • Subscription analytics

survey.queries.ts

Survey system operations.

Key Functions:

  • Survey CRUD operations
  • Survey response recording
  • Response aggregation and analytics
  • Survey status management (draft, published, closed)

user.queries.ts

User management queries.

Key Functions:

  • User CRUD operations
  • User search and filtering
  • User role management
  • Account deletion (soft delete)

vote.queries.ts

Voting system operations.

Key Functions:

  • Create, update, and remove votes
  • Check existing votes for a user-item pair
  • Aggregate vote counts by item
  • Vote type toggling (upvote/downvote)

Shared Utilities

types.ts

Shared TypeScript types used across query modules:

// Common query parameter types
export interface PaginationParams {
page: number;
limit: number;
}

utils.ts

Shared utility functions for query building:

  • Pagination helpers (offset calculation, result formatting)
  • Common filter builders
  • SQL fragment helpers

Query Patterns

Standard Query Pattern

All query modules follow a consistent pattern:

import { db } from '../drizzle';
import { eq, desc, and, sql } from 'drizzle-orm';
import { tableName } from '../schema';

export async function getItemById(id: string) {
const result = await db
.select()
.from(tableName)
.where(eq(tableName.id, id))
.limit(1);
return result[0] || null;
}

Paginated Queries

Many modules implement paginated queries:

export async function getItems(page: number, limit: number) {
const offset = (page - 1) * limit;
const [items, countResult] = await Promise.all([
db.select().from(tableName)
.orderBy(desc(tableName.createdAt))
.limit(limit)
.offset(offset),
db.select({ count: sql<number>`count(*)` })
.from(tableName),
]);
return {
items,
total: Number(countResult[0].count),
page,
limit,
};
}

Aggregation Queries

The engagement and dashboard modules use SQL aggregation:

export async function getEngagementScore(itemId: string) {
const result = await db.execute(sql`
SELECT
COALESCE(v.vote_count, 0) as votes,
COALESCE(c.comment_count, 0) as comments,
COALESCE(f.favorite_count, 0) as favorites,
COALESCE(iv.view_count, 0) as views
FROM ...
`);
return result;
}

Import Convention

Import query functions through the barrel export:

// Preferred: import from barrel
import { getUser, createSubscription, getVotesByItem } from '@/lib/db/queries';

// Also valid: import from specific module
import { getUser } from '@/lib/db/queries/user.queries';