feat(database): add api_tokens and inbox_items tables for OpenSheets Companion

- Add api_tokens table to store device authentication tokens
  - Includes token hash, prefix, expiration, and usage tracking
  - Cascades on user deletion

- Add inbox_items table to store notifications from companion app
  - Stores original notification data and parsed transaction info
  - Tracks processing status (pending, processed, discarded)
  - Links to created lancamento when processed

- Add TypeScript types: ApiToken, NewApiToken, InboxItem, NewInboxItem
- Add inbox Zod schemas for input validation
This commit is contained in:
Felipe Coutinho
2026-01-23 12:10:05 +00:00
parent c2527df191
commit 29a457ad36
2 changed files with 142 additions and 0 deletions

27
lib/schemas/inbox.ts Normal file
View File

@@ -0,0 +1,27 @@
/**
* Zod schemas for inbox items (OpenSheets Companion)
*/
import { z } from "zod";
export const inboxItemSchema = z.object({
sourceApp: z.string().min(1, "sourceApp é obrigatório"),
sourceAppName: z.string().optional(),
deviceId: z.string().optional(),
originalTitle: z.string().optional(),
originalText: z.string().min(1, "originalText é obrigatório"),
notificationTimestamp: z.string().transform((val) => new Date(val)),
parsedName: z.string().optional(),
parsedAmount: z.coerce.number().optional(),
parsedDate: z.string().optional().transform((val) => (val ? new Date(val) : undefined)),
parsedCardLastDigits: z.string().length(4).optional(),
parsedTransactionType: z.enum(["Despesa", "Receita"]).optional(),
clientId: z.string().optional(), // ID local do app para rastreamento
});
export const inboxBatchSchema = z.object({
items: z.array(inboxItemSchema).min(1).max(50),
});
export type InboxItemInput = z.infer<typeof inboxItemSchema>;
export type InboxBatchInput = z.infer<typeof inboxBatchSchema>;