Class: ReportScheduleRepository
Defined in: server/insights/report-schedule-repository.ts:295
Base repository providing transaction routing, audit-field helpers, and opt-in activity logging. Extend one of the specialized classes instead of using this directly:
ReadRepository— read-onlyWriteRepository— create + update (append-only)CrudRepository— full CRUD (most common)VersionRepository— parent-child versioning
TClient is the consumer's generated Prisma client (for model accessors on
this.tx). TTx is the transaction handle type (the inner argument of
prisma.$transaction(fn)); it defaults to TClient because modern Prisma
transaction handles are structurally compatible with the top-level client
apart from the $-prefixed control methods.
Extends
BaseRepository<PrismaClient,Tx<PrismaClient>>
Constructors
Constructor
new ReportScheduleRepository(prismaClient: PrismaClientLike<Tx<PrismaClient<PrismaClientOptions, never, DefaultArgs>>> & PrismaClient<PrismaClientOptions, never, DefaultArgs>, options?: RepositoryOptions): ReportScheduleRepository;Defined in: server/persistence/base-repository.ts:68
Parameters
| Parameter | Type |
|---|---|
prismaClient | PrismaClientLike<Tx<PrismaClient<PrismaClientOptions, never, DefaultArgs>>> & PrismaClient<PrismaClientOptions, never, DefaultArgs> |
options | RepositoryOptions |
Returns
ReportScheduleRepository
Inherited from
Properties
ENTITY_TYPE?
protected readonly optional ENTITY_TYPE?: string;Defined in: server/persistence/base-repository.ts:61
Set ENTITY_TYPE in child repositories to enable automatic activity
logging. When set, create/update/delete operations auto-log unless
silenced with .silent. Requires an activity model on the consumer's
Prisma schema.
Inherited from
logger?
protected readonly optional logger?: Logger;Defined in: server/persistence/base-repository.ts:64
Inherited from
prismaClient
protected prismaClient: PrismaClientLike<Tx<PrismaClient<PrismaClientOptions, never, DefaultArgs>>> & PrismaClient<PrismaClientOptions, never, DefaultArgs>;Defined in: server/persistence/base-repository.ts:69
Inherited from
Accessors
actorId
Get Signature
get protected actorId(): string | null | undefined;Defined in: server/persistence/base-repository.ts:76
Returns
string | null | undefined
Inherited from
auditCreate
Get Signature
get protected auditCreate(): {
createdBy: string | null | undefined;
updatedBy: string | null | undefined;
};Defined in: server/persistence/base-repository.ts:90
Returns
{
createdBy: string | null | undefined;
updatedBy: string | null | undefined;
}createdBy
createdBy: string | null | undefined = actorId;updatedBy
updatedBy: string | null | undefined = actorId;Inherited from
auditDelete
Get Signature
get protected auditDelete(): {
deletedAt: Date;
deletedBy: string | null | undefined;
};Defined in: server/persistence/base-repository.ts:99
Returns
{
deletedAt: Date;
deletedBy: string | null | undefined;
}deletedAt
deletedAt: Date;deletedBy
deletedBy: string | null | undefined;Inherited from
auditUpdate
Get Signature
get protected auditUpdate(): {
updatedBy: string | null | undefined;
};Defined in: server/persistence/base-repository.ts:95
Returns
{
updatedBy: string | null | undefined;
}updatedBy
updatedBy: string | null | undefined;Inherited from
silent
Get Signature
get silent(): this;Defined in: server/persistence/base-repository.ts:115
Suppress activity logging for the next mutation call. One-shot: the flag is consumed by the next create/update/delete.
Example
await repo.silent.update(id, data); // no activity logged
await repo.update(id, data); // activity logged normallyReturns
this
Inherited from
tx
Get Signature
get protected tx(): TTx;Defined in: server/persistence/base-repository.ts:86
The current Prisma handle: the active transaction if one is running on this async context, otherwise the raw client.
Returns
TTx
Inherited from
Methods
assertSchemaGenerated()
assertSchemaGenerated(): void;Defined in: server/insights/report-schedule-repository.ts:307
Fail fast if the consumer's Prisma client lacks either scheduling model.
Probed via property access (not in) so proxied per-test
transaction clients resolve — same rationale as
assertInsightsSchemaGenerated. Called from the scheduling service's
constructor so ONLY consumers who wire scheduling pay the requirement; the
base insights server does not.
Returns
void
consumeSilent()
protected consumeSilent(): boolean;Defined in: server/persistence/base-repository.ts:128
Consume and reset the silent flag. Called by template methods.
Returns
boolean
Inherited from
create()
create(input: {
config: | {
cadence: "daily";
format: "pdf" | "csv" | "xlsx";
recipients: string[];
timeOfDay: string;
timezone: string;
}
| {
cadence: "weekly";
format: "pdf" | "csv" | "xlsx";
recipients: string[];
timeOfDay: string;
timezone: string;
weekdays: number[];
}
| {
cadence: "monthly";
dayOfMonth: number | "last";
format: "pdf" | "csv" | "xlsx";
recipients: string[];
timeOfDay: string;
timezone: string;
}
| {
cadence: "custom";
cron: string;
format: "pdf" | "csv" | "xlsx";
recipients: string[];
timezone: string;
};
enabled?: boolean;
id?: string;
name?: string | null;
organizationId: string;
savedReportId: string;
userId: string;
}): Promise<ReportSchedule>;Defined in: server/insights/report-schedule-repository.ts:590
Parameters
| Parameter | Type |
|---|---|
input | { config: | { cadence: "daily"; format: "pdf" | "csv" | "xlsx"; recipients: string[]; timeOfDay: string; timezone: string; } | { cadence: "weekly"; format: "pdf" | "csv" | "xlsx"; recipients: string[]; timeOfDay: string; timezone: string; weekdays: number[]; } | { cadence: "monthly"; dayOfMonth: number | "last"; format: "pdf" | "csv" | "xlsx"; recipients: string[]; timeOfDay: string; timezone: string; } | { cadence: "custom"; cron: string; format: "pdf" | "csv" | "xlsx"; recipients: string[]; timezone: string; }; enabled?: boolean; id?: string; name?: string | null; organizationId: string; savedReportId: string; userId: string; } |
input.config | | { cadence: "daily"; format: "pdf" | "csv" | "xlsx"; recipients: string[]; timeOfDay: string; timezone: string; } | { cadence: "weekly"; format: "pdf" | "csv" | "xlsx"; recipients: string[]; timeOfDay: string; timezone: string; weekdays: number[]; } | { cadence: "monthly"; dayOfMonth: number | "last"; format: "pdf" | "csv" | "xlsx"; recipients: string[]; timeOfDay: string; timezone: string; } | { cadence: "custom"; cron: string; format: "pdf" | "csv" | "xlsx"; recipients: string[]; timezone: string; } |
input.enabled? | boolean |
input.id? | string |
input.name? | string | null |
input.organizationId | string |
input.savedReportId | string |
input.userId | string |
Returns
Promise<ReportSchedule>
createDashboard()
createDashboard(input: {
config: | {
cadence: "daily";
format: "pdf" | "csv" | "xlsx";
recipients: string[];
timeOfDay: string;
timezone: string;
}
| {
cadence: "weekly";
format: "pdf" | "csv" | "xlsx";
recipients: string[];
timeOfDay: string;
timezone: string;
weekdays: number[];
}
| {
cadence: "monthly";
dayOfMonth: number | "last";
format: "pdf" | "csv" | "xlsx";
recipients: string[];
timeOfDay: string;
timezone: string;
}
| {
cadence: "custom";
cron: string;
format: "pdf" | "csv" | "xlsx";
recipients: string[];
timezone: string;
};
dashboardKey: string;
enabled?: boolean;
id?: string;
name?: string | null;
organizationId: string;
userId: string;
view: {
bucket?: "year" | "month" | "day" | "week" | "quarter";
filters: Record<string,
| {
from: string;
kind: "date-range";
to: string | null;
}
| {
kind: "select";
values: string[];
}
| {
kind: "measure";
operator: "gt" | "lt" | "gte" | "lte" | "eq";
value: number;
}
| {
kind: "search";
text: string;
}
| undefined>;
range?: {
from: string;
to: string;
};
};
}): Promise<DashboardSchedule>;Defined in: server/insights/report-schedule-repository.ts:606
Parameters
| Parameter | Type |
|---|---|
input | { config: | { cadence: "daily"; format: "pdf" | "csv" | "xlsx"; recipients: string[]; timeOfDay: string; timezone: string; } | { cadence: "weekly"; format: "pdf" | "csv" | "xlsx"; recipients: string[]; timeOfDay: string; timezone: string; weekdays: number[]; } | { cadence: "monthly"; dayOfMonth: number | "last"; format: "pdf" | "csv" | "xlsx"; recipients: string[]; timeOfDay: string; timezone: string; } | { cadence: "custom"; cron: string; format: "pdf" | "csv" | "xlsx"; recipients: string[]; timezone: string; }; dashboardKey: string; enabled?: boolean; id?: string; name?: string | null; organizationId: string; userId: string; view: { bucket?: "year" | "month" | "day" | "week" | "quarter"; filters: Record<string, | { from: string; kind: "date-range"; to: string | null; } | { kind: "select"; values: string[]; } | { kind: "measure"; operator: "gt" | "lt" | "gte" | "lte" | "eq"; value: number; } | { kind: "search"; text: string; } | undefined>; range?: { from: string; to: string; }; }; } |
input.config | | { cadence: "daily"; format: "pdf" | "csv" | "xlsx"; recipients: string[]; timeOfDay: string; timezone: string; } | { cadence: "weekly"; format: "pdf" | "csv" | "xlsx"; recipients: string[]; timeOfDay: string; timezone: string; weekdays: number[]; } | { cadence: "monthly"; dayOfMonth: number | "last"; format: "pdf" | "csv" | "xlsx"; recipients: string[]; timeOfDay: string; timezone: string; } | { cadence: "custom"; cron: string; format: "pdf" | "csv" | "xlsx"; recipients: string[]; timezone: string; } |
input.dashboardKey | string |
input.enabled? | boolean |
input.id? | string |
input.name? | string | null |
input.organizationId | string |
input.userId | string |
input.view | { bucket?: "year" | "month" | "day" | "week" | "quarter"; filters: Record<string, | { from: string; kind: "date-range"; to: string | null; } | { kind: "select"; values: string[]; } | { kind: "measure"; operator: "gt" | "lt" | "gte" | "lte" | "eq"; value: number; } | { kind: "search"; text: string; } | undefined>; range?: { from: string; to: string; }; } |
input.view.bucket? | "year" | "month" | "day" | "week" | "quarter" |
input.view.filters | Record<string, | { from: string; kind: "date-range"; to: string | null; } | { kind: "select"; values: string[]; } | { kind: "measure"; operator: "gt" | "lt" | "gte" | "lte" | "eq"; value: number; } | { kind: "search"; text: string; } | undefined> |
input.view.range? | { from: string; to: string; } |
input.view.range.from | string |
input.view.range.to | string |
Returns
Promise<DashboardSchedule>
delete()
delete(input: {
id: string;
organizationId: string;
userId: string;
}): Promise<number>;Defined in: server/insights/report-schedule-repository.ts:736
Parameters
| Parameter | Type |
|---|---|
input | { id: string; organizationId: string; userId: string; } |
input.id | string |
input.organizationId | string |
input.userId | string |
Returns
Promise<number>
disableOrphaned()
disableOrphaned(input: {
id: string;
organizationId: string;
}): Promise<void>;Defined in: server/insights/report-schedule-repository.ts:828
Disable a schedule as a SYSTEM write (no owner check), used by the worker
when a fire discovers the underlying saved report is gone. Saved reports
are SOFT-deleted, so the ON DELETE CASCADE FK never fires for them and
the schedule would otherwise keep firing, failing, and retrying every
cadence. updateMany so it is a silent no-op if the row is already gone.
Parameters
| Parameter | Type |
|---|---|
input | { id: string; organizationId: string; } |
input.id | string |
input.organizationId | string |
Returns
Promise<void>
get()
get(input: {
id: string;
organizationId: string;
}): Promise<ReportSchedule>;Defined in: server/insights/report-schedule-repository.ts:433
Parameters
| Parameter | Type |
|---|---|
input | { id: string; organizationId: string; } |
input.id | string |
input.organizationId | string |
Returns
Promise<ReportSchedule>
getAuthorizationFields()
getAuthorizationFields(input: {
id: string;
organizationId: string;
}): Promise<{
createdBy: string | null;
savedReportId: string;
}>;Defined in: server/insights/report-schedule-repository.ts:465
Parent-report id for write authorization, without parsing stored config.
Parameters
| Parameter | Type |
|---|---|
input | { id: string; organizationId: string; } |
input.id | string |
input.organizationId | string |
Returns
Promise<{
createdBy: string | null;
savedReportId: string;
}>
getSchedulerState()
getSchedulerState(input: {
id: string;
organizationId: string;
}): Promise<ReportScheduleSchedulerState>;Defined in: server/insights/report-schedule-repository.ts:353
Config-safe projection used to fence Redis mutations and worker fires.
Parameters
| Parameter | Type |
|---|---|
input | { id: string; organizationId: string; } |
input.id | string |
input.organizationId | string |
Returns
Promise<ReportScheduleSchedulerState>
getTarget()
getTarget(input: {
id: string;
organizationId: string;
}): Promise<TargetedReportSchedule>;Defined in: server/insights/report-schedule-repository.ts:449
Target-neutral projection used by the shared delivery worker.
Parameters
| Parameter | Type |
|---|---|
input | { id: string; organizationId: string; } |
input.id | string |
input.organizationId | string |
Returns
Promise<TargetedReportSchedule>
getTargetAuthorizationFields()
getTargetAuthorizationFields(input: {
id: string;
organizationId: string;
}): Promise<ReportScheduleTargetAuthorizationFields>;Defined in: server/insights/report-schedule-repository.ts:482
Target identity for authorization, without parsing config or dashboard view.
Parameters
| Parameter | Type |
|---|---|
input | { id: string; organizationId: string; } |
input.id | string |
input.organizationId | string |
Returns
Promise<ReportScheduleTargetAuthorizationFields>
list()
list(input: {
organizationId: string;
savedReportId?: string;
}): Promise<ReportSchedule[]>;Defined in: server/insights/report-schedule-repository.ts:395
Parameters
| Parameter | Type |
|---|---|
input | { organizationId: string; savedReportId?: string; } |
input.organizationId | string |
input.savedReportId? | string |
Returns
Promise<ReportSchedule[]>
listDashboard()
listDashboard(input: {
dashboardKey?: string;
organizationId: string;
userId: string;
}): Promise<DashboardSchedule[]>;Defined in: server/insights/report-schedule-repository.ts:413
Parameters
| Parameter | Type |
|---|---|
input | { dashboardKey?: string; organizationId: string; userId: string; } |
input.dashboardKey? | string |
input.organizationId | string |
input.userId | string |
Returns
Promise<DashboardSchedule[]>
listEnabledForReconcile()
listEnabledForReconcile(organizationId?: string): Promise<{
config: | {
cadence: "daily";
format: "pdf" | "csv" | "xlsx";
recipients: string[];
timeOfDay: string;
timezone: string;
}
| {
cadence: "weekly";
format: "pdf" | "csv" | "xlsx";
recipients: string[];
timeOfDay: string;
timezone: string;
weekdays: number[];
}
| {
cadence: "monthly";
dayOfMonth: number | "last";
format: "pdf" | "csv" | "xlsx";
recipients: string[];
timeOfDay: string;
timezone: string;
}
| {
cadence: "custom";
cron: string;
format: "pdf" | "csv" | "xlsx";
recipients: string[];
timezone: string;
};
id: string;
organizationId: string;
}[]>;Defined in: server/insights/report-schedule-repository.ts:851
Enabled, non-deleted schedules for one organization, or across every org
when organizationId is omitted. RLS-backed reconciliation always passes
an organization and pins that tenant's GUC; the global form is retained for
RLS-exempt system clients and backwards compatibility.
Rows whose stored config no longer parses are SKIPPED (not thrown) — a
corrupt row cannot yield a cron, and one bad row must not abort the whole
reconcile. The return carries only what registration needs.
Parameters
| Parameter | Type |
|---|---|
organizationId? | string |
Returns
Promise<{
config: | {
cadence: "daily";
format: "pdf" | "csv" | "xlsx";
recipients: string[];
timeOfDay: string;
timezone: string;
}
| {
cadence: "weekly";
format: "pdf" | "csv" | "xlsx";
recipients: string[];
timeOfDay: string;
timezone: string;
weekdays: number[];
}
| {
cadence: "monthly";
dayOfMonth: number | "last";
format: "pdf" | "csv" | "xlsx";
recipients: string[];
timeOfDay: string;
timezone: string;
}
| {
cadence: "custom";
cron: string;
format: "pdf" | "csv" | "xlsx";
recipients: string[];
timezone: string;
};
id: string;
organizationId: string;
}[]>
listRuns()
listRuns(input: {
id: string;
organizationId: string;
}): Promise<InsightScheduleRunSummary[]>;Defined in: server/insights/report-schedule-repository.ts:806
Parameters
| Parameter | Type |
|---|---|
input | { id: string; organizationId: string; } |
input.id | string |
input.organizationId | string |
Returns
Promise<InsightScheduleRunSummary[]>
logActivity()
protected logActivity(
_entityId: string,
_action: string,
_metadata?: Record<string, unknown>
): Promise<void>;Defined in: server/persistence/base-repository.ts:140
Log an activity entry.
NOTE: This is not implemented because there's no activity model implemented in taproot yet! https://linear.app/kaizenlabs/issue/ENG-7846/add-activity-log-tables
Parameters
| Parameter | Type |
|---|---|
_entityId | string |
_action | string |
_metadata? | Record<string, unknown> |
Returns
Promise<void>
Inherited from
recordRun()
recordRun(input: {
attachmentFilename?: string | null;
error?: string | null;
id: string;
mutationVersion?: number;
organizationId: string;
ranAt: Date;
recipientEmails?: string[];
status: "success" | "failed";
trigger?: "manual" | "scheduled";
}): Promise<void>;Defined in: server/insights/report-schedule-repository.ts:755
Record the outcome of a delivery attempt. The WORKER's system-actor write —
no userId, no ownership check. Uses updateMany so a run that finishes
after the schedule was deleted, or after a newer attempt recorded health,
is a silent no-op rather than a throw.
Parameters
| Parameter | Type | Description |
|---|---|---|
input | { attachmentFilename?: string | null; error?: string | null; id: string; mutationVersion?: number; organizationId: string; ranAt: Date; recipientEmails?: string[]; status: "success" | "failed"; trigger?: "manual" | "scheduled"; } | - |
input.attachmentFilename? | string | null | - |
input.error? | string | null | - |
input.id | string | - |
input.mutationVersion? | number | Only record a job that still belongs to this schedule generation. |
input.organizationId | string | - |
input.ranAt | Date | - |
input.recipientEmails? | string[] | - |
input.status | "success" | "failed" | - |
input.trigger? | "manual" | "scheduled" | - |
Returns
Promise<void>
setEnabled()
setEnabled(input: {
enabled: boolean;
id: string;
organizationId: string;
userId: string;
}): Promise<number>;Defined in: server/insights/report-schedule-repository.ts:720
Parameters
| Parameter | Type |
|---|---|
input | { enabled: boolean; id: string; organizationId: string; userId: string; } |
input.enabled | boolean |
input.id | string |
input.organizationId | string |
input.userId | string |
Returns
Promise<number>
update()
update(input: {
config: | {
cadence: "daily";
format: "pdf" | "csv" | "xlsx";
recipients: string[];
timeOfDay: string;
timezone: string;
}
| {
cadence: "weekly";
format: "pdf" | "csv" | "xlsx";
recipients: string[];
timeOfDay: string;
timezone: string;
weekdays: number[];
}
| {
cadence: "monthly";
dayOfMonth: number | "last";
format: "pdf" | "csv" | "xlsx";
recipients: string[];
timeOfDay: string;
timezone: string;
}
| {
cadence: "custom";
cron: string;
format: "pdf" | "csv" | "xlsx";
recipients: string[];
timezone: string;
};
id: string;
name?: string | null;
organizationId: string;
userId: string;
}): Promise<ReportSchedule>;Defined in: server/insights/report-schedule-repository.ts:670
Parameters
| Parameter | Type |
|---|---|
input | { config: | { cadence: "daily"; format: "pdf" | "csv" | "xlsx"; recipients: string[]; timeOfDay: string; timezone: string; } | { cadence: "weekly"; format: "pdf" | "csv" | "xlsx"; recipients: string[]; timeOfDay: string; timezone: string; weekdays: number[]; } | { cadence: "monthly"; dayOfMonth: number | "last"; format: "pdf" | "csv" | "xlsx"; recipients: string[]; timeOfDay: string; timezone: string; } | { cadence: "custom"; cron: string; format: "pdf" | "csv" | "xlsx"; recipients: string[]; timezone: string; }; id: string; name?: string | null; organizationId: string; userId: string; } |
input.config | | { cadence: "daily"; format: "pdf" | "csv" | "xlsx"; recipients: string[]; timeOfDay: string; timezone: string; } | { cadence: "weekly"; format: "pdf" | "csv" | "xlsx"; recipients: string[]; timeOfDay: string; timezone: string; weekdays: number[]; } | { cadence: "monthly"; dayOfMonth: number | "last"; format: "pdf" | "csv" | "xlsx"; recipients: string[]; timeOfDay: string; timezone: string; } | { cadence: "custom"; cron: string; format: "pdf" | "csv" | "xlsx"; recipients: string[]; timezone: string; } |
input.id | string |
input.name? | string | null |
input.organizationId | string |
input.userId | string |
Returns
Promise<ReportSchedule>
updateDashboard()
updateDashboard(input: {
config: | {
cadence: "daily";
format: "pdf" | "csv" | "xlsx";
recipients: string[];
timeOfDay: string;
timezone: string;
}
| {
cadence: "weekly";
format: "pdf" | "csv" | "xlsx";
recipients: string[];
timeOfDay: string;
timezone: string;
weekdays: number[];
}
| {
cadence: "monthly";
dayOfMonth: number | "last";
format: "pdf" | "csv" | "xlsx";
recipients: string[];
timeOfDay: string;
timezone: string;
}
| {
cadence: "custom";
cron: string;
format: "pdf" | "csv" | "xlsx";
recipients: string[];
timezone: string;
};
id: string;
name?: string | null;
organizationId: string;
userId: string;
}): Promise<DashboardSchedule>;Defined in: server/insights/report-schedule-repository.ts:691
Parameters
| Parameter | Type |
|---|---|
input | { config: | { cadence: "daily"; format: "pdf" | "csv" | "xlsx"; recipients: string[]; timeOfDay: string; timezone: string; } | { cadence: "weekly"; format: "pdf" | "csv" | "xlsx"; recipients: string[]; timeOfDay: string; timezone: string; weekdays: number[]; } | { cadence: "monthly"; dayOfMonth: number | "last"; format: "pdf" | "csv" | "xlsx"; recipients: string[]; timeOfDay: string; timezone: string; } | { cadence: "custom"; cron: string; format: "pdf" | "csv" | "xlsx"; recipients: string[]; timezone: string; }; id: string; name?: string | null; organizationId: string; userId: string; } |
input.config | | { cadence: "daily"; format: "pdf" | "csv" | "xlsx"; recipients: string[]; timeOfDay: string; timezone: string; } | { cadence: "weekly"; format: "pdf" | "csv" | "xlsx"; recipients: string[]; timeOfDay: string; timezone: string; weekdays: number[]; } | { cadence: "monthly"; dayOfMonth: number | "last"; format: "pdf" | "csv" | "xlsx"; recipients: string[]; timeOfDay: string; timezone: string; } | { cadence: "custom"; cron: string; format: "pdf" | "csv" | "xlsx"; recipients: string[]; timezone: string; } |
input.id | string |
input.name? | string | null |
input.organizationId | string |
input.userId | string |
Returns
Promise<DashboardSchedule>
withMutationLock()
withMutationLock<T>(input: {
id: string;
organizationId: string;
}, operation: () => Promise<T>): Promise<T>;Defined in: server/insights/report-schedule-repository.ts:334
Serialize one schedule's DATABASE mutation phase.
A transaction-scoped Postgres advisory lock has no expiring lease: another
process cannot enter while the callback is still running, and a crashed
process releases both its connection and lock automatically. BullMQ must
NEVER be called inside operation: the committed row (and its monotonic
mutationVersion fence) is the source of truth, then Redis is reconciled
after this transaction releases its shared-pool connection.
Type Parameters
| Type Parameter |
|---|
T |
Parameters
| Parameter | Type |
|---|---|
input | { id: string; organizationId: string; } |
input.id | string |
input.organizationId | string |
operation | () => Promise<T> |
Returns
Promise<T>