mirror of
https://github.com/temetro/temetro.git
synced 2026-08-10 18:49:29 +00:00
90e6ec4cc0
Chat: history pill now shows a History icon + a Start-new-chat (SquarePen) button; removed the duplicate chat-history list from the sidebar. Email: deployment-wide email provider config (Resend/Postmark/SendGrid/SMTP) in Settings → Developers, with encrypted API key and a Send-test action. sendEmail dispatches via the chosen provider (REST via fetch; SMTP via nodemailer). Forgot password with no provider: alert the clinic admin(s) via a "System" message card in Messages + a bell notification (seeded system user + per-clinic System conversation); clicking deep-links to /settings?tab=careTeam&member=<id>. Admins can set a member's password directly from the employee dialog (PATCH /api/staff/:id/password via Better Auth's internal context — no admin plugin needed). Patient Portal: "New patient" booking path registers a demographics-only patient then books; bookings reject double-booked slots (409). Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
20 lines
962 B
TypeScript
20 lines
962 B
TypeScript
import { pgTable, text, timestamp } from "drizzle-orm/pg-core";
|
|
|
|
// Deployment-wide email-provider configuration — a single row (id = "default").
|
|
// Email (verification, password reset, invitations) is sent while the user is
|
|
// logged out / before any clinic exists, so this can't be per-clinic; it's one
|
|
// config for the whole deployment, set by any clinic admin from Settings →
|
|
// Developers. The provider's API key is stored encrypted (lib/crypto.ts).
|
|
export const emailSettings = pgTable("email_settings", {
|
|
id: text("id").primaryKey().default("default"),
|
|
// "none" | "smtp" | "resend" | "postmark" | "sendgrid"
|
|
provider: text("provider").notNull().default("none"),
|
|
fromAddress: text("from_address").notNull().default(""),
|
|
// Encrypted API key (Resend/Postmark/SendGrid). SMTP uses env credentials.
|
|
credentials: text("credentials"),
|
|
updatedAt: timestamp("updated_at")
|
|
.defaultNow()
|
|
.$onUpdate(() => new Date())
|
|
.notNull(),
|
|
});
|