fix: auto-migrate after DB restore and force re-login

- After importing a backup, run prisma migrate deploy so any schema
  migrations the backup is missing are applied automatically. This
  prevents pages from failing due to missing tables/columns when the
  backup was taken on an older version of the app.
- Force logout and redirect to login after a successful restore so the
  JWT is refreshed against the restored database (prevents userId
  mismatch causing user-scoped queries to return empty results).
- Fix getTotalPatientCount() in /status route to pass userId so it
  counts only the current user's patients instead of all patients.
- Add prisma.$connect() after $disconnect() to ensure a clean reconnect.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
ff
2026-05-17 22:31:12 -04:00
parent b9e888fc7f
commit 5508a90d28
231 changed files with 1629 additions and 14854 deletions

View File

@@ -11,7 +11,6 @@ export const UserAggregateResultSchema = z.object({ _count: z.object({
npiProviders: z.number(),
claims: z.number(),
insuranceCredentials: z.number(),
shoppingVendors: z.number(),
updatedPayments: z.number(),
backups: z.number(),
backupDestinations: z.number(),
@@ -23,9 +22,7 @@ export const UserAggregateResultSchema = z.object({ _count: z.object({
aiSettings: z.number(),
officeHours: z.number(),
officeContact: z.number(),
procedureTimeslot: z.number(),
insuranceContacts: z.number(),
patientConversations: z.number()
procedureTimeslot: z.number()
}).optional(),
_sum: z.object({
id: z.number().nullable()

View File

@@ -11,7 +11,6 @@ export const UserCreateResultSchema = z.object({
npiProviders: z.array(z.unknown()),
claims: z.array(z.unknown()),
insuranceCredentials: z.array(z.unknown()),
shoppingVendors: z.array(z.unknown()),
updatedPayments: z.array(z.unknown()),
backups: z.array(z.unknown()),
backupDestinations: z.array(z.unknown()),
@@ -23,7 +22,5 @@ export const UserCreateResultSchema = z.object({
aiSettings: z.unknown().optional(),
officeHours: z.unknown().optional(),
officeContact: z.unknown().optional(),
procedureTimeslot: z.unknown().optional(),
insuranceContacts: z.array(z.unknown()),
patientConversations: z.array(z.unknown())
procedureTimeslot: z.unknown().optional()
});

View File

@@ -11,7 +11,6 @@ export const UserDeleteResultSchema = z.nullable(z.object({
npiProviders: z.array(z.unknown()),
claims: z.array(z.unknown()),
insuranceCredentials: z.array(z.unknown()),
shoppingVendors: z.array(z.unknown()),
updatedPayments: z.array(z.unknown()),
backups: z.array(z.unknown()),
backupDestinations: z.array(z.unknown()),
@@ -23,7 +22,5 @@ export const UserDeleteResultSchema = z.nullable(z.object({
aiSettings: z.unknown().optional(),
officeHours: z.unknown().optional(),
officeContact: z.unknown().optional(),
procedureTimeslot: z.unknown().optional(),
insuranceContacts: z.array(z.unknown()),
patientConversations: z.array(z.unknown())
procedureTimeslot: z.unknown().optional()
}));

View File

@@ -11,7 +11,6 @@ export const UserFindFirstResultSchema = z.nullable(z.object({
npiProviders: z.array(z.unknown()),
claims: z.array(z.unknown()),
insuranceCredentials: z.array(z.unknown()),
shoppingVendors: z.array(z.unknown()),
updatedPayments: z.array(z.unknown()),
backups: z.array(z.unknown()),
backupDestinations: z.array(z.unknown()),
@@ -23,7 +22,5 @@ export const UserFindFirstResultSchema = z.nullable(z.object({
aiSettings: z.unknown().optional(),
officeHours: z.unknown().optional(),
officeContact: z.unknown().optional(),
procedureTimeslot: z.unknown().optional(),
insuranceContacts: z.array(z.unknown()),
patientConversations: z.array(z.unknown())
procedureTimeslot: z.unknown().optional()
}));

View File

@@ -12,7 +12,6 @@ export const UserFindManyResultSchema = z.object({
npiProviders: z.array(z.unknown()),
claims: z.array(z.unknown()),
insuranceCredentials: z.array(z.unknown()),
shoppingVendors: z.array(z.unknown()),
updatedPayments: z.array(z.unknown()),
backups: z.array(z.unknown()),
backupDestinations: z.array(z.unknown()),
@@ -24,9 +23,7 @@ export const UserFindManyResultSchema = z.object({
aiSettings: z.unknown().optional(),
officeHours: z.unknown().optional(),
officeContact: z.unknown().optional(),
procedureTimeslot: z.unknown().optional(),
insuranceContacts: z.array(z.unknown()),
patientConversations: z.array(z.unknown())
procedureTimeslot: z.unknown().optional()
})),
pagination: z.object({
page: z.number().int().min(1),

View File

@@ -11,7 +11,6 @@ export const UserFindUniqueResultSchema = z.nullable(z.object({
npiProviders: z.array(z.unknown()),
claims: z.array(z.unknown()),
insuranceCredentials: z.array(z.unknown()),
shoppingVendors: z.array(z.unknown()),
updatedPayments: z.array(z.unknown()),
backups: z.array(z.unknown()),
backupDestinations: z.array(z.unknown()),
@@ -23,7 +22,5 @@ export const UserFindUniqueResultSchema = z.nullable(z.object({
aiSettings: z.unknown().optional(),
officeHours: z.unknown().optional(),
officeContact: z.unknown().optional(),
procedureTimeslot: z.unknown().optional(),
insuranceContacts: z.array(z.unknown()),
patientConversations: z.array(z.unknown())
procedureTimeslot: z.unknown().optional()
}));

View File

@@ -17,7 +17,6 @@ export const UserGroupByResultSchema = z.array(z.object({
npiProviders: z.number(),
claims: z.number(),
insuranceCredentials: z.number(),
shoppingVendors: z.number(),
updatedPayments: z.number(),
backups: z.number(),
backupDestinations: z.number(),
@@ -29,9 +28,7 @@ export const UserGroupByResultSchema = z.array(z.object({
aiSettings: z.number(),
officeHours: z.number(),
officeContact: z.number(),
procedureTimeslot: z.number(),
insuranceContacts: z.number(),
patientConversations: z.number()
procedureTimeslot: z.number()
}).optional(),
_sum: z.object({
id: z.number().nullable()

View File

@@ -11,7 +11,6 @@ export const UserUpdateResultSchema = z.nullable(z.object({
npiProviders: z.array(z.unknown()),
claims: z.array(z.unknown()),
insuranceCredentials: z.array(z.unknown()),
shoppingVendors: z.array(z.unknown()),
updatedPayments: z.array(z.unknown()),
backups: z.array(z.unknown()),
backupDestinations: z.array(z.unknown()),
@@ -23,7 +22,5 @@ export const UserUpdateResultSchema = z.nullable(z.object({
aiSettings: z.unknown().optional(),
officeHours: z.unknown().optional(),
officeContact: z.unknown().optional(),
procedureTimeslot: z.unknown().optional(),
insuranceContacts: z.array(z.unknown()),
patientConversations: z.array(z.unknown())
procedureTimeslot: z.unknown().optional()
}));

View File

@@ -11,7 +11,6 @@ export const UserUpsertResultSchema = z.object({
npiProviders: z.array(z.unknown()),
claims: z.array(z.unknown()),
insuranceCredentials: z.array(z.unknown()),
shoppingVendors: z.array(z.unknown()),
updatedPayments: z.array(z.unknown()),
backups: z.array(z.unknown()),
backupDestinations: z.array(z.unknown()),
@@ -23,7 +22,5 @@ export const UserUpsertResultSchema = z.object({
aiSettings: z.unknown().optional(),
officeHours: z.unknown().optional(),
officeContact: z.unknown().optional(),
procedureTimeslot: z.unknown().optional(),
insuranceContacts: z.array(z.unknown()),
patientConversations: z.array(z.unknown())
procedureTimeslot: z.unknown().optional()
});

View File

@@ -141,19 +141,6 @@ export { InsuranceCredentialDeleteManyResultSchema } from './InsuranceCredential
export { InsuranceCredentialAggregateResultSchema } from './InsuranceCredentialAggregateResult.schema';
export { InsuranceCredentialGroupByResultSchema } from './InsuranceCredentialGroupByResult.schema';
export { InsuranceCredentialCountResultSchema } from './InsuranceCredentialCountResult.schema';
export { ShoppingVendorFindUniqueResultSchema } from './ShoppingVendorFindUniqueResult.schema';
export { ShoppingVendorFindFirstResultSchema } from './ShoppingVendorFindFirstResult.schema';
export { ShoppingVendorFindManyResultSchema } from './ShoppingVendorFindManyResult.schema';
export { ShoppingVendorCreateResultSchema } from './ShoppingVendorCreateResult.schema';
export { ShoppingVendorCreateManyResultSchema } from './ShoppingVendorCreateManyResult.schema';
export { ShoppingVendorUpdateResultSchema } from './ShoppingVendorUpdateResult.schema';
export { ShoppingVendorUpdateManyResultSchema } from './ShoppingVendorUpdateManyResult.schema';
export { ShoppingVendorUpsertResultSchema } from './ShoppingVendorUpsertResult.schema';
export { ShoppingVendorDeleteResultSchema } from './ShoppingVendorDeleteResult.schema';
export { ShoppingVendorDeleteManyResultSchema } from './ShoppingVendorDeleteManyResult.schema';
export { ShoppingVendorAggregateResultSchema } from './ShoppingVendorAggregateResult.schema';
export { ShoppingVendorGroupByResultSchema } from './ShoppingVendorGroupByResult.schema';
export { ShoppingVendorCountResultSchema } from './ShoppingVendorCountResult.schema';
export { PdfGroupFindUniqueResultSchema } from './PdfGroupFindUniqueResult.schema';
export { PdfGroupFindFirstResultSchema } from './PdfGroupFindFirstResult.schema';
export { PdfGroupFindManyResultSchema } from './PdfGroupFindManyResult.schema';
@@ -375,19 +362,6 @@ export { OfficeContactDeleteManyResultSchema } from './OfficeContactDeleteManyRe
export { OfficeContactAggregateResultSchema } from './OfficeContactAggregateResult.schema';
export { OfficeContactGroupByResultSchema } from './OfficeContactGroupByResult.schema';
export { OfficeContactCountResultSchema } from './OfficeContactCountResult.schema';
export { InsuranceContactFindUniqueResultSchema } from './InsuranceContactFindUniqueResult.schema';
export { InsuranceContactFindFirstResultSchema } from './InsuranceContactFindFirstResult.schema';
export { InsuranceContactFindManyResultSchema } from './InsuranceContactFindManyResult.schema';
export { InsuranceContactCreateResultSchema } from './InsuranceContactCreateResult.schema';
export { InsuranceContactCreateManyResultSchema } from './InsuranceContactCreateManyResult.schema';
export { InsuranceContactUpdateResultSchema } from './InsuranceContactUpdateResult.schema';
export { InsuranceContactUpdateManyResultSchema } from './InsuranceContactUpdateManyResult.schema';
export { InsuranceContactUpsertResultSchema } from './InsuranceContactUpsertResult.schema';
export { InsuranceContactDeleteResultSchema } from './InsuranceContactDeleteResult.schema';
export { InsuranceContactDeleteManyResultSchema } from './InsuranceContactDeleteManyResult.schema';
export { InsuranceContactAggregateResultSchema } from './InsuranceContactAggregateResult.schema';
export { InsuranceContactGroupByResultSchema } from './InsuranceContactGroupByResult.schema';
export { InsuranceContactCountResultSchema } from './InsuranceContactCountResult.schema';
export { ProcedureTimeslotFindUniqueResultSchema } from './ProcedureTimeslotFindUniqueResult.schema';
export { ProcedureTimeslotFindFirstResultSchema } from './ProcedureTimeslotFindFirstResult.schema';
export { ProcedureTimeslotFindManyResultSchema } from './ProcedureTimeslotFindManyResult.schema';
@@ -401,42 +375,3 @@ export { ProcedureTimeslotDeleteManyResultSchema } from './ProcedureTimeslotDele
export { ProcedureTimeslotAggregateResultSchema } from './ProcedureTimeslotAggregateResult.schema';
export { ProcedureTimeslotGroupByResultSchema } from './ProcedureTimeslotGroupByResult.schema';
export { ProcedureTimeslotCountResultSchema } from './ProcedureTimeslotCountResult.schema';
export { PatientConversationFindUniqueResultSchema } from './PatientConversationFindUniqueResult.schema';
export { PatientConversationFindFirstResultSchema } from './PatientConversationFindFirstResult.schema';
export { PatientConversationFindManyResultSchema } from './PatientConversationFindManyResult.schema';
export { PatientConversationCreateResultSchema } from './PatientConversationCreateResult.schema';
export { PatientConversationCreateManyResultSchema } from './PatientConversationCreateManyResult.schema';
export { PatientConversationUpdateResultSchema } from './PatientConversationUpdateResult.schema';
export { PatientConversationUpdateManyResultSchema } from './PatientConversationUpdateManyResult.schema';
export { PatientConversationUpsertResultSchema } from './PatientConversationUpsertResult.schema';
export { PatientConversationDeleteResultSchema } from './PatientConversationDeleteResult.schema';
export { PatientConversationDeleteManyResultSchema } from './PatientConversationDeleteManyResult.schema';
export { PatientConversationAggregateResultSchema } from './PatientConversationAggregateResult.schema';
export { PatientConversationGroupByResultSchema } from './PatientConversationGroupByResult.schema';
export { PatientConversationCountResultSchema } from './PatientConversationCountResult.schema';
export { CommissionBatchFindUniqueResultSchema } from './CommissionBatchFindUniqueResult.schema';
export { CommissionBatchFindFirstResultSchema } from './CommissionBatchFindFirstResult.schema';
export { CommissionBatchFindManyResultSchema } from './CommissionBatchFindManyResult.schema';
export { CommissionBatchCreateResultSchema } from './CommissionBatchCreateResult.schema';
export { CommissionBatchCreateManyResultSchema } from './CommissionBatchCreateManyResult.schema';
export { CommissionBatchUpdateResultSchema } from './CommissionBatchUpdateResult.schema';
export { CommissionBatchUpdateManyResultSchema } from './CommissionBatchUpdateManyResult.schema';
export { CommissionBatchUpsertResultSchema } from './CommissionBatchUpsertResult.schema';
export { CommissionBatchDeleteResultSchema } from './CommissionBatchDeleteResult.schema';
export { CommissionBatchDeleteManyResultSchema } from './CommissionBatchDeleteManyResult.schema';
export { CommissionBatchAggregateResultSchema } from './CommissionBatchAggregateResult.schema';
export { CommissionBatchGroupByResultSchema } from './CommissionBatchGroupByResult.schema';
export { CommissionBatchCountResultSchema } from './CommissionBatchCountResult.schema';
export { CommissionBatchItemFindUniqueResultSchema } from './CommissionBatchItemFindUniqueResult.schema';
export { CommissionBatchItemFindFirstResultSchema } from './CommissionBatchItemFindFirstResult.schema';
export { CommissionBatchItemFindManyResultSchema } from './CommissionBatchItemFindManyResult.schema';
export { CommissionBatchItemCreateResultSchema } from './CommissionBatchItemCreateResult.schema';
export { CommissionBatchItemCreateManyResultSchema } from './CommissionBatchItemCreateManyResult.schema';
export { CommissionBatchItemUpdateResultSchema } from './CommissionBatchItemUpdateResult.schema';
export { CommissionBatchItemUpdateManyResultSchema } from './CommissionBatchItemUpdateManyResult.schema';
export { CommissionBatchItemUpsertResultSchema } from './CommissionBatchItemUpsertResult.schema';
export { CommissionBatchItemDeleteResultSchema } from './CommissionBatchItemDeleteResult.schema';
export { CommissionBatchItemDeleteManyResultSchema } from './CommissionBatchItemDeleteManyResult.schema';
export { CommissionBatchItemAggregateResultSchema } from './CommissionBatchItemAggregateResult.schema';
export { CommissionBatchItemGroupByResultSchema } from './CommissionBatchItemGroupByResult.schema';
export { CommissionBatchItemCountResultSchema } from './CommissionBatchItemCountResult.schema';