task-managment / src / helpers / query.ts
query.ts
Raw
import {
  desc,
  eq,
  is,
  or,
  SQL,
  sql,
  type AnyColumn,
  type InferSelectModel,
} from "drizzle-orm";
import { PgTimestampString, type SelectedFields } from "drizzle-orm/pg-core";
import { type SelectResultFields } from "../../node_modules//drizzle-orm/query-builders/select.types";
import { db } from "@/database/db";
import { project, task } from "@/database/schema";

export  function distinctOn<Column extends AnyColumn>(column: Column) {
    return sql<Column["_"]["data"]>`distinct on (${column}) ${column}`;
  }


  export function jsonBuildObject<T extends SelectedFields>(shape: T) {
    const chunks: SQL[] = [];

    Object.entries(shape).forEach(([key, value]) => {
      if (chunks.length > 0) {
        chunks.push(sql.raw(`,`));
      }

      chunks.push(sql.raw(`'${key}',`));

      // json_build_object formats to ISO 8601 ...
      if (is(value, PgTimestampString)) {
        chunks.push(sql`timezone('UTC', ${value})`);
      } else {
        chunks.push(sql`${value}`);
      }
    });

    return sql<SelectResultFields<T>>`coalesce(json_build_object(${sql.join(
      chunks
    )}), '{}')`;
  }

  export function jsonAggBuildObject<T extends SelectedFields>(shape: T) {
    return sql<SelectResultFields<T>[]>`coalesce(jsonb_agg(${jsonBuildObject(
      shape
    )}), '${sql`[]`}')`;
  }