From 004f8c262d65a8497df6ed4ddb5563087ab97afc Mon Sep 17 00:00:00 2001 From: cheney Date: Thu, 22 Oct 2026 11:37:16 +0800 Subject: [PATCH] =?UTF-8?q?feat(V0.2):=20=E6=89=93=E5=8D=A1=20/=20?= =?UTF-8?q?=E6=97=A5=E5=8E=86=20/=20=E6=B8=85=E5=8D=95=E6=A8=A1=E5=9D=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 数据: Habit/CheckIn/CheckList/CheckListItem/CheckListTemplate + 迁移 + 重新生成 client - 后端: server/checkin/period.js 周期计算(日/周/月/年, 周一起始, Asia/Shanghai) /api/checkin/* 打卡项CRUD/打卡/撤销/补打/某日详情/月历 /api/checklists/* 清单与检查项CRUD/勾选/全选/复制/模板(系统预置出差·回老家) - 前端: 底部新增「打卡」Tab -> /checkin, 页内三视图 环形进度 RingProgress + 完成特效(粒子/光晕/触感, 可关闭) 打卡视图: 待办列表/乐观更新/撤销/新建编辑 日历视图: 月历网格 + 今天·昨天·明天 + 日期标记/完成率 清单视图: 场景清单/勾选进度条/模板生成/另存模板/归档 - 文档: docs/V0.2/需求文档.md 补充实现约定(附录B)与接口清单 --- .gitignore | 92 +- docs/{ => V0.1}/环境监控模块设计.md | 0 docs/V0.2/需求文档.md | 55 +- generated/prisma/browser.ts | 25 + generated/prisma/client.ts | 25 + generated/prisma/internal/class.ts | 58 +- generated/prisma/internal/prismaNamespace.ts | 464 ++++- .../prisma/internal/prismaNamespaceBrowser.ts | 127 +- generated/prisma/models.ts | 5 + generated/prisma/models/CheckIn.ts | 1518 +++++++++++++++ generated/prisma/models/CheckList.ts | 1514 +++++++++++++++ generated/prisma/models/CheckListItem.ts | 1406 ++++++++++++++ generated/prisma/models/CheckListTemplate.ts | 1380 ++++++++++++++ generated/prisma/models/Habit.ts | 1674 +++++++++++++++++ generated/prisma/models/User.ts | 559 +++++- .../migration.sql | 99 + prisma/schema.prisma | 93 + server/checkin/period.js | 120 ++ server/index.js | 5 + server/routes/checkin.js | 328 ++++ server/routes/checklists.js | 313 +++ src/App.jsx | 3 + src/api/checkin.js | 39 + src/components/BottomNav.jsx | 3 +- src/components/RingProgress.jsx | 139 ++ src/components/TabIcon.jsx | 11 +- src/pages/checkin/CalendarView.jsx | 173 ++ src/pages/checkin/CheckinPage.jsx | 28 + src/pages/checkin/HabitView.jsx | 290 +++ src/pages/checkin/ListView.jsx | 291 +++ src/pages/checkin/date.js | 88 + src/styles/globals.css | 168 ++ 32 files changed, 11030 insertions(+), 63 deletions(-) rename docs/{ => V0.1}/环境监控模块设计.md (100%) create mode 100644 generated/prisma/models/CheckIn.ts create mode 100644 generated/prisma/models/CheckList.ts create mode 100644 generated/prisma/models/CheckListItem.ts create mode 100644 generated/prisma/models/CheckListTemplate.ts create mode 100644 generated/prisma/models/Habit.ts create mode 100644 prisma/migrations/20261022120000_add_checkin_checklist/migration.sql create mode 100644 server/checkin/period.js create mode 100644 server/routes/checkin.js create mode 100644 server/routes/checklists.js create mode 100644 src/api/checkin.js create mode 100644 src/components/RingProgress.jsx create mode 100644 src/pages/checkin/CalendarView.jsx create mode 100644 src/pages/checkin/CheckinPage.jsx create mode 100644 src/pages/checkin/HabitView.jsx create mode 100644 src/pages/checkin/ListView.jsx create mode 100644 src/pages/checkin/date.js diff --git a/.gitignore b/.gitignore index 9edb0b1..9123757 100644 --- a/.gitignore +++ b/.gitignore @@ -1,47 +1,49 @@ -# dependencies -/node_modules -/.pnp -.pnp.js - -# testing -/coverage - -# production -/build -/out -/.next - -# misc -.DS_Store -.env.local -.env.development.local -.env.test.local -.env.production.local - -npm-debug.log* -yarn-debug.log* -yarn-error.log* -pnpm-debug.log* -lerna-debug.log* - -# Editor directories and files -.idea -.vscode -*.swp -*.swo -*~ -dist/* - -# local env (contains API keys) -/.env -.reasonix/* -# OTA 升级: 产物 (运行时生成, 部署时单独管理) + 私钥 (绝不能提交) -ota-package/* -!ota-package/README.md +# dependencies +/node_modules +/.pnp +.pnp.js -# apizero 文件缓存 (运行时按需生成) -cache/apizero/ -# Dockerfile 持久卷挂载点 (跟 ota-package 同类) -.cache/ -# 米家凭证缓存 (含 token, 绝不能提交) +# testing +/coverage + +# production +/build +/out +/.next + +# misc +.DS_Store +.env.local +.env.development.local +.env.test.local +.env.production.local + +npm-debug.log* +yarn-debug.log* +yarn-error.log* +pnpm-debug.log* +lerna-debug.log* + +# Editor directories and files +.idea +.vscode +*.swp +*.swo +*~ +dist/* + +# local env (contains API keys) +/.env +.reasonix/* +# OTA 升级: 产物 (运行时生成, 部署时单独管理) + 私钥 (绝不能提交) +ota-package/* +!ota-package/README.md + +# apizero 文件缓存 (运行时按需生成) +cache/apizero/ +# Dockerfile 持久卷挂载点 (跟 ota-package 同类) +.cache/ +# 米家凭证缓存 (含 token, 绝不能提交) server/mihome/.cache/ +# 工作区记忆/会话数据 (本地私有, 不入库) +.workbuddy/ diff --git a/docs/环境监控模块设计.md b/docs/V0.1/环境监控模块设计.md similarity index 100% rename from docs/环境监控模块设计.md rename to docs/V0.1/环境监控模块设计.md diff --git a/docs/V0.2/需求文档.md b/docs/V0.2/需求文档.md index 5634d72..a5fdba7 100644 --- a/docs/V0.2/需求文档.md +++ b/docs/V0.2/需求文档.md @@ -1,6 +1,6 @@ # iBoard V0.2 需求文档 — 打卡 / 日历 / 清单 -> 版本:V0.2 · 分支:`dev-0.2` · 状态:待评审 · 日期:2026-10-22 +> 版本:V0.2 · 分支:`dev-0.2` · 日期:2026-10-22 > 目标项目:iboard(Tauri 2 + React 18 + antd-mobile + Express + Prisma/MariaDB,移动端优先) > 基线版本:V0.1(`dev-0.1`) @@ -8,16 +8,16 @@ ## 1. 总体描述 -在 iBoard 移动端新增一个「打卡」模块,用**一个页面、三个视图**解决两类日常需求: - +在 iBoard 移动端新增一个「打卡」模块一个「清单」模块,满足两类日常需求: +### 打卡 1. **周期性打卡**(习惯养成):用户定义"每天 n 次 / 每周 n 次 / 每月 n 次 / 每年 n 次"的目标, 每次打卡后卡片上的**环形进度**按 `已完成次数 / 目标次数` 增长,达标时环形闭合并播放完成特效; 2. **日历回看**:以日历为载体,快速查看**今天**(要做什么)、**昨天**(做得怎样)、 **明天**(计划做什么),日期上以圆点/实心标记完成情况; -3. **检查清单**(场景化一次性事项):面向**出差、回老家**等临时场景,逐条勾选确认, - 避免遗漏;清单可复用为模板,下次一键生成。 -一句话:**用环形进度做周期性打卡,用日历做时间维度的回看与计划,用清单覆盖临时性的检查场景。** +### 清单 +1. **清单**(场景化一次性事项):面向**出差、回老家**等临时场景,逐条勾选确认, + 避免遗漏;清单可复用为模板,下次一键生成。 ### 1.1 本期范围 @@ -117,8 +117,8 @@ | 编号 | 需求描述 | 验收要点 | 优先级 | | --- | --- | --- | --- | -| F-SY-01 | 底部 TabBar 新增**「打卡」页**(现有 4 个 Tab → 5 个),作为本模块唯一入口 | 图标风格与现有 TabIcon 一致 | P0 | -| F-SY-02 | 「打卡」页内以子 Tab(Segmented / SwipeTabs)切换 **打卡 / 日历 / 清单** 三个视图 | 复用现有 `SwipeTabs` 组件 | P0 | +| F-SY-01 | 底部 TabBar 新增**「打卡」页** 和 **「清单」页** | 图标风格与现有 TabIcon 一致 | P0 | +| F-SY-02 | 「打卡」页内集成 打卡/日历 两个功能,日历放在上半截,默认显示一行为周视图,下拉显示为月视图。 | 日历中选择时间与下部打卡任务联动 | P0 | | F-SY-03 | 所有接口复用现有鉴权(`authRequired`,JWT),数据按 `userId` 隔离 | 未登录跳转 `/login` | P0 | | F-SY-04 | 后端新增 REST 路由(建议 `/api/checkin/*`、`/api/checklist/*`),挂载到 `server/index.js` | 与现有路由风格一致 | P0 | | F-SY-05 | 时间处理统一 **Asia/Shanghai**,前端与后端对"日历日"的判定一致 | 跨零点打卡归属当天 | P0 | @@ -293,3 +293,42 @@ model CheckListTemplate { ``` > 说明:周期进度由 `CheckIn` 按周期窗口现场聚合(不冗余计数字段),避免并发与修改 n 后的一致性问题。 + +--- + +## 附录 B:实现约定(开发期补充,用于消除口径歧义) + +| # | 约定 | 说明 | +| --- | --- | --- | +| B-1 | **周期窗口** | 日=自然日;周=周一 00:00 ~ 周日 23:59;月=自然月;年=自然年;时区 Asia/Shanghai | +| B-2 | **环形进度** | 周期完成度 = 周期内累计打卡次数 / n(每周 n 次:打 1 次=1/n 环;每天 1 次:打 1 次直接闭合) | +| B-3 | **日历日期标记** | 用"当日完成度":当日次数 / **日均期望次数**(每天 n 次→n;每周 n 次→ceil(n/7);每月→ceil(n/当月天数);每年→ceil(n/365))。全完成=实心绿点,部分=黄点,超额=紫点,无记录=不显示 | +| B-4 | **streak** | 从当前周期往回数连续达标的周期数;**当前周期未结束且未达标不算断签**(跳过继续往前数) | +| B-5 | **补打限制** | 只能补打最近 7 天(`BACKFILL_DAYS`),未来日期禁止打卡 | +| B-6 | **撤销语义** | 撤销删除本周期内"最近一次"打卡(按 date desc、seq desc 取第一条) | +| B-7 | **删除打卡项** | 默认归档(`archived=true`,历史保留);`?hard=1` 才物理删除并清记录 | +| B-8 | **接口前缀** | 打卡 `/api/checkin/*`、清单 `/api/checklists/*`,全部 `authRequired`,数据按 `userId` 隔离 | +| B-9 | **前端入口** | 底部新增第 5 个 Tab「打卡」→ `/checkin`,页内三视图:打卡 / 日历 / 清单 | +| B-10 | **特效开关** | 完成特效 + 触感反馈受 `localStorage iboard_celebrate` 控制(默认开),系统开启"减弱动效"时自动降级 | + +### 接口清单 + +| 方法 | 路径 | 说明 | +| --- | --- | --- | +| GET | `/api/checkin/habits?date=` | 打卡项列表 + 当前周期进度 + streak | +| POST | `/api/checkin/habits` | 新建打卡项 | +| PUT | `/api/checkin/habits/:id` | 编辑(改 n / 周期 / 归档) | +| DELETE | `/api/checkin/habits/:id?hard=1` | 归档(默认)/ 物理删除 | +| POST | `/api/checkin/habits/:id/check` | 打卡一次(可带 `date` 补打、`note`) | +| DELETE | `/api/checkin/habits/:id/check?date=` | 撤销本周期最近一次 | +| GET | `/api/checkin/day?date=` | 某日详情(今天可打卡 / 昨天可补打 / 明天只读) | +| GET | `/api/checkin/calendar?month=YYYY-MM` | 月历:每日状态 + 当月完成率 | +| GET | `/api/checklists?archived=0\|1` | 清单列表(含进度) | +| POST | `/api/checklists` | 新建清单(可带 `templateId` 从模板生成) | +| GET/PUT/DELETE | `/api/checklists/:id` | 详情 / 编辑 / 删除 | +| POST | `/api/checklists/:id/duplicate` | 复制为新清单(勾选重置) | +| POST | `/api/checklists/:id/items` | 新增检查项 | +| PUT/DELETE | `/api/checklists/items/:id` | 改标题 / 勾选(`done`) / 删除 | +| POST | `/api/checklists/:id/check-all` | 一键全选 / 全不选 | +| GET/POST | `/api/checklists/templates` | 模板列表(含系统预置)/ 另存为模板 | +| DELETE | `/api/checklists/templates/:id` | 删除自定义模板 | diff --git a/generated/prisma/browser.ts b/generated/prisma/browser.ts index 2b1f0eb..fad8cc8 100644 --- a/generated/prisma/browser.ts +++ b/generated/prisma/browser.ts @@ -107,3 +107,28 @@ export type MihomeEnvSample = Prisma.MihomeEnvSampleModel * */ export type MihomeEnvHour = Prisma.MihomeEnvHourModel +/** + * Model Habit + * + */ +export type Habit = Prisma.HabitModel +/** + * Model CheckIn + * + */ +export type CheckIn = Prisma.CheckInModel +/** + * Model CheckList + * + */ +export type CheckList = Prisma.CheckListModel +/** + * Model CheckListItem + * + */ +export type CheckListItem = Prisma.CheckListItemModel +/** + * Model CheckListTemplate + * + */ +export type CheckListTemplate = Prisma.CheckListTemplateModel diff --git a/generated/prisma/client.ts b/generated/prisma/client.ts index 5eb90db..322de4c 100644 --- a/generated/prisma/client.ts +++ b/generated/prisma/client.ts @@ -131,3 +131,28 @@ export type MihomeEnvSample = Prisma.MihomeEnvSampleModel * */ export type MihomeEnvHour = Prisma.MihomeEnvHourModel +/** + * Model Habit + * + */ +export type Habit = Prisma.HabitModel +/** + * Model CheckIn + * + */ +export type CheckIn = Prisma.CheckInModel +/** + * Model CheckList + * + */ +export type CheckList = Prisma.CheckListModel +/** + * Model CheckListItem + * + */ +export type CheckListItem = Prisma.CheckListItemModel +/** + * Model CheckListTemplate + * + */ +export type CheckListTemplate = Prisma.CheckListTemplateModel diff --git a/generated/prisma/internal/class.ts b/generated/prisma/internal/class.ts index 9d85193..c8ce4ba 100644 --- a/generated/prisma/internal/class.ts +++ b/generated/prisma/internal/class.ts @@ -20,7 +20,7 @@ const config: runtime.GetPrismaClientConfig = { "clientVersion": "7.7.0", "engineVersion": "75cbdc1eb7150937890ad5465d861175c6624711", "activeProvider": "mysql", - "inlineSchema": "// This is your Prisma schema file,\n// learn more about it in the docs: https://pris.ly/d/prisma-schema\n\n// Get a free hosted Postgres database in seconds: `npx create-db`\n\ngenerator client {\n provider = \"prisma-client\"\n output = \"../generated/prisma\"\n}\n\ndatasource db {\n provider = \"mysql\"\n}\n\nmodel User {\n id Int @id @default(autoincrement())\n name String\n email String @unique\n password String\n createdAt DateTime @default(now())\n updatedAt DateTime @updatedAt\n}\n\nmodel Article {\n id Int @id @default(autoincrement())\n title String\n slug String @unique\n content String\n date String\n createdAt DateTime @default(now())\n updatedAt DateTime @updatedAt\n}\n\nmodel Strategy {\n id Int @id @default(autoincrement())\n name String\n description String\n data Json\n createdAt DateTime @default(now())\n updatedAt DateTime @updatedAt\n}\n\nmodel Indicator {\n id Int @id @default(autoincrement())\n name String @unique\n groupName String\n title String @default(\"\")\n unit String @default(\"\")\n source String @default(\"\")\n frequency String @default(\"month\") // year | quarter | month | day\n hidden Boolean @default(false) // true = 数据/脚本保留, 但不在前端展示\n points IndicatorPoint[]\n createdAt DateTime @default(now())\n updatedAt DateTime @updatedAt\n}\n\nmodel IndicatorPoint {\n id Int @id @default(autoincrement())\n indicatorId Int\n indicator Indicator @relation(fields: [indicatorId], references: [id], onDelete: Cascade)\n period String // \"2024\" | \"2024-Q1\" | \"2024-01\" | \"2024-01-15\"\n value Float\n createdAt DateTime @default(now())\n updatedAt DateTime @updatedAt\n\n @@unique([indicatorId, period])\n}\n\n// 新闻: 每天 3 点由 mx_finance_search_news 拉取, 按影响大小排序, 累加多日供首页无限滚动\nmodel News {\n id Int @id @default(autoincrement())\n title String\n summary String @default(\"\")\n content String? @db.Text\n source String @default(\"\")\n url String @default(\"\")\n publishedAt DateTime\n impactRank Int\n createdAt DateTime @default(now())\n\n @@unique([title, publishedAt])\n @@index([publishedAt])\n}\n\n// 报警: refresh 写库时比对同 (indicatorName, period) 的跨源数据, 差异超阈值记录\nmodel Alert {\n id Int @id @default(autoincrement())\n indicatorName String\n period String\n valueA Float\n valueB Float\n sourceA String\n sourceB String\n diff Float\n diffRatio Float\n createdAt DateTime @default(now())\n\n @@index([createdAt])\n}\n\n// 服务器监控: 对接 komari 公开 API\nmodel ServerNode {\n id Int @id @default(autoincrement())\n uuid String @unique\n name String\n cpuName String @default(\"\")\n os String @default(\"\")\n region String @default(\"\")\n memTotal BigInt @default(0)\n diskTotal BigInt @default(0)\n cpuCores Int @default(0)\n // 最新实时快照\n cpuUsage Float @default(0)\n ramUsed BigInt @default(0)\n swapUsed BigInt @default(0)\n load1 Float @default(0)\n load5 Float @default(0)\n load15 Float @default(0)\n diskUsed BigInt @default(0)\n netIn BigInt @default(0)\n netOut BigInt @default(0)\n uptime BigInt @default(0)\n process Int @default(0)\n connections Int @default(0)\n status String @default(\"unknown\") // online | offline | unknown\n recordedAt DateTime\n createdAt DateTime @default(now())\n updatedAt DateTime @updatedAt\n}\n\n// 时序历史: 每节点每分钟一条 (komari records 1 分钟粒度)\nmodel ServerNodeHistory {\n id Int @id @default(autoincrement())\n uuid String\n period DateTime\n cpu Float @default(0)\n ram BigInt @default(0)\n load Float @default(0)\n disk BigInt @default(0)\n netIn BigInt @default(0)\n netOut BigInt @default(0)\n process Int @default(0)\n connections Int @default(0)\n createdAt DateTime @default(now())\n\n @@unique([uuid, period])\n @@index([uuid, period])\n}\n\n// 服务健康检查: 本应用自检 (健康端点 / DB / 第三方)\nmodel ServiceCheck {\n id Int @id @default(autoincrement())\n name String @unique\n url String\n status String @default(\"unknown\") // up | down | unknown\n latencyMs Int @default(0)\n message String @default(\"\")\n lastCheckAt DateTime\n createdAt DateTime @default(now())\n updatedAt DateTime @updatedAt\n}\n\nmodel Econ_SowInventory {\n id Int @id @default(autoincrement())\n month String @unique\n inventory Int // 能繁母猪数量(万头)\n createdAt DateTime @default(now())\n updatedAt DateTime @updatedAt\n}\n\nmodel ScraperCache {\n id Int @id @default(autoincrement())\n scraperName String @unique // 爬虫名称,如:sow-inventory\n lastDataHash String? // 上次数据指纹\n lastUpdateAt DateTime // 上次更新时间\n metadata Json? // 其他元数据\n createdAt DateTime @default(now())\n updatedAt DateTime @updatedAt\n}\n\n// 浙江省油价历史 (apizero price 接口每日抓取)\n// 每天 04:00 cron 触发: 检查 schedule 里待定且 <= 昨天的调价日, 抓 price?province=浙江 存本表\n// unique (date, province, fuel) 防重复\nmodel OilPriceHistory {\n id Int @id @default(autoincrement())\n date DateTime // 调价日次日 (即数据实际抓取日)\n province String // '浙江'\n fuel String // '92' | '95' | '0'\n price Float // 油价 (元/升, 4 位小数足够)\n source String @default(\"apizero\")\n createdAt DateTime @default(now())\n\n @@unique([date, province, fuel])\n @@index([province, fuel, date])\n}\n\n// ==================== 环境监控:米家 ====================\n\n// 米家授权状态 (DiskCache 存凭证, 本表只存状态/错误供前端展示)\nmodel MihomeAccount {\n id Int @id @default(autoincrement())\n key String @unique @default(\"default\")\n userId String @default(\"\")\n status String @default(\"unknown\") // ok | pending | expired\n lastError String @default(\"\")\n updatedAt DateTime @updatedAt\n}\n\nmodel MihomeHome {\n id Int @id @default(autoincrement())\n homeId String @unique\n name String\n createdAt DateTime @default(now())\n devices MihomeDevice[]\n}\n\nmodel MihomeDevice {\n id Int @id @default(autoincrement())\n did String @unique\n homeId String\n home MihomeHome @relation(fields: [homeId], references: [homeId])\n model String\n name String\n alias String? // 用户别名, 仅本应用展示\n tempSiid Int\n tempPiid Int\n humSiid Int\n humPiid Int\n battSiid Int // 电池电量属性 (炎米 3.1003 / 青萍 2.3)\n battPiid Int\n battery Int? // 最近一次电量 (每天读一次, 标题展示用)\n batteryAt DateTime? // 电量读取时间 (当天缓存, 不频繁更新)\n enabled Boolean @default(true)\n lastSyncAt DateTime?\n createdAt DateTime @default(now())\n samples MihomeEnvSample[]\n hours MihomeEnvHour[]\n}\n\n// 日档: 月视图(逐日)数据源; unique (deviceId, date) 防重\nmodel MihomeEnvSample {\n id Int @id @default(autoincrement())\n deviceId Int\n device MihomeDevice @relation(fields: [deviceId], references: [id], onDelete: Cascade)\n date DateTime // 采样日 (Asia/Shanghai 当日 00:00 存 UTC)\n temperature Float? // 当日最后一次实时值 (或 vendor hour 均值)\n humidity Float?\n temperatureAvg Float? // 当日均值 (由小时档聚合, 或 vendor_hour)\n humidityAvg Float?\n temperatureMin Float? // 当日最低\n temperatureMax Float? // 当日最高\n humidityMin Float?\n humidityMax Float?\n origin String @default(\"live\") // live | vendor_history | backfill\n sampledAt DateTime?\n raw Json?\n createdAt DateTime @default(now())\n\n @@unique([deviceId, date])\n @@index([deviceId, date])\n}\n\n// 小时档: 当天视图(逐小时)数据源; unique (deviceId, hour) 防重\nmodel MihomeEnvHour {\n id Int @id @default(autoincrement())\n deviceId Int\n device MihomeDevice @relation(fields: [deviceId], references: [id], onDelete: Cascade)\n hour DateTime // Asia/Shanghai 整点 (存 UTC)\n temperatureAvg Float? // 该小时均值 (live 采样点, 或 vendor_hour)\n humidityAvg Float?\n raw Json?\n createdAt DateTime @default(now())\n\n @@unique([deviceId, hour])\n @@index([deviceId, hour])\n}\n", + "inlineSchema": "// This is your Prisma schema file,\n// learn more about it in the docs: https://pris.ly/d/prisma-schema\n\n// Get a free hosted Postgres database in seconds: `npx create-db`\n\ngenerator client {\n provider = \"prisma-client\"\n output = \"../generated/prisma\"\n}\n\ndatasource db {\n provider = \"mysql\"\n}\n\nmodel User {\n id Int @id @default(autoincrement())\n name String\n email String @unique\n password String\n createdAt DateTime @default(now())\n updatedAt DateTime @updatedAt\n\n // V0.2 打卡 / 清单: 用户删除时级联清理\n habits Habit[]\n checkIns CheckIn[]\n checkLists CheckList[]\n templates CheckListTemplate[]\n}\n\nmodel Article {\n id Int @id @default(autoincrement())\n title String\n slug String @unique\n content String\n date String\n createdAt DateTime @default(now())\n updatedAt DateTime @updatedAt\n}\n\nmodel Strategy {\n id Int @id @default(autoincrement())\n name String\n description String\n data Json\n createdAt DateTime @default(now())\n updatedAt DateTime @updatedAt\n}\n\nmodel Indicator {\n id Int @id @default(autoincrement())\n name String @unique\n groupName String\n title String @default(\"\")\n unit String @default(\"\")\n source String @default(\"\")\n frequency String @default(\"month\") // year | quarter | month | day\n hidden Boolean @default(false) // true = 数据/脚本保留, 但不在前端展示\n points IndicatorPoint[]\n createdAt DateTime @default(now())\n updatedAt DateTime @updatedAt\n}\n\nmodel IndicatorPoint {\n id Int @id @default(autoincrement())\n indicatorId Int\n indicator Indicator @relation(fields: [indicatorId], references: [id], onDelete: Cascade)\n period String // \"2024\" | \"2024-Q1\" | \"2024-01\" | \"2024-01-15\"\n value Float\n createdAt DateTime @default(now())\n updatedAt DateTime @updatedAt\n\n @@unique([indicatorId, period])\n}\n\n// 新闻: 每天 3 点由 mx_finance_search_news 拉取, 按影响大小排序, 累加多日供首页无限滚动\nmodel News {\n id Int @id @default(autoincrement())\n title String\n summary String @default(\"\")\n content String? @db.Text\n source String @default(\"\")\n url String @default(\"\")\n publishedAt DateTime\n impactRank Int\n createdAt DateTime @default(now())\n\n @@unique([title, publishedAt])\n @@index([publishedAt])\n}\n\n// 报警: refresh 写库时比对同 (indicatorName, period) 的跨源数据, 差异超阈值记录\nmodel Alert {\n id Int @id @default(autoincrement())\n indicatorName String\n period String\n valueA Float\n valueB Float\n sourceA String\n sourceB String\n diff Float\n diffRatio Float\n createdAt DateTime @default(now())\n\n @@index([createdAt])\n}\n\n// 服务器监控: 对接 komari 公开 API\nmodel ServerNode {\n id Int @id @default(autoincrement())\n uuid String @unique\n name String\n cpuName String @default(\"\")\n os String @default(\"\")\n region String @default(\"\")\n memTotal BigInt @default(0)\n diskTotal BigInt @default(0)\n cpuCores Int @default(0)\n // 最新实时快照\n cpuUsage Float @default(0)\n ramUsed BigInt @default(0)\n swapUsed BigInt @default(0)\n load1 Float @default(0)\n load5 Float @default(0)\n load15 Float @default(0)\n diskUsed BigInt @default(0)\n netIn BigInt @default(0)\n netOut BigInt @default(0)\n uptime BigInt @default(0)\n process Int @default(0)\n connections Int @default(0)\n status String @default(\"unknown\") // online | offline | unknown\n recordedAt DateTime\n createdAt DateTime @default(now())\n updatedAt DateTime @updatedAt\n}\n\n// 时序历史: 每节点每分钟一条 (komari records 1 分钟粒度)\nmodel ServerNodeHistory {\n id Int @id @default(autoincrement())\n uuid String\n period DateTime\n cpu Float @default(0)\n ram BigInt @default(0)\n load Float @default(0)\n disk BigInt @default(0)\n netIn BigInt @default(0)\n netOut BigInt @default(0)\n process Int @default(0)\n connections Int @default(0)\n createdAt DateTime @default(now())\n\n @@unique([uuid, period])\n @@index([uuid, period])\n}\n\n// 服务健康检查: 本应用自检 (健康端点 / DB / 第三方)\nmodel ServiceCheck {\n id Int @id @default(autoincrement())\n name String @unique\n url String\n status String @default(\"unknown\") // up | down | unknown\n latencyMs Int @default(0)\n message String @default(\"\")\n lastCheckAt DateTime\n createdAt DateTime @default(now())\n updatedAt DateTime @updatedAt\n}\n\nmodel Econ_SowInventory {\n id Int @id @default(autoincrement())\n month String @unique\n inventory Int // 能繁母猪数量(万头)\n createdAt DateTime @default(now())\n updatedAt DateTime @updatedAt\n}\n\nmodel ScraperCache {\n id Int @id @default(autoincrement())\n scraperName String @unique // 爬虫名称,如:sow-inventory\n lastDataHash String? // 上次数据指纹\n lastUpdateAt DateTime // 上次更新时间\n metadata Json? // 其他元数据\n createdAt DateTime @default(now())\n updatedAt DateTime @updatedAt\n}\n\n// 浙江省油价历史 (apizero price 接口每日抓取)\n// 每天 04:00 cron 触发: 检查 schedule 里待定且 <= 昨天的调价日, 抓 price?province=浙江 存本表\n// unique (date, province, fuel) 防重复\nmodel OilPriceHistory {\n id Int @id @default(autoincrement())\n date DateTime // 调价日次日 (即数据实际抓取日)\n province String // '浙江'\n fuel String // '92' | '95' | '0'\n price Float // 油价 (元/升, 4 位小数足够)\n source String @default(\"apizero\")\n createdAt DateTime @default(now())\n\n @@unique([date, province, fuel])\n @@index([province, fuel, date])\n}\n\n// ==================== 环境监控:米家 ====================\n\n// 米家授权状态 (DiskCache 存凭证, 本表只存状态/错误供前端展示)\nmodel MihomeAccount {\n id Int @id @default(autoincrement())\n key String @unique @default(\"default\")\n userId String @default(\"\")\n status String @default(\"unknown\") // ok | pending | expired\n lastError String @default(\"\")\n updatedAt DateTime @updatedAt\n}\n\nmodel MihomeHome {\n id Int @id @default(autoincrement())\n homeId String @unique\n name String\n createdAt DateTime @default(now())\n devices MihomeDevice[]\n}\n\nmodel MihomeDevice {\n id Int @id @default(autoincrement())\n did String @unique\n homeId String\n home MihomeHome @relation(fields: [homeId], references: [homeId])\n model String\n name String\n alias String? // 用户别名, 仅本应用展示\n tempSiid Int\n tempPiid Int\n humSiid Int\n humPiid Int\n battSiid Int // 电池电量属性 (炎米 3.1003 / 青萍 2.3)\n battPiid Int\n battery Int? // 最近一次电量 (每天读一次, 标题展示用)\n batteryAt DateTime? // 电量读取时间 (当天缓存, 不频繁更新)\n enabled Boolean @default(true)\n lastSyncAt DateTime?\n createdAt DateTime @default(now())\n samples MihomeEnvSample[]\n hours MihomeEnvHour[]\n}\n\n// 日档: 月视图(逐日)数据源; unique (deviceId, date) 防重\nmodel MihomeEnvSample {\n id Int @id @default(autoincrement())\n deviceId Int\n device MihomeDevice @relation(fields: [deviceId], references: [id], onDelete: Cascade)\n date DateTime // 采样日 (Asia/Shanghai 当日 00:00 存 UTC)\n temperature Float? // 当日最后一次实时值 (或 vendor hour 均值)\n humidity Float?\n temperatureAvg Float? // 当日均值 (由小时档聚合, 或 vendor_hour)\n humidityAvg Float?\n temperatureMin Float? // 当日最低\n temperatureMax Float? // 当日最高\n humidityMin Float?\n humidityMax Float?\n origin String @default(\"live\") // live | vendor_history | backfill\n sampledAt DateTime?\n raw Json?\n createdAt DateTime @default(now())\n\n @@unique([deviceId, date])\n @@index([deviceId, date])\n}\n\n// 小时档: 当天视图(逐小时)数据源; unique (deviceId, hour) 防重\nmodel MihomeEnvHour {\n id Int @id @default(autoincrement())\n deviceId Int\n device MihomeDevice @relation(fields: [deviceId], references: [id], onDelete: Cascade)\n hour DateTime // Asia/Shanghai 整点 (存 UTC)\n temperatureAvg Float? // 该小时均值 (live 采样点, 或 vendor_hour)\n humidityAvg Float?\n raw Json?\n createdAt DateTime @default(now())\n\n @@unique([deviceId, hour])\n @@index([deviceId, hour])\n}\n\n// ==================== 打卡 / 日历 / 清单 (V0.2) ====================\n\n// 打卡项: 周期性目标 (每天 / 每周 / 每月 / 每年 n 次)\nmodel Habit {\n id Int @id @default(autoincrement())\n userId Int\n user User @relation(fields: [userId], references: [id], onDelete: Cascade)\n name String\n period String @default(\"day\") // day | week | month | year\n target Int @default(1) // 周期内目标次数 n (>=1)\n color String @default(\"#1677ff\")\n icon String @default(\"\") // emoji 或图标名, 预留\n note String @default(\"\")\n archived Boolean @default(false) // 归档: 不出现在今日待办, 历史保留\n sortOrder Int @default(0)\n createdAt DateTime @default(now())\n updatedAt DateTime @updatedAt\n records CheckIn[]\n\n @@index([userId, archived, sortOrder])\n}\n\n// 打卡记录: 一次打卡 = 一条; 同日多次 => seq 递增 (1..n, 超额继续累加)\nmodel CheckIn {\n id Int @id @default(autoincrement())\n habitId Int\n habit Habit @relation(fields: [habitId], references: [id], onDelete: Cascade)\n userId Int\n user User @relation(fields: [userId], references: [id], onDelete: Cascade)\n date String @db.VarChar(10) // 本地日历日 \"YYYY-MM-DD\" (Asia/Shanghai)\n seq Int @default(1) // 当日第几次\n note String @default(\"\")\n source String @default(\"user\") // user | backfill (补打)\n createdAt DateTime @default(now())\n\n @@unique([habitId, date, seq])\n @@index([userId, date])\n @@index([habitId, date])\n}\n\n// 检查清单: 出差 / 回老家 等场景的一次性清单\nmodel CheckList {\n id Int @id @default(autoincrement())\n userId Int\n user User @relation(fields: [userId], references: [id], onDelete: Cascade)\n title String\n scene String @default(\"\") // 出差 | 回老家 | 自定义\n note String @default(\"\")\n archived Boolean @default(false)\n createdAt DateTime @default(now())\n updatedAt DateTime @updatedAt\n items CheckListItem[]\n\n @@index([userId, archived])\n}\n\n// 检查项: 勾选即完成\nmodel CheckListItem {\n id Int @id @default(autoincrement())\n listId Int\n list CheckList @relation(fields: [listId], references: [id], onDelete: Cascade)\n title String\n note String @default(\"\")\n done Boolean @default(false)\n doneAt DateTime?\n sortOrder Int @default(0)\n createdAt DateTime @default(now())\n updatedAt DateTime @updatedAt\n\n @@index([listId, sortOrder])\n}\n\n// 清单模板: builtin = 系统预置 (userId 为空); 否则为用户自定义\nmodel CheckListTemplate {\n id Int @id @default(autoincrement())\n userId Int?\n user User? @relation(fields: [userId], references: [id], onDelete: Cascade)\n name String\n scene String @default(\"\")\n items Json // [{ title, note }]\n builtin Boolean @default(false)\n createdAt DateTime @default(now())\n updatedAt DateTime @updatedAt\n\n @@index([userId, builtin])\n}\n", "runtimeDataModel": { "models": {}, "enums": {}, @@ -32,10 +32,10 @@ const config: runtime.GetPrismaClientConfig = { } } -config.runtimeDataModel = JSON.parse("{\"models\":{\"User\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"name\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"email\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"password\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"}],\"dbName\":null},\"Article\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"title\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"slug\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"content\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"date\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"}],\"dbName\":null},\"Strategy\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"name\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"description\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"data\",\"kind\":\"scalar\",\"type\":\"Json\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"}],\"dbName\":null},\"Indicator\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"name\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"groupName\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"title\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"unit\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"source\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"frequency\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"hidden\",\"kind\":\"scalar\",\"type\":\"Boolean\"},{\"name\":\"points\",\"kind\":\"object\",\"type\":\"IndicatorPoint\",\"relationName\":\"IndicatorToIndicatorPoint\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"}],\"dbName\":null},\"IndicatorPoint\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"indicatorId\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"indicator\",\"kind\":\"object\",\"type\":\"Indicator\",\"relationName\":\"IndicatorToIndicatorPoint\"},{\"name\":\"period\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"value\",\"kind\":\"scalar\",\"type\":\"Float\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"}],\"dbName\":null},\"News\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"title\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"summary\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"content\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"source\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"url\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"publishedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"impactRank\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"}],\"dbName\":null},\"Alert\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"indicatorName\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"period\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"valueA\",\"kind\":\"scalar\",\"type\":\"Float\"},{\"name\":\"valueB\",\"kind\":\"scalar\",\"type\":\"Float\"},{\"name\":\"sourceA\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"sourceB\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"diff\",\"kind\":\"scalar\",\"type\":\"Float\"},{\"name\":\"diffRatio\",\"kind\":\"scalar\",\"type\":\"Float\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"}],\"dbName\":null},\"ServerNode\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"uuid\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"name\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"cpuName\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"os\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"region\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"memTotal\",\"kind\":\"scalar\",\"type\":\"BigInt\"},{\"name\":\"diskTotal\",\"kind\":\"scalar\",\"type\":\"BigInt\"},{\"name\":\"cpuCores\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"cpuUsage\",\"kind\":\"scalar\",\"type\":\"Float\"},{\"name\":\"ramUsed\",\"kind\":\"scalar\",\"type\":\"BigInt\"},{\"name\":\"swapUsed\",\"kind\":\"scalar\",\"type\":\"BigInt\"},{\"name\":\"load1\",\"kind\":\"scalar\",\"type\":\"Float\"},{\"name\":\"load5\",\"kind\":\"scalar\",\"type\":\"Float\"},{\"name\":\"load15\",\"kind\":\"scalar\",\"type\":\"Float\"},{\"name\":\"diskUsed\",\"kind\":\"scalar\",\"type\":\"BigInt\"},{\"name\":\"netIn\",\"kind\":\"scalar\",\"type\":\"BigInt\"},{\"name\":\"netOut\",\"kind\":\"scalar\",\"type\":\"BigInt\"},{\"name\":\"uptime\",\"kind\":\"scalar\",\"type\":\"BigInt\"},{\"name\":\"process\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"connections\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"status\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"recordedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"}],\"dbName\":null},\"ServerNodeHistory\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"uuid\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"period\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"cpu\",\"kind\":\"scalar\",\"type\":\"Float\"},{\"name\":\"ram\",\"kind\":\"scalar\",\"type\":\"BigInt\"},{\"name\":\"load\",\"kind\":\"scalar\",\"type\":\"Float\"},{\"name\":\"disk\",\"kind\":\"scalar\",\"type\":\"BigInt\"},{\"name\":\"netIn\",\"kind\":\"scalar\",\"type\":\"BigInt\"},{\"name\":\"netOut\",\"kind\":\"scalar\",\"type\":\"BigInt\"},{\"name\":\"process\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"connections\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"}],\"dbName\":null},\"ServiceCheck\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"name\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"url\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"status\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"latencyMs\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"message\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"lastCheckAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"}],\"dbName\":null},\"Econ_SowInventory\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"month\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"inventory\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"}],\"dbName\":null},\"ScraperCache\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"scraperName\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"lastDataHash\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"lastUpdateAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"metadata\",\"kind\":\"scalar\",\"type\":\"Json\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"}],\"dbName\":null},\"OilPriceHistory\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"date\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"province\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"fuel\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"price\",\"kind\":\"scalar\",\"type\":\"Float\"},{\"name\":\"source\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"}],\"dbName\":null},\"MihomeAccount\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"key\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"userId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"status\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"lastError\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"}],\"dbName\":null},\"MihomeHome\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"homeId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"name\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"devices\",\"kind\":\"object\",\"type\":\"MihomeDevice\",\"relationName\":\"MihomeDeviceToMihomeHome\"}],\"dbName\":null},\"MihomeDevice\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"did\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"homeId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"home\",\"kind\":\"object\",\"type\":\"MihomeHome\",\"relationName\":\"MihomeDeviceToMihomeHome\"},{\"name\":\"model\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"name\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"alias\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"tempSiid\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"tempPiid\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"humSiid\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"humPiid\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"battSiid\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"battPiid\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"battery\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"batteryAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"enabled\",\"kind\":\"scalar\",\"type\":\"Boolean\"},{\"name\":\"lastSyncAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"samples\",\"kind\":\"object\",\"type\":\"MihomeEnvSample\",\"relationName\":\"MihomeDeviceToMihomeEnvSample\"},{\"name\":\"hours\",\"kind\":\"object\",\"type\":\"MihomeEnvHour\",\"relationName\":\"MihomeDeviceToMihomeEnvHour\"}],\"dbName\":null},\"MihomeEnvSample\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"deviceId\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"device\",\"kind\":\"object\",\"type\":\"MihomeDevice\",\"relationName\":\"MihomeDeviceToMihomeEnvSample\"},{\"name\":\"date\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"temperature\",\"kind\":\"scalar\",\"type\":\"Float\"},{\"name\":\"humidity\",\"kind\":\"scalar\",\"type\":\"Float\"},{\"name\":\"temperatureAvg\",\"kind\":\"scalar\",\"type\":\"Float\"},{\"name\":\"humidityAvg\",\"kind\":\"scalar\",\"type\":\"Float\"},{\"name\":\"temperatureMin\",\"kind\":\"scalar\",\"type\":\"Float\"},{\"name\":\"temperatureMax\",\"kind\":\"scalar\",\"type\":\"Float\"},{\"name\":\"humidityMin\",\"kind\":\"scalar\",\"type\":\"Float\"},{\"name\":\"humidityMax\",\"kind\":\"scalar\",\"type\":\"Float\"},{\"name\":\"origin\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"sampledAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"raw\",\"kind\":\"scalar\",\"type\":\"Json\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"}],\"dbName\":null},\"MihomeEnvHour\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"deviceId\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"device\",\"kind\":\"object\",\"type\":\"MihomeDevice\",\"relationName\":\"MihomeDeviceToMihomeEnvHour\"},{\"name\":\"hour\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"temperatureAvg\",\"kind\":\"scalar\",\"type\":\"Float\"},{\"name\":\"humidityAvg\",\"kind\":\"scalar\",\"type\":\"Float\"},{\"name\":\"raw\",\"kind\":\"scalar\",\"type\":\"Json\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"}],\"dbName\":null}},\"enums\":{},\"types\":{}}") +config.runtimeDataModel = JSON.parse("{\"models\":{\"User\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"name\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"email\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"password\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"habits\",\"kind\":\"object\",\"type\":\"Habit\",\"relationName\":\"HabitToUser\"},{\"name\":\"checkIns\",\"kind\":\"object\",\"type\":\"CheckIn\",\"relationName\":\"CheckInToUser\"},{\"name\":\"checkLists\",\"kind\":\"object\",\"type\":\"CheckList\",\"relationName\":\"CheckListToUser\"},{\"name\":\"templates\",\"kind\":\"object\",\"type\":\"CheckListTemplate\",\"relationName\":\"CheckListTemplateToUser\"}],\"dbName\":null},\"Article\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"title\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"slug\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"content\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"date\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"}],\"dbName\":null},\"Strategy\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"name\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"description\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"data\",\"kind\":\"scalar\",\"type\":\"Json\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"}],\"dbName\":null},\"Indicator\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"name\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"groupName\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"title\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"unit\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"source\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"frequency\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"hidden\",\"kind\":\"scalar\",\"type\":\"Boolean\"},{\"name\":\"points\",\"kind\":\"object\",\"type\":\"IndicatorPoint\",\"relationName\":\"IndicatorToIndicatorPoint\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"}],\"dbName\":null},\"IndicatorPoint\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"indicatorId\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"indicator\",\"kind\":\"object\",\"type\":\"Indicator\",\"relationName\":\"IndicatorToIndicatorPoint\"},{\"name\":\"period\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"value\",\"kind\":\"scalar\",\"type\":\"Float\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"}],\"dbName\":null},\"News\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"title\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"summary\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"content\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"source\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"url\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"publishedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"impactRank\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"}],\"dbName\":null},\"Alert\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"indicatorName\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"period\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"valueA\",\"kind\":\"scalar\",\"type\":\"Float\"},{\"name\":\"valueB\",\"kind\":\"scalar\",\"type\":\"Float\"},{\"name\":\"sourceA\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"sourceB\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"diff\",\"kind\":\"scalar\",\"type\":\"Float\"},{\"name\":\"diffRatio\",\"kind\":\"scalar\",\"type\":\"Float\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"}],\"dbName\":null},\"ServerNode\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"uuid\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"name\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"cpuName\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"os\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"region\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"memTotal\",\"kind\":\"scalar\",\"type\":\"BigInt\"},{\"name\":\"diskTotal\",\"kind\":\"scalar\",\"type\":\"BigInt\"},{\"name\":\"cpuCores\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"cpuUsage\",\"kind\":\"scalar\",\"type\":\"Float\"},{\"name\":\"ramUsed\",\"kind\":\"scalar\",\"type\":\"BigInt\"},{\"name\":\"swapUsed\",\"kind\":\"scalar\",\"type\":\"BigInt\"},{\"name\":\"load1\",\"kind\":\"scalar\",\"type\":\"Float\"},{\"name\":\"load5\",\"kind\":\"scalar\",\"type\":\"Float\"},{\"name\":\"load15\",\"kind\":\"scalar\",\"type\":\"Float\"},{\"name\":\"diskUsed\",\"kind\":\"scalar\",\"type\":\"BigInt\"},{\"name\":\"netIn\",\"kind\":\"scalar\",\"type\":\"BigInt\"},{\"name\":\"netOut\",\"kind\":\"scalar\",\"type\":\"BigInt\"},{\"name\":\"uptime\",\"kind\":\"scalar\",\"type\":\"BigInt\"},{\"name\":\"process\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"connections\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"status\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"recordedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"}],\"dbName\":null},\"ServerNodeHistory\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"uuid\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"period\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"cpu\",\"kind\":\"scalar\",\"type\":\"Float\"},{\"name\":\"ram\",\"kind\":\"scalar\",\"type\":\"BigInt\"},{\"name\":\"load\",\"kind\":\"scalar\",\"type\":\"Float\"},{\"name\":\"disk\",\"kind\":\"scalar\",\"type\":\"BigInt\"},{\"name\":\"netIn\",\"kind\":\"scalar\",\"type\":\"BigInt\"},{\"name\":\"netOut\",\"kind\":\"scalar\",\"type\":\"BigInt\"},{\"name\":\"process\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"connections\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"}],\"dbName\":null},\"ServiceCheck\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"name\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"url\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"status\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"latencyMs\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"message\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"lastCheckAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"}],\"dbName\":null},\"Econ_SowInventory\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"month\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"inventory\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"}],\"dbName\":null},\"ScraperCache\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"scraperName\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"lastDataHash\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"lastUpdateAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"metadata\",\"kind\":\"scalar\",\"type\":\"Json\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"}],\"dbName\":null},\"OilPriceHistory\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"date\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"province\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"fuel\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"price\",\"kind\":\"scalar\",\"type\":\"Float\"},{\"name\":\"source\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"}],\"dbName\":null},\"MihomeAccount\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"key\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"userId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"status\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"lastError\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"}],\"dbName\":null},\"MihomeHome\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"homeId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"name\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"devices\",\"kind\":\"object\",\"type\":\"MihomeDevice\",\"relationName\":\"MihomeDeviceToMihomeHome\"}],\"dbName\":null},\"MihomeDevice\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"did\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"homeId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"home\",\"kind\":\"object\",\"type\":\"MihomeHome\",\"relationName\":\"MihomeDeviceToMihomeHome\"},{\"name\":\"model\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"name\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"alias\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"tempSiid\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"tempPiid\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"humSiid\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"humPiid\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"battSiid\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"battPiid\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"battery\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"batteryAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"enabled\",\"kind\":\"scalar\",\"type\":\"Boolean\"},{\"name\":\"lastSyncAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"samples\",\"kind\":\"object\",\"type\":\"MihomeEnvSample\",\"relationName\":\"MihomeDeviceToMihomeEnvSample\"},{\"name\":\"hours\",\"kind\":\"object\",\"type\":\"MihomeEnvHour\",\"relationName\":\"MihomeDeviceToMihomeEnvHour\"}],\"dbName\":null},\"MihomeEnvSample\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"deviceId\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"device\",\"kind\":\"object\",\"type\":\"MihomeDevice\",\"relationName\":\"MihomeDeviceToMihomeEnvSample\"},{\"name\":\"date\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"temperature\",\"kind\":\"scalar\",\"type\":\"Float\"},{\"name\":\"humidity\",\"kind\":\"scalar\",\"type\":\"Float\"},{\"name\":\"temperatureAvg\",\"kind\":\"scalar\",\"type\":\"Float\"},{\"name\":\"humidityAvg\",\"kind\":\"scalar\",\"type\":\"Float\"},{\"name\":\"temperatureMin\",\"kind\":\"scalar\",\"type\":\"Float\"},{\"name\":\"temperatureMax\",\"kind\":\"scalar\",\"type\":\"Float\"},{\"name\":\"humidityMin\",\"kind\":\"scalar\",\"type\":\"Float\"},{\"name\":\"humidityMax\",\"kind\":\"scalar\",\"type\":\"Float\"},{\"name\":\"origin\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"sampledAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"raw\",\"kind\":\"scalar\",\"type\":\"Json\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"}],\"dbName\":null},\"MihomeEnvHour\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"deviceId\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"device\",\"kind\":\"object\",\"type\":\"MihomeDevice\",\"relationName\":\"MihomeDeviceToMihomeEnvHour\"},{\"name\":\"hour\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"temperatureAvg\",\"kind\":\"scalar\",\"type\":\"Float\"},{\"name\":\"humidityAvg\",\"kind\":\"scalar\",\"type\":\"Float\"},{\"name\":\"raw\",\"kind\":\"scalar\",\"type\":\"Json\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"}],\"dbName\":null},\"Habit\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"userId\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"user\",\"kind\":\"object\",\"type\":\"User\",\"relationName\":\"HabitToUser\"},{\"name\":\"name\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"period\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"target\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"color\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"icon\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"note\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"archived\",\"kind\":\"scalar\",\"type\":\"Boolean\"},{\"name\":\"sortOrder\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"records\",\"kind\":\"object\",\"type\":\"CheckIn\",\"relationName\":\"CheckInToHabit\"}],\"dbName\":null},\"CheckIn\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"habitId\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"habit\",\"kind\":\"object\",\"type\":\"Habit\",\"relationName\":\"CheckInToHabit\"},{\"name\":\"userId\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"user\",\"kind\":\"object\",\"type\":\"User\",\"relationName\":\"CheckInToUser\"},{\"name\":\"date\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"seq\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"note\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"source\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"}],\"dbName\":null},\"CheckList\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"userId\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"user\",\"kind\":\"object\",\"type\":\"User\",\"relationName\":\"CheckListToUser\"},{\"name\":\"title\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"scene\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"note\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"archived\",\"kind\":\"scalar\",\"type\":\"Boolean\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"items\",\"kind\":\"object\",\"type\":\"CheckListItem\",\"relationName\":\"CheckListToCheckListItem\"}],\"dbName\":null},\"CheckListItem\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"listId\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"list\",\"kind\":\"object\",\"type\":\"CheckList\",\"relationName\":\"CheckListToCheckListItem\"},{\"name\":\"title\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"note\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"done\",\"kind\":\"scalar\",\"type\":\"Boolean\"},{\"name\":\"doneAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"sortOrder\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"}],\"dbName\":null},\"CheckListTemplate\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"userId\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"user\",\"kind\":\"object\",\"type\":\"User\",\"relationName\":\"CheckListTemplateToUser\"},{\"name\":\"name\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"scene\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"items\",\"kind\":\"scalar\",\"type\":\"Json\"},{\"name\":\"builtin\",\"kind\":\"scalar\",\"type\":\"Boolean\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"}],\"dbName\":null}},\"enums\":{},\"types\":{}}") config.parameterizationSchema = { - strings: JSON.parse("[\"where\",\"User.findUnique\",\"User.findUniqueOrThrow\",\"orderBy\",\"cursor\",\"User.findFirst\",\"User.findFirstOrThrow\",\"User.findMany\",\"data\",\"User.createOne\",\"User.createMany\",\"User.updateOne\",\"User.updateMany\",\"create\",\"update\",\"User.upsertOne\",\"User.deleteOne\",\"User.deleteMany\",\"having\",\"_count\",\"_avg\",\"_sum\",\"_min\",\"_max\",\"User.groupBy\",\"User.aggregate\",\"Article.findUnique\",\"Article.findUniqueOrThrow\",\"Article.findFirst\",\"Article.findFirstOrThrow\",\"Article.findMany\",\"Article.createOne\",\"Article.createMany\",\"Article.updateOne\",\"Article.updateMany\",\"Article.upsertOne\",\"Article.deleteOne\",\"Article.deleteMany\",\"Article.groupBy\",\"Article.aggregate\",\"Strategy.findUnique\",\"Strategy.findUniqueOrThrow\",\"Strategy.findFirst\",\"Strategy.findFirstOrThrow\",\"Strategy.findMany\",\"Strategy.createOne\",\"Strategy.createMany\",\"Strategy.updateOne\",\"Strategy.updateMany\",\"Strategy.upsertOne\",\"Strategy.deleteOne\",\"Strategy.deleteMany\",\"Strategy.groupBy\",\"Strategy.aggregate\",\"indicator\",\"points\",\"Indicator.findUnique\",\"Indicator.findUniqueOrThrow\",\"Indicator.findFirst\",\"Indicator.findFirstOrThrow\",\"Indicator.findMany\",\"Indicator.createOne\",\"Indicator.createMany\",\"Indicator.updateOne\",\"Indicator.updateMany\",\"Indicator.upsertOne\",\"Indicator.deleteOne\",\"Indicator.deleteMany\",\"Indicator.groupBy\",\"Indicator.aggregate\",\"IndicatorPoint.findUnique\",\"IndicatorPoint.findUniqueOrThrow\",\"IndicatorPoint.findFirst\",\"IndicatorPoint.findFirstOrThrow\",\"IndicatorPoint.findMany\",\"IndicatorPoint.createOne\",\"IndicatorPoint.createMany\",\"IndicatorPoint.updateOne\",\"IndicatorPoint.updateMany\",\"IndicatorPoint.upsertOne\",\"IndicatorPoint.deleteOne\",\"IndicatorPoint.deleteMany\",\"IndicatorPoint.groupBy\",\"IndicatorPoint.aggregate\",\"News.findUnique\",\"News.findUniqueOrThrow\",\"News.findFirst\",\"News.findFirstOrThrow\",\"News.findMany\",\"News.createOne\",\"News.createMany\",\"News.updateOne\",\"News.updateMany\",\"News.upsertOne\",\"News.deleteOne\",\"News.deleteMany\",\"News.groupBy\",\"News.aggregate\",\"Alert.findUnique\",\"Alert.findUniqueOrThrow\",\"Alert.findFirst\",\"Alert.findFirstOrThrow\",\"Alert.findMany\",\"Alert.createOne\",\"Alert.createMany\",\"Alert.updateOne\",\"Alert.updateMany\",\"Alert.upsertOne\",\"Alert.deleteOne\",\"Alert.deleteMany\",\"Alert.groupBy\",\"Alert.aggregate\",\"ServerNode.findUnique\",\"ServerNode.findUniqueOrThrow\",\"ServerNode.findFirst\",\"ServerNode.findFirstOrThrow\",\"ServerNode.findMany\",\"ServerNode.createOne\",\"ServerNode.createMany\",\"ServerNode.updateOne\",\"ServerNode.updateMany\",\"ServerNode.upsertOne\",\"ServerNode.deleteOne\",\"ServerNode.deleteMany\",\"ServerNode.groupBy\",\"ServerNode.aggregate\",\"ServerNodeHistory.findUnique\",\"ServerNodeHistory.findUniqueOrThrow\",\"ServerNodeHistory.findFirst\",\"ServerNodeHistory.findFirstOrThrow\",\"ServerNodeHistory.findMany\",\"ServerNodeHistory.createOne\",\"ServerNodeHistory.createMany\",\"ServerNodeHistory.updateOne\",\"ServerNodeHistory.updateMany\",\"ServerNodeHistory.upsertOne\",\"ServerNodeHistory.deleteOne\",\"ServerNodeHistory.deleteMany\",\"ServerNodeHistory.groupBy\",\"ServerNodeHistory.aggregate\",\"ServiceCheck.findUnique\",\"ServiceCheck.findUniqueOrThrow\",\"ServiceCheck.findFirst\",\"ServiceCheck.findFirstOrThrow\",\"ServiceCheck.findMany\",\"ServiceCheck.createOne\",\"ServiceCheck.createMany\",\"ServiceCheck.updateOne\",\"ServiceCheck.updateMany\",\"ServiceCheck.upsertOne\",\"ServiceCheck.deleteOne\",\"ServiceCheck.deleteMany\",\"ServiceCheck.groupBy\",\"ServiceCheck.aggregate\",\"Econ_SowInventory.findUnique\",\"Econ_SowInventory.findUniqueOrThrow\",\"Econ_SowInventory.findFirst\",\"Econ_SowInventory.findFirstOrThrow\",\"Econ_SowInventory.findMany\",\"Econ_SowInventory.createOne\",\"Econ_SowInventory.createMany\",\"Econ_SowInventory.updateOne\",\"Econ_SowInventory.updateMany\",\"Econ_SowInventory.upsertOne\",\"Econ_SowInventory.deleteOne\",\"Econ_SowInventory.deleteMany\",\"Econ_SowInventory.groupBy\",\"Econ_SowInventory.aggregate\",\"ScraperCache.findUnique\",\"ScraperCache.findUniqueOrThrow\",\"ScraperCache.findFirst\",\"ScraperCache.findFirstOrThrow\",\"ScraperCache.findMany\",\"ScraperCache.createOne\",\"ScraperCache.createMany\",\"ScraperCache.updateOne\",\"ScraperCache.updateMany\",\"ScraperCache.upsertOne\",\"ScraperCache.deleteOne\",\"ScraperCache.deleteMany\",\"ScraperCache.groupBy\",\"ScraperCache.aggregate\",\"OilPriceHistory.findUnique\",\"OilPriceHistory.findUniqueOrThrow\",\"OilPriceHistory.findFirst\",\"OilPriceHistory.findFirstOrThrow\",\"OilPriceHistory.findMany\",\"OilPriceHistory.createOne\",\"OilPriceHistory.createMany\",\"OilPriceHistory.updateOne\",\"OilPriceHistory.updateMany\",\"OilPriceHistory.upsertOne\",\"OilPriceHistory.deleteOne\",\"OilPriceHistory.deleteMany\",\"OilPriceHistory.groupBy\",\"OilPriceHistory.aggregate\",\"MihomeAccount.findUnique\",\"MihomeAccount.findUniqueOrThrow\",\"MihomeAccount.findFirst\",\"MihomeAccount.findFirstOrThrow\",\"MihomeAccount.findMany\",\"MihomeAccount.createOne\",\"MihomeAccount.createMany\",\"MihomeAccount.updateOne\",\"MihomeAccount.updateMany\",\"MihomeAccount.upsertOne\",\"MihomeAccount.deleteOne\",\"MihomeAccount.deleteMany\",\"MihomeAccount.groupBy\",\"MihomeAccount.aggregate\",\"home\",\"device\",\"samples\",\"hours\",\"devices\",\"MihomeHome.findUnique\",\"MihomeHome.findUniqueOrThrow\",\"MihomeHome.findFirst\",\"MihomeHome.findFirstOrThrow\",\"MihomeHome.findMany\",\"MihomeHome.createOne\",\"MihomeHome.createMany\",\"MihomeHome.updateOne\",\"MihomeHome.updateMany\",\"MihomeHome.upsertOne\",\"MihomeHome.deleteOne\",\"MihomeHome.deleteMany\",\"MihomeHome.groupBy\",\"MihomeHome.aggregate\",\"MihomeDevice.findUnique\",\"MihomeDevice.findUniqueOrThrow\",\"MihomeDevice.findFirst\",\"MihomeDevice.findFirstOrThrow\",\"MihomeDevice.findMany\",\"MihomeDevice.createOne\",\"MihomeDevice.createMany\",\"MihomeDevice.updateOne\",\"MihomeDevice.updateMany\",\"MihomeDevice.upsertOne\",\"MihomeDevice.deleteOne\",\"MihomeDevice.deleteMany\",\"MihomeDevice.groupBy\",\"MihomeDevice.aggregate\",\"MihomeEnvSample.findUnique\",\"MihomeEnvSample.findUniqueOrThrow\",\"MihomeEnvSample.findFirst\",\"MihomeEnvSample.findFirstOrThrow\",\"MihomeEnvSample.findMany\",\"MihomeEnvSample.createOne\",\"MihomeEnvSample.createMany\",\"MihomeEnvSample.updateOne\",\"MihomeEnvSample.updateMany\",\"MihomeEnvSample.upsertOne\",\"MihomeEnvSample.deleteOne\",\"MihomeEnvSample.deleteMany\",\"MihomeEnvSample.groupBy\",\"MihomeEnvSample.aggregate\",\"MihomeEnvHour.findUnique\",\"MihomeEnvHour.findUniqueOrThrow\",\"MihomeEnvHour.findFirst\",\"MihomeEnvHour.findFirstOrThrow\",\"MihomeEnvHour.findMany\",\"MihomeEnvHour.createOne\",\"MihomeEnvHour.createMany\",\"MihomeEnvHour.updateOne\",\"MihomeEnvHour.updateMany\",\"MihomeEnvHour.upsertOne\",\"MihomeEnvHour.deleteOne\",\"MihomeEnvHour.deleteMany\",\"MihomeEnvHour.groupBy\",\"MihomeEnvHour.aggregate\",\"AND\",\"OR\",\"NOT\",\"id\",\"deviceId\",\"hour\",\"temperatureAvg\",\"humidityAvg\",\"raw\",\"createdAt\",\"equals\",\"string_contains\",\"string_starts_with\",\"string_ends_with\",\"array_starts_with\",\"array_ends_with\",\"array_contains\",\"lt\",\"lte\",\"gt\",\"gte\",\"not\",\"in\",\"notIn\",\"date\",\"temperature\",\"humidity\",\"temperatureMin\",\"temperatureMax\",\"humidityMin\",\"humidityMax\",\"origin\",\"sampledAt\",\"contains\",\"startsWith\",\"endsWith\",\"search\",\"did\",\"homeId\",\"model\",\"name\",\"alias\",\"tempSiid\",\"tempPiid\",\"humSiid\",\"humPiid\",\"battSiid\",\"battPiid\",\"battery\",\"batteryAt\",\"enabled\",\"lastSyncAt\",\"every\",\"some\",\"none\",\"deviceId_hour\",\"deviceId_date\",\"key\",\"userId\",\"status\",\"lastError\",\"updatedAt\",\"province\",\"fuel\",\"price\",\"source\",\"date_province_fuel\",\"scraperName\",\"lastDataHash\",\"lastUpdateAt\",\"metadata\",\"month\",\"inventory\",\"url\",\"latencyMs\",\"message\",\"lastCheckAt\",\"uuid\",\"period\",\"cpu\",\"ram\",\"load\",\"disk\",\"netIn\",\"netOut\",\"process\",\"connections\",\"uuid_period\",\"cpuName\",\"os\",\"region\",\"memTotal\",\"diskTotal\",\"cpuCores\",\"cpuUsage\",\"ramUsed\",\"swapUsed\",\"load1\",\"load5\",\"load15\",\"diskUsed\",\"uptime\",\"recordedAt\",\"indicatorName\",\"valueA\",\"valueB\",\"sourceA\",\"sourceB\",\"diff\",\"diffRatio\",\"title\",\"summary\",\"content\",\"publishedAt\",\"impactRank\",\"title_publishedAt\",\"indicatorId\",\"value\",\"groupName\",\"unit\",\"frequency\",\"hidden\",\"indicatorId_period\",\"description\",\"slug\",\"email\",\"password\",\"is\",\"isNot\",\"connectOrCreate\",\"upsert\",\"createMany\",\"set\",\"disconnect\",\"delete\",\"connect\",\"updateMany\",\"deleteMany\",\"_relevance\",\"increment\",\"decrement\",\"multiply\",\"divide\"]"), - graph: "2gWUAfwBCY8CAACFBAAwkAIAAAQAEJECAACFBAAwkgICAAAAAZgCQADJAwAhtwIBAMgDACHMAkAAyQMAIYwDAQAAAAGNAwEAyAMAIQEAAAABACABAAAAAQAgCY8CAACFBAAwkAIAAAQAEJECAACFBAAwkgICAMcDACGYAkAAyQMAIbcCAQDIAwAhzAJAAMkDACGMAwEAyAMAIY0DAQDIAwAhAZkDAADCBQAgAwAAAAQAIAMAAAUAMAQAAAEAIAMAAAAEACADAAAFADAEAAABACADAAAABAAgAwAABQAwBAAAAQAgBpICAgAAAAGYAkAAAAABtwIBAAAAAcwCQAAAAAGMAwEAAAABjQMBAAAAAQEIAAAJACAGkgICAAAAAZgCQAAAAAG3AgEAAAABzAJAAAAAAYwDAQAAAAGNAwEAAAABAQgAAAsAMAaSAgIAjgQAIZgCQACMBAAhtwIBAJYEACHMAkAAjAQAIYwDAQCWBAAhjQMBAJYEACECAAAAAQAgCAAADQAgBpICAgCOBAAhmAJAAIwEACG3AgEAlgQAIcwCQACMBAAhjAMBAJYEACGNAwEAlgQAIQIAAAAEACAIAAAPACADAAAAAQAgDQAACQAgDgAADQAgAQAAAAEAIAEAAAAEACAFEwAAvQUAIBQAAL4FACAVAADBBQAgFgAAwAUAIBcAAL8FACAJjwIAAIQEADCQAgAAFQAQkQIAAIQEADCSAgIAqAMAIZgCQACpAwAhtwIBALYDACHMAkAAqQMAIYwDAQC2AwAhjQMBALYDACEDAAAABAAgAwAAFAAwEgAAFQAgAwAAAAQAIAMAAAUAMAQAAAEAIAqPAgAAgwQAMJACAAAbABCRAgAAgwQAMJICAgAAAAGYAkAAyQMAIacCAQDIAwAhzAJAAMkDACH9AgEAyAMAIf8CAQDIAwAhiwMBAAAAAQEAAAAYACABAAAAGAAgCo8CAACDBAAwkAIAABsAEJECAACDBAAwkgICAMcDACGYAkAAyQMAIacCAQDIAwAhzAJAAMkDACH9AgEAyAMAIf8CAQDIAwAhiwMBAMgDACEBmQMAALwFACADAAAAGwAgAwAAHAAwBAAAGAAgAwAAABsAIAMAABwAMAQAABgAIAMAAAAbACADAAAcADAEAAAYACAHkgICAAAAAZgCQAAAAAGnAgEAAAABzAJAAAAAAf0CAQAAAAH_AgEAAAABiwMBAAAAAQEIAAAgACAHkgICAAAAAZgCQAAAAAGnAgEAAAABzAJAAAAAAf0CAQAAAAH_AgEAAAABiwMBAAAAAQEIAAAiADAHkgICAI4EACGYAkAAjAQAIacCAQCWBAAhzAJAAIwEACH9AgEAlgQAIf8CAQCWBAAhiwMBAJYEACECAAAAGAAgCAAAJAAgB5ICAgCOBAAhmAJAAIwEACGnAgEAlgQAIcwCQACMBAAh_QIBAJYEACH_AgEAlgQAIYsDAQCWBAAhAgAAABsAIAgAACYAIAMAAAAYACANAAAgACAOAAAkACABAAAAGAAgAQAAABsAIAUTAAC3BQAgFAAAuAUAIBUAALsFACAWAAC6BQAgFwAAuQUAIAqPAgAAggQAMJACAAAsABCRAgAAggQAMJICAgCoAwAhmAJAAKkDACGnAgEAtgMAIcwCQACpAwAh_QIBALYDACH_AgEAtgMAIYsDAQC2AwAhAwAAABsAIAMAACsAMBIAACwAIAMAAAAbACADAAAcADAEAAAYACAJCAAAgQQAII8CAACABAAwkAIAADIAEJECAACABAAwkgICAAAAAZgCQADJAwAhtwIBAMgDACHMAkAAyQMAIYoDAQDIAwAhAQAAAC8AIAEAAAAvACAJCAAAgQQAII8CAACABAAwkAIAADIAEJECAACABAAwkgICAMcDACGYAkAAyQMAIbcCAQDIAwAhzAJAAMkDACGKAwEAyAMAIQGZAwAAtgUAIAMAAAAyACADAAAzADAEAAAvACADAAAAMgAgAwAAMwAwBAAALwAgAwAAADIAIAMAADMAMAQAAC8AIAYIgAAAAAGSAgIAAAABmAJAAAAAAbcCAQAAAAHMAkAAAAABigMBAAAAAQEIAAA3ACAGCIAAAAABkgICAAAAAZgCQAAAAAG3AgEAAAABzAJAAAAAAYoDAQAAAAEBCAAAOQAwBgiAAAAAAZICAgCOBAAhmAJAAIwEACG3AgEAlgQAIcwCQACMBAAhigMBAJYEACECAAAALwAgCAAAOwAgBgiAAAAAAZICAgCOBAAhmAJAAIwEACG3AgEAlgQAIcwCQACMBAAhigMBAJYEACECAAAAMgAgCAAAPQAgAwAAAC8AIA0AADcAIA4AADsAIAEAAAAvACABAAAAMgAgBRMAALEFACAUAACyBQAgFQAAtQUAIBYAALQFACAXAACzBQAgCQgAAP4DACCPAgAA_QMAMJACAABDABCRAgAA_QMAMJICAgCoAwAhmAJAAKkDACG3AgEAtgMAIcwCQACpAwAhigMBALYDACEDAAAAMgAgAwAAQgAwEgAAQwAgAwAAADIAIAMAADMAMAQAAC8AIA43AAD5AwAgjwIAAPgDADCQAgAATgAQkQIAAPgDADCSAgIAAAABmAJAAMkDACG3AgEAAAABzAJAAMkDACHQAgEAyAMAIf0CAQDIAwAhhQMBAMgDACGGAwEAyAMAIYcDAQDIAwAhiAMgANYDACEBAAAARgAgCjYAAPwDACCPAgAA-wMAMJACAABIABCRAgAA-wMAMJICAgDHAwAhmAJAAMkDACHMAkAAyQMAId0CAQDIAwAhgwMCAMcDACGEAwgA4AMAIQI2AACvBQAgmQMAALAFACALNgAA_AMAII8CAAD7AwAwkAIAAEgAEJECAAD7AwAwkgICAAAAAZgCQADJAwAhzAJAAMkDACHdAgEAyAMAIYMDAgDHAwAhhAMIAOADACGJAwAA-gMAIAMAAABIACADAABJADAEAABKACABAAAASAAgAQAAAEYAIA43AAD5AwAgjwIAAPgDADCQAgAATgAQkQIAAPgDADCSAgIAxwMAIZgCQADJAwAhtwIBAMgDACHMAkAAyQMAIdACAQDIAwAh_QIBAMgDACGFAwEAyAMAIYYDAQDIAwAhhwMBAMgDACGIAyAA1gMAIQI3AACtBQAgmQMAAK4FACADAAAATgAgAwAATwAwBAAARgAgAwAAAE4AIAMAAE8AMAQAAEYAIAMAAABOACADAABPADAEAABGACALNwAArAUAIJICAgAAAAGYAkAAAAABtwIBAAAAAcwCQAAAAAHQAgEAAAAB_QIBAAAAAYUDAQAAAAGGAwEAAAABhwMBAAAAAYgDIAAAAAEBCAAAUwAgCpICAgAAAAGYAkAAAAABtwIBAAAAAcwCQAAAAAHQAgEAAAAB_QIBAAAAAYUDAQAAAAGGAwEAAAABhwMBAAAAAYgDIAAAAAEBCAAAVQAwCzcAAJ8FACCSAgIAjgQAIZgCQACMBAAhtwIBAJYEACHMAkAAjAQAIdACAQCWBAAh_QIBAJYEACGFAwEAlgQAIYYDAQCWBAAhhwMBAJYEACGIAyAAoQQAIQIAAABGACAIAABXACAKkgICAI4EACGYAkAAjAQAIbcCAQCWBAAhzAJAAIwEACHQAgEAlgQAIf0CAQCWBAAhhQMBAJYEACGGAwEAlgQAIYcDAQCWBAAhiAMgAKEEACECAAAATgAgCAAAWQAgAwAAAEYAIA0AAFMAIA4AAFcAIAEAAABGACABAAAATgAgBRMAAJoFACAUAACbBQAgFQAAngUAIBYAAJ0FACAXAACcBQAgDY8CAAD3AwAwkAIAAF8AEJECAAD3AwAwkgICAKgDACGYAkAAqQMAIbcCAQC2AwAhzAJAAKkDACHQAgEAtgMAIf0CAQC2AwAhhQMBALYDACGGAwEAtgMAIYcDAQC2AwAhiAMgAL8DACEDAAAATgAgAwAAXgAwEgAAXwAgAwAAAE4AIAMAAE8AMAQAAEYAIAEAAABKACABAAAASgAgAwAAAEgAIAMAAEkAMAQAAEoAIAMAAABIACADAABJADAEAABKACADAAAASAAgAwAASQAwBAAASgAgBzYAAJkFACCSAgIAAAABmAJAAAAAAcwCQAAAAAHdAgEAAAABgwMCAAAAAYQDCAAAAAEBCAAAZwAgBpICAgAAAAGYAkAAAAABzAJAAAAAAd0CAQAAAAGDAwIAAAABhAMIAAAAAQEIAABpADAHNgAAmAUAIJICAgCOBAAhmAJAAIwEACHMAkAAjAQAId0CAQCWBAAhgwMCAI4EACGEAwgA5gQAIQIAAABKACAIAABrACAGkgICAI4EACGYAkAAjAQAIcwCQACMBAAh3QIBAJYEACGDAwIAjgQAIYQDCADmBAAhAgAAAEgAIAgAAG0AIAMAAABKACANAABnACAOAABrACABAAAASgAgAQAAAEgAIAUTAACTBQAgFAAAlAUAIBUAAJcFACAWAACWBQAgFwAAlQUAIAmPAgAA9gMAMJACAABzABCRAgAA9gMAMJICAgCoAwAhmAJAAKkDACHMAkAAqQMAId0CAQC2AwAhgwMCAKgDACGEAwgA3QMAIQMAAABIACADAAByADASAABzACADAAAASAAgAwAASQAwBAAASgAgDY8CAAD0AwAwkAIAAHkAEJECAAD0AwAwkgICAAAAAZgCQADJAwAh0AIBAMgDACHYAgEAyAMAIf0CAQDIAwAh_gIBAMgDACH_AgEA1AMAIYADQADJAwAhgQMCAMcDACGCAwAA9QMAIAEAAAB2ACABAAAAdgAgDI8CAAD0AwAwkAIAAHkAEJECAAD0AwAwkgICAMcDACGYAkAAyQMAIdACAQDIAwAh2AIBAMgDACH9AgEAyAMAIf4CAQDIAwAh_wIBANQDACGAA0AAyQMAIYEDAgDHAwAhAv8CAACGBAAgmQMAAJIFACADAAAAeQAgAwAAegAwBAAAdgAgAwAAAHkAIAMAAHoAMAQAAHYAIAMAAAB5ACADAAB6ADAEAAB2ACAJkgICAAAAAZgCQAAAAAHQAgEAAAAB2AIBAAAAAf0CAQAAAAH-AgEAAAAB_wIBAAAAAYADQAAAAAGBAwIAAAABAQgAAH4AIAmSAgIAAAABmAJAAAAAAdACAQAAAAHYAgEAAAAB_QIBAAAAAf4CAQAAAAH_AgEAAAABgANAAAAAAYEDAgAAAAEBCAAAgAEAMAmSAgIAjgQAIZgCQACMBAAh0AIBAJYEACHYAgEAlgQAIf0CAQCWBAAh_gIBAJYEACH_AgEAnwQAIYADQACMBAAhgQMCAI4EACECAAAAdgAgCAAAggEAIAmSAgIAjgQAIZgCQACMBAAh0AIBAJYEACHYAgEAlgQAIf0CAQCWBAAh_gIBAJYEACH_AgEAnwQAIYADQACMBAAhgQMCAI4EACECAAAAeQAgCAAAhAEAIAMAAAB2ACANAAB-ACAOAACCAQAgAQAAAHYAIAEAAAB5ACAGEwAAjQUAIBQAAI4FACAVAACRBQAgFgAAkAUAIBcAAI8FACD_AgAAhgQAIAyPAgAA8wMAMJACAACKAQAQkQIAAPMDADCSAgIAqAMAIZgCQACpAwAh0AIBALYDACHYAgEAtgMAIf0CAQC2AwAh_gIBALYDACH_AgEAvQMAIYADQACpAwAhgQMCAKgDACEDAAAAeQAgAwAAiQEAMBIAAIoBACADAAAAeQAgAwAAegAwBAAAdgAgDY8CAADyAwAwkAIAAJABABCRAgAA8gMAMJICAgAAAAGYAkAAyQMAId0CAQDIAwAh9gIBAMgDACH3AggA4AMAIfgCCADgAwAh-QIBAMgDACH6AgEAyAMAIfsCCADgAwAh_AIIAOADACEBAAAAjQEAIAEAAACNAQAgDY8CAADyAwAwkAIAAJABABCRAgAA8gMAMJICAgDHAwAhmAJAAMkDACHdAgEAyAMAIfYCAQDIAwAh9wIIAOADACH4AggA4AMAIfkCAQDIAwAh-gIBAMgDACH7AggA4AMAIfwCCADgAwAhAZkDAACMBQAgAwAAAJABACADAACRAQAwBAAAjQEAIAMAAACQAQAgAwAAkQEAMAQAAI0BACADAAAAkAEAIAMAAJEBADAEAACNAQAgCpICAgAAAAGYAkAAAAAB3QIBAAAAAfYCAQAAAAH3AggAAAAB-AIIAAAAAfkCAQAAAAH6AgEAAAAB-wIIAAAAAfwCCAAAAAEBCAAAlQEAIAqSAgIAAAABmAJAAAAAAd0CAQAAAAH2AgEAAAAB9wIIAAAAAfgCCAAAAAH5AgEAAAAB-gIBAAAAAfsCCAAAAAH8AggAAAABAQgAAJcBADAKkgICAI4EACGYAkAAjAQAId0CAQCWBAAh9gIBAJYEACH3AggA5gQAIfgCCADmBAAh-QIBAJYEACH6AgEAlgQAIfsCCADmBAAh_AIIAOYEACECAAAAjQEAIAgAAJkBACAKkgICAI4EACGYAkAAjAQAId0CAQCWBAAh9gIBAJYEACH3AggA5gQAIfgCCADmBAAh-QIBAJYEACH6AgEAlgQAIfsCCADmBAAh_AIIAOYEACECAAAAkAEAIAgAAJsBACADAAAAjQEAIA0AAJUBACAOAACZAQAgAQAAAI0BACABAAAAkAEAIAUTAACHBQAgFAAAiAUAIBUAAIsFACAWAACKBQAgFwAAiQUAIA2PAgAA8QMAMJACAAChAQAQkQIAAPEDADCSAgIAqAMAIZgCQACpAwAh3QIBALYDACH2AgEAtgMAIfcCCADdAwAh-AIIAN0DACH5AgEAtgMAIfoCAQC2AwAh-wIIAN0DACH8AggA3QMAIQMAAACQAQAgAwAAoAEAMBIAAKEBACADAAAAkAEAIAMAAJEBADAEAACNAQAgHI8CAADwAwAwkAIAAKcBABCRAgAA8AMAMJICAgAAAAGYAkAAyQMAIbcCAQDIAwAhygIBAMgDACHMAkAAyQMAIdwCAQAAAAHiAgQA7QMAIeMCBADtAwAh5AICAMcDACHlAgIAxwMAIecCAQDIAwAh6AIBAMgDACHpAgEAyAMAIeoCBADtAwAh6wIEAO0DACHsAgIAxwMAIe0CCADgAwAh7gIEAO0DACHvAgQA7QMAIfACCADgAwAh8QIIAOADACHyAggA4AMAIfMCBADtAwAh9AIEAO0DACH1AkAAyQMAIQEAAACkAQAgAQAAAKQBACAcjwIAAPADADCQAgAApwEAEJECAADwAwAwkgICAMcDACGYAkAAyQMAIbcCAQDIAwAhygIBAMgDACHMAkAAyQMAIdwCAQDIAwAh4gIEAO0DACHjAgQA7QMAIeQCAgDHAwAh5QICAMcDACHnAgEAyAMAIegCAQDIAwAh6QIBAMgDACHqAgQA7QMAIesCBADtAwAh7AICAMcDACHtAggA4AMAIe4CBADtAwAh7wIEAO0DACHwAggA4AMAIfECCADgAwAh8gIIAOADACHzAgQA7QMAIfQCBADtAwAh9QJAAMkDACEBmQMAAIYFACADAAAApwEAIAMAAKgBADAEAACkAQAgAwAAAKcBACADAACoAQAwBAAApAEAIAMAAACnAQAgAwAAqAEAMAQAAKQBACAZkgICAAAAAZgCQAAAAAG3AgEAAAABygIBAAAAAcwCQAAAAAHcAgEAAAAB4gIEAAAAAeMCBAAAAAHkAgIAAAAB5QICAAAAAecCAQAAAAHoAgEAAAAB6QIBAAAAAeoCBAAAAAHrAgQAAAAB7AICAAAAAe0CCAAAAAHuAgQAAAAB7wIEAAAAAfACCAAAAAHxAggAAAAB8gIIAAAAAfMCBAAAAAH0AgQAAAAB9QJAAAAAAQEIAACsAQAgGZICAgAAAAGYAkAAAAABtwIBAAAAAcoCAQAAAAHMAkAAAAAB3AIBAAAAAeICBAAAAAHjAgQAAAAB5AICAAAAAeUCAgAAAAHnAgEAAAAB6AIBAAAAAekCAQAAAAHqAgQAAAAB6wIEAAAAAewCAgAAAAHtAggAAAAB7gIEAAAAAe8CBAAAAAHwAggAAAAB8QIIAAAAAfICCAAAAAHzAgQAAAAB9AIEAAAAAfUCQAAAAAEBCAAArgEAMBmSAgIAjgQAIZgCQACMBAAhtwIBAJYEACHKAgEAlgQAIcwCQACMBAAh3AIBAJYEACHiAgQA_wQAIeMCBAD_BAAh5AICAI4EACHlAgIAjgQAIecCAQCWBAAh6AIBAJYEACHpAgEAlgQAIeoCBAD_BAAh6wIEAP8EACHsAgIAjgQAIe0CCADmBAAh7gIEAP8EACHvAgQA_wQAIfACCADmBAAh8QIIAOYEACHyAggA5gQAIfMCBAD_BAAh9AIEAP8EACH1AkAAjAQAIQIAAACkAQAgCAAAsAEAIBmSAgIAjgQAIZgCQACMBAAhtwIBAJYEACHKAgEAlgQAIcwCQACMBAAh3AIBAJYEACHiAgQA_wQAIeMCBAD_BAAh5AICAI4EACHlAgIAjgQAIecCAQCWBAAh6AIBAJYEACHpAgEAlgQAIeoCBAD_BAAh6wIEAP8EACHsAgIAjgQAIe0CCADmBAAh7gIEAP8EACHvAgQA_wQAIfACCADmBAAh8QIIAOYEACHyAggA5gQAIfMCBAD_BAAh9AIEAP8EACH1AkAAjAQAIQIAAACnAQAgCAAAsgEAIAMAAACkAQAgDQAArAEAIA4AALABACABAAAApAEAIAEAAACnAQAgBRMAAIEFACAUAACCBQAgFQAAhQUAIBYAAIQFACAXAACDBQAgHI8CAADvAwAwkAIAALgBABCRAgAA7wMAMJICAgCoAwAhmAJAAKkDACG3AgEAtgMAIcoCAQC2AwAhzAJAAKkDACHcAgEAtgMAIeICBADpAwAh4wIEAOkDACHkAgIAqAMAIeUCAgCoAwAh5wIBALYDACHoAgEAtgMAIekCAQC2AwAh6gIEAOkDACHrAgQA6QMAIewCAgCoAwAh7QIIAN0DACHuAgQA6QMAIe8CBADpAwAh8AIIAN0DACHxAggA3QMAIfICCADdAwAh8wIEAOkDACH0AgQA6QMAIfUCQACpAwAhAwAAAKcBACADAAC3AQAwEgAAuAEAIAMAAACnAQAgAwAAqAEAMAQAAKQBACAQjwIAAOwDADCQAgAAvgEAEJECAADsAwAwkgICAAAAAZgCQADJAwAh3AIBAMgDACHdAkAAyQMAId4CCADgAwAh3wIEAO0DACHgAggA4AMAIeECBADtAwAh4gIEAO0DACHjAgQA7QMAIeQCAgDHAwAh5QICAMcDACHmAgAA7gMAIAEAAAC7AQAgAQAAALsBACAPjwIAAOwDADCQAgAAvgEAEJECAADsAwAwkgICAMcDACGYAkAAyQMAIdwCAQDIAwAh3QJAAMkDACHeAggA4AMAId8CBADtAwAh4AIIAOADACHhAgQA7QMAIeICBADtAwAh4wIEAO0DACHkAgIAxwMAIeUCAgDHAwAhAZkDAACABQAgAwAAAL4BACADAAC_AQAwBAAAuwEAIAMAAAC-AQAgAwAAvwEAMAQAALsBACADAAAAvgEAIAMAAL8BADAEAAC7AQAgDJICAgAAAAGYAkAAAAAB3AIBAAAAAd0CQAAAAAHeAggAAAAB3wIEAAAAAeACCAAAAAHhAgQAAAAB4gIEAAAAAeMCBAAAAAHkAgIAAAAB5QICAAAAAQEIAADDAQAgDJICAgAAAAGYAkAAAAAB3AIBAAAAAd0CQAAAAAHeAggAAAAB3wIEAAAAAeACCAAAAAHhAgQAAAAB4gIEAAAAAeMCBAAAAAHkAgIAAAAB5QICAAAAAQEIAADFAQAwDJICAgCOBAAhmAJAAIwEACHcAgEAlgQAId0CQACMBAAh3gIIAOYEACHfAgQA_wQAIeACCADmBAAh4QIEAP8EACHiAgQA_wQAIeMCBAD_BAAh5AICAI4EACHlAgIAjgQAIQIAAAC7AQAgCAAAxwEAIAySAgIAjgQAIZgCQACMBAAh3AIBAJYEACHdAkAAjAQAId4CCADmBAAh3wIEAP8EACHgAggA5gQAIeECBAD_BAAh4gIEAP8EACHjAgQA_wQAIeQCAgCOBAAh5QICAI4EACECAAAAvgEAIAgAAMkBACADAAAAuwEAIA0AAMMBACAOAADHAQAgAQAAALsBACABAAAAvgEAIAUTAAD6BAAgFAAA-wQAIBUAAP4EACAWAAD9BAAgFwAA_AQAIA-PAgAA6AMAMJACAADPAQAQkQIAAOgDADCSAgIAqAMAIZgCQACpAwAh3AIBALYDACHdAkAAqQMAId4CCADdAwAh3wIEAOkDACHgAggA3QMAIeECBADpAwAh4gIEAOkDACHjAgQA6QMAIeQCAgCoAwAh5QICAKgDACEDAAAAvgEAIAMAAM4BADASAADPAQAgAwAAAL4BACADAAC_AQAwBAAAuwEAIAyPAgAA5wMAMJACAADVAQAQkQIAAOcDADCSAgIAAAABmAJAAMkDACG3AgEAAAABygIBAMgDACHMAkAAyQMAIdgCAQDIAwAh2QICAMcDACHaAgEAyAMAIdsCQADJAwAhAQAAANIBACABAAAA0gEAIAyPAgAA5wMAMJACAADVAQAQkQIAAOcDADCSAgIAxwMAIZgCQADJAwAhtwIBAMgDACHKAgEAyAMAIcwCQADJAwAh2AIBAMgDACHZAgIAxwMAIdoCAQDIAwAh2wJAAMkDACEBmQMAAPkEACADAAAA1QEAIAMAANYBADAEAADSAQAgAwAAANUBACADAADWAQAwBAAA0gEAIAMAAADVAQAgAwAA1gEAMAQAANIBACAJkgICAAAAAZgCQAAAAAG3AgEAAAABygIBAAAAAcwCQAAAAAHYAgEAAAAB2QICAAAAAdoCAQAAAAHbAkAAAAABAQgAANoBACAJkgICAAAAAZgCQAAAAAG3AgEAAAABygIBAAAAAcwCQAAAAAHYAgEAAAAB2QICAAAAAdoCAQAAAAHbAkAAAAABAQgAANwBADAJkgICAI4EACGYAkAAjAQAIbcCAQCWBAAhygIBAJYEACHMAkAAjAQAIdgCAQCWBAAh2QICAI4EACHaAgEAlgQAIdsCQACMBAAhAgAAANIBACAIAADeAQAgCZICAgCOBAAhmAJAAIwEACG3AgEAlgQAIcoCAQCWBAAhzAJAAIwEACHYAgEAlgQAIdkCAgCOBAAh2gIBAJYEACHbAkAAjAQAIQIAAADVAQAgCAAA4AEAIAMAAADSAQAgDQAA2gEAIA4AAN4BACABAAAA0gEAIAEAAADVAQAgBRMAAPQEACAUAAD1BAAgFQAA-AQAIBYAAPcEACAXAAD2BAAgDI8CAADmAwAwkAIAAOYBABCRAgAA5gMAMJICAgCoAwAhmAJAAKkDACG3AgEAtgMAIcoCAQC2AwAhzAJAAKkDACHYAgEAtgMAIdkCAgCoAwAh2gIBALYDACHbAkAAqQMAIQMAAADVAQAgAwAA5QEAMBIAAOYBACADAAAA1QEAIAMAANYBADAEAADSAQAgCI8CAADlAwAwkAIAAOwBABCRAgAA5QMAMJICAgAAAAGYAkAAyQMAIcwCQADJAwAh1gIBAAAAAdcCAgDHAwAhAQAAAOkBACABAAAA6QEAIAiPAgAA5QMAMJACAADsAQAQkQIAAOUDADCSAgIAxwMAIZgCQADJAwAhzAJAAMkDACHWAgEAyAMAIdcCAgDHAwAhAZkDAADzBAAgAwAAAOwBACADAADtAQAwBAAA6QEAIAMAAADsAQAgAwAA7QEAMAQAAOkBACADAAAA7AEAIAMAAO0BADAEAADpAQAgBZICAgAAAAGYAkAAAAABzAJAAAAAAdYCAQAAAAHXAgIAAAABAQgAAPEBACAFkgICAAAAAZgCQAAAAAHMAkAAAAAB1gIBAAAAAdcCAgAAAAEBCAAA8wEAMAWSAgIAjgQAIZgCQACMBAAhzAJAAIwEACHWAgEAlgQAIdcCAgCOBAAhAgAAAOkBACAIAAD1AQAgBZICAgCOBAAhmAJAAIwEACHMAkAAjAQAIdYCAQCWBAAh1wICAI4EACECAAAA7AEAIAgAAPcBACADAAAA6QEAIA0AAPEBACAOAAD1AQAgAQAAAOkBACABAAAA7AEAIAUTAADuBAAgFAAA7wQAIBUAAPIEACAWAADxBAAgFwAA8AQAIAiPAgAA5AMAMJACAAD9AQAQkQIAAOQDADCSAgIAqAMAIZgCQACpAwAhzAJAAKkDACHWAgEAtgMAIdcCAgCoAwAhAwAAAOwBACADAAD8AQAwEgAA_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wIBAAAAAcwCQAAAAAEBCAAAuAIAMAaSAgIAjgQAIcgCAQCWBAAhyQIBAJYEACHKAgEAlgQAIcsCAQCWBAAhzAJAAIwEACECAAAArgIAIAgAALoCACAGkgICAI4EACHIAgEAlgQAIckCAQCWBAAhygIBAJYEACHLAgEAlgQAIcwCQACMBAAhAgAAALECACAIAAC8AgAgAwAAAK4CACANAAC2AgAgDgAAugIAIAEAAACuAgAgAQAAALECACAFEwAA2wQAIBQAANwEACAVAADfBAAgFgAA3gQAIBcAAN0EACAJjwIAANoDADCQAgAAwgIAEJECAADaAwAwkgICAKgDACHIAgEAtgMAIckCAQC2AwAhygIBALYDACHLAgEAtgMAIcwCQACpAwAhAwAAALECACADAADBAgAwEgAAwgIAIAMAAACxAgAgAwAAsgIAMAQAAK4CACAI1gEAAMoDACCPAgAAxgMAMJACAADXAgAQkQIAAMYDADCSAgIAAAABmAJAAMkDACG1AgEAAAABtwIBAMgDACEBAAAAxQIAIBfSAQAA1wMAINQBAADYAwAg1QEAANkDACCPAgAA0wMAMJACAADHAgAQkQIAANMDADCSAgIAxwMAIZgCQADJAwAhtAIBAMgDACG1AgEAyAMAIbYCAQDIAwAhtwIBAMgDACG4AgEA1AMAIbkCAgDHAwAhugICAMcDACG7AgIAxwMAIbwCAgDHAwAhvQICAMcDACG-AgIAxwMAIb8CAgDVAwAhwAJAANIDACHBAiAA1gMAIcICQADSAwAhCNIBAADXBAAg1AEAANgEACDVAQAA2QQAILgCAACGBAAgvwIAAIYEACDAAgAAhgQAIMICAACGBAAgmQMAANoEACAX0gEAANcDACDUAQAA2AMAINUBAADZAwAgjwIAANMDADCQAgAAxwIAEJECAADTAwAwkgICAAAAAZgCQADJAwAhtAIBAAAAAbUCAQDIAwAhtgIBAMgDACG3AgEAyAMAIbgCAQDUAwAhuQICAMcDACG6AgIAxwMAIbsCAgDHAwAhvAICAMcDACG9AgIAxwMAIb4CAgDHAwAhvwICANUDACHAAkAA0gMAIcECIADWAwAhwgJAANIDACEDAAAAxwIAIAMAAMgCADAEAADJAgAgE9MBAADPAwAgjwIAANEDADCQAgAAywIAEJECAADRAwAwkgICAMcDACGTAgIAxwMAIZUCCADNAwAhlgIIAM0DACGXAgAAzgMAIJgCQADJAwAhpwJAAMkDACGoAggAzQMAIakCCADNAwAhqgIIAM0DACGrAggAzQMAIawCCADNAwAhrQIIAM0DACGuAgEAyAMAIa8CQADSAwAhDNMBAADVBAAglQIAAIYEACCWAgAAhgQAIJcCAACGBAAgqAIAAIYEACCpAgAAhgQAIKoCAACGBAAgqwIAAIYEACCsAgAAhgQAIK0CAACGBAAgrwIAAIYEACCZAwAA1gQAIBTTAQAAzwMAII8CAADRAwAwkAIAAMsCABCRAgAA0QMAMJICAgAAAAGTAgIAxwMAIZUCCADNAwAhlgIIAM0DACGXAgAAzgMAIJgCQADJAwAhpwJAAMkDACGoAggAzQMAIakCCADNAwAhqgIIAM0DACGrAggAzQMAIawCCADNAwAhrQIIAM0DACGuAgEAyAMAIa8CQADSAwAhxwIAANADACADAAAAywIAIAMAAMwCADAEAADNAgAgC9MBAADPAwAgjwIAAMwDADCQAgAAzwIAEJECAADMAwAwkgICAMcDACGTAgIAxwMAIZQCQADJAwAhlQIIAM0DACGWAggAzQMAIZcCAADOAwAgmAJAAMkDACEE0wEAANUEACCVAgAAhgQAIJYCAACGBAAglwIAAIYEACAM0wEAAM8DACCPAgAAzAMAMJACAADPAgAQkQIAAMwDADCSAgIAAAABkwICAMcDACGUAkAAyQMAIZUCCADNAwAhlgIIAM0DACGXAgAAzgMAIJgCQADJAwAhxgIAAMsDACADAAAAzwIAIAMAANACADAEAADRAgAgAQAAAMsCACABAAAAzwIAIAEAAADHAgAgAQAAAMUCACAI1gEAAMoDACCPAgAAxgMAMJACAADXAgAQkQIAAMYDADCSAgIAxwMAIZgCQADJAwAhtQIBAMgDACG3AgEAyAMAIQLWAQAA0wQAIJkDAADUBAAgAwAAANcCACADAADYAgAwBAAAxQIAIAMAAADXAgAgAwAA2AIAMAQAAMUCACADAAAA1wIAIAMAANgCADAEAADFAgAgBdYBAADSBAAgkgICAAAAAZgCQAAAAAG1AgEAAAABtwIBAAAAAQEIAADcAgAgBJICAgAAAAGYAkAAAAABtQIBAAAAAbcCAQAAAAEBCAAA3gIAMAXWAQAAxQQAIJICAgCOBAAhmAJAAIwEACG1AgEAlgQAIbcCAQCWBAAhAgAAAMUCACAIAADgAgAgBJICAgCOBAAhmAJAAIwEACG1AgEAlgQAIbcCAQCWBAAhAgAAANcCACAIAADiAgAgAwAAAMUCACANAADcAgAgDgAA4AIAIAEAAADFAgAgAQAAANcCACAFEwAAwAQAIBQAAMEEACAVAADEBAAgFgAAwwQAIBcAAMIEACAHjwIAAMUDADCQAgAA6AIAEJECAADFAwAwkgICAKgDACGYAkAAqQMAIbUCAQC2AwAhtwIBALYDACEDAAAA1wIAIAMAAOcCADASAADoAgAgAwAAANcCACADAADYAgAwBAAAxQIAIAEAAADJAgAgAQAAAMkCACADAAAAxwIAIAMAAMgCADAEAADJAgAgAwAAAMcCACADAADIAgAwBAAAyQIAIAMAAADHAgAgAwAAyAIAMAQAAMkCACAU0gEAAL0EACDUAQAAvgQAINUBAAC_BAAgkgICAAAAAZgCQAAAAAG0AgEAAAABtQIBAAAAAbYCAQAAAAG3AgEAAAABuAIBAAAAAbkCAgAAAAG6AgIAAAABuwICAAAAAbwCAgAAAAG9AgIAAAABvgICAAAAAb8CAgAAAAHAAkAAAAABwQIgAAAAAcICQAAAAAEBCAAA8AIAIBGSAgIAAAABmAJAAAAAAbQCAQAAAAG1AgEAAAABtgIBAAAAAbcCAQAAAAG4AgEAAAABuQICAAAAAboCAgAAAAG7AgIAAAABvAICAAAAAb0CAgAAAAG-AgIAAAABvwICAAAAAcACQAAAAAHBAiAAAAABwgJAAAAAAQEIAADyAgAwFNIBAACiBAAg1AEAAKMEACDVAQAApAQAIJICAgCOBAAhmAJAAIwEACG0AgEAlgQAIbUCAQCWBAAhtgIBAJYEACG3AgEAlgQAIbgCAQCfBAAhuQICAI4EACG6AgIAjgQAIbsCAgCOBAAhvAICAI4EACG9AgIAjgQAIb4CAgCOBAAhvwICAKAEACHAAkAAlwQAIcECIAChBAAhwgJAAJcEACECAAAAyQIAIAgAAPQCACARkgICAI4EACGYAkAAjAQAIbQCAQCWBAAhtQIBAJYEACG2AgEAlgQAIbcCAQCWBAAhuAIBAJ8EACG5AgIAjgQAIboCAgCOBAAhuwICAI4EACG8AgIAjgQAIb0CAgCOBAAhvgICAI4EACG_AgIAoAQAIcACQACXBAAhwQIgAKEEACHCAkAAlwQAIQIAAADHAgAgCAAA9gIAIAMAAADJAgAgDQAA8AIAIA4AAPQCACABAAAAyQIAIAEAAADHAgAgCRMAAJoEACAUAACbBAAgFQAAngQAIBYAAJ0EACAXAACcBAAguAIAAIYEACC_AgAAhgQAIMACAACGBAAgwgIAAIYEACAUjwIAALwDADCQAgAA_AIAEJECAAC8AwAwkgICAKgDACGYAkAAqQMAIbQCAQC2AwAhtQIBALYDACG2AgEAtgMAIbcCAQC2AwAhuAIBAL0DACG5AgIAqAMAIboCAgCoAwAhuwICAKgDACG8AgIAqAMAIb0CAgCoAwAhvgICAKgDACG_AgIAvgMAIcACQAC3AwAhwQIgAL8DACHCAkAAtwMAIQMAAADHAgAgAwAA-wIAMBIAAPwCACADAAAAxwIAIAMAAMgCADAEAADJAgAgAQAAAM0CACABAAAAzQIAIAMAAADLAgAgAwAAzAIAMAQAAM0CACADAAAAywIAIAMAAMwCADAEAADNAgAgAwAAAMsCACADAADMAgAwBAAAzQIAIBDTAQAAmQQAIJICAgAAAAGTAgIAAAABlQIIAAAAAZYCCAAAAAGXAoAAAAABmAJAAAAAAacCQAAAAAGoAggAAAABqQIIAAAAAaoCCAAAAAGrAggAAAABrAIIAAAAAa0CCAAAAAGuAgEAAAABrwJAAAAAAQEIAACEAwAgD5ICAgAAAAGTAgIAAAABlQIIAAAAAZYCCAAAAAGXAoAAAAABmAJAAAAAAacCQAAAAAGoAggAAAABqQIIAAAAAaoCCAAAAAGrAggAAAABrAIIAAAAAa0CCAAAAAGuAgEAAAABrwJAAAAAAQEIAACGAwAwENMBAACYBAAgkgICAI4EACGTAgIAjgQAIZUCCACNBAAhlgIIAI0EACGXAoAAAAABmAJAAIwEACGnAkAAjAQAIagCCACNBAAhqQIIAI0EACGqAggAjQQAIasCCACNBAAhrAIIAI0EACGtAggAjQQAIa4CAQCWBAAhrwJAAJcEACECAAAAzQIAIAgAAIgDACAPkgICAI4EACGTAgIAjgQAIZUCCACNBAAhlgIIAI0EACGXAoAAAAABmAJAAIwEACGnAkAAjAQAIagCCACNBAAhqQIIAI0EACGqAggAjQQAIasCCACNBAAhrAIIAI0EACGtAggAjQQAIa4CAQCWBAAhrwJAAJcEACECAAAAywIAIAgAAIoDACADAAAAzQIAIA0AAIQDACAOAACIAwAgAQAAAM0CACABAAAAywIAIA8TAACRBAAgFAAAkgQAIBUAAJUEACAWAACUBAAgFwAAkwQAIJUCAACGBAAglgIAAIYEACCXAgAAhgQAIKgCAACGBAAgqQIAAIYEACCqAgAAhgQAIKsCAACGBAAgrAIAAIYEACCtAgAAhgQAIK8CAACGBAAgEo8CAAC1AwAwkAIAAJADABCRAgAAtQMAMJICAgCoAwAhkwICAKgDACGVAggAqgMAIZYCCACqAwAhlwIAAKsDACCYAkAAqQMAIacCQACpAwAhqAIIAKoDACGpAggAqgMAIaoCCACqAwAhqwIIAKoDACGsAggAqgMAIa0CCACqAwAhrgIBALYDACGvAkAAtwMAIQMAAADLAgAgAwAAjwMAMBIAAJADACADAAAAywIAIAMAAMwCADAEAADNAgAgAQAAANECACABAAAA0QIAIAMAAADPAgAgAwAA0AIAMAQAANECACADAAAAzwIAIAMAANACADAEAADRAgAgAwAAAM8CACADAADQAgAwBAAA0QIAIAjTAQAAkAQAIJICAgAAAAGTAgIAAAABlAJAAAAAAZUCCAAAAAGWAggAAAABlwKAAAAAAZgCQAAAAAEBCAAAmAMAIAeSAgIAAAABkwICAAAAAZQCQAAAAAGVAggAAAABlgIIAAAAAZcCgAAAAAGYAkAAAAABAQgAAJoDADAI0wEAAI8EACCSAgIAjgQAIZMCAgCOBAAhlAJAAIwEACGVAggAjQQAIZYCCACNBAAhlwKAAAAAAZgCQACMBAAhAgAAANECACAIAACcAwAgB5ICAgCOBAAhkwICAI4EACGUAkAAjAQAIZUCCACNBAAhlgIIAI0EACGXAoAAAAABmAJAAIwEACECAAAAzwIAIAgAAJ4DACADAAAA0QIAIA0AAJgDACAOAACcAwAgAQAAANECACABAAAAzwIAIAgTAACHBAAgFAAAiAQAIBUAAIsEACAWAACKBAAgFwAAiQQAIJUCAACGBAAglgIAAIYEACCXAgAAhgQAIAqPAgAApwMAMJACAACkAwAQkQIAAKcDADCSAgIAqAMAIZMCAgCoAwAhlAJAAKkDACGVAggAqgMAIZYCCACqAwAhlwIAAKsDACCYAkAAqQMAIQMAAADPAgAgAwAAowMAMBIAAKQDACADAAAAzwIAIAMAANACADAEAADRAgAgCo8CAACnAwAwkAIAAKQDABCRAgAApwMAMJICAgCoAwAhkwICAKgDACGUAkAAqQMAIZUCCACqAwAhlgIIAKoDACGXAgAAqwMAIJgCQACpAwAhDRMAALEDACAUAAC0AwAgFQAAsQMAIBYAALEDACAXAACxAwAgmQICAAAAAaACAgAAAAGhAgIAAAABogICAAAAAaMCAgAAAAGkAgIAswMAIaUCAgAAAASmAgIAAAAECxMAALEDACAWAACyAwAgFwAAsgMAIJkCQAAAAAGgAkAAAAABoQJAAAAAAaICQAAAAAGjAkAAAAABpAJAALADACGlAkAAAAAEpgJAA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-AgIAqAMAIb8CAgC-AwAhwAJAALcDACHBAiAAvwMAIcICQAC3AwAhDxMAAKwDACAWAADEAwAgFwAAxAMAIJkCAQAAAAGgAgEAAAABoQIBAAAAAaICAQAAAAGjAgEAAAABpAIBAMMDACGlAgEAAAAFpgIBAAAABbACAQAAAAGxAgEAAAABsgIBAAAAAbMCAQAAAAENEwAArAMAIBQAAK8DACAVAACsAwAgFgAArAMAIBcAAKwDACCZAgIAAAABoAICAAAAAaECAgAAAAGiAgIAAAABowICAAAAAaQCAgDCAwAhpQICAAAABaYCAgAAAAUFEwAAsQMAIBYAAMEDACAXAADBAwAgmQIgAAAAAaQCIADAAwAhBRMAALEDACAWAADBAwAgFwAAwQMAIJkCIAAAAAGkAiAAwAMAIQKZAiAAAAABpAIgAMEDACENEwAArAMAIBQAAK8DACAVAACsAwAgFgAArAMAIBcAAKwDACCZAgIAAAABoAICAAAAAaECAgAAAAGiAgIAAAABowICAAAAAaQCAgDCAwAhpQICAAAABaYCAgAAAAUPEwAArAMAIBYAAMQDACAXAADEAwAgmQIBAAAAAaACAQAAAAGhAgEAAAABogIBAAAAAaMCAQAAAAGkAgEAwwMAIaUCAQAAAAWmAgEAAAAFsAIBAAAAAbECAQAAAAGyAgEAAAABswIBAAAAAQyZAgEAAAABoAIBAAAAAaECAQAAAAGiAgEAAAABowIBAAAAAaQCAQDEAwAhpQIBAAAABaYCAQAAAAWwAgEAAAABsQIBAAAAAbICAQAAAAGzAgEAAAABB48CAADFAwAwkAIAAOgCABCRAgAAxQMAMJICAgCoAwAhmAJAAKkDACG1AgEAtgMAIbcCAQC2AwAhCNYBAADKAwAgjwIAAMYDADCQAgAA1wIAEJECAADGAwAwkgICAMcDACGYAkAAyQMAIbUCAQDIAwAhtwIBAMgDACEImQICAAAAAaACAgAAAAGhAgIAAAABogICAAAAAaMCAgAAAAGkAgIAsQMAIaUCAgAAAASmAgIAAAAEDJkCAQAAAAGgAgEAAAABoQIBAAAAAaICAQAAAAGjAgEAAAABpAIBALsDACGlAgEAAAAEpgIBAAAABLACAQAAAAGxAgEAAAABsgIBAAAAAbMCAQAAAAEImQJAAAAAAaACQAAAAAGhAkAAAAABogJAAAAAAaMCQAAAAAGkAkAAsgMAIaUCQAAAAASmAkAAAAAEA8MCAADHAgAgxAIAAMcCACDFAgAAxwIAIAKTAgIAAAABlAJAAAAAAQvTAQAAzwMAII8CAADMAwAwkAIAAM8CABCRAgAAzAMAMJICAgDHAwAhkwICAMcDACGUAkAAyQMAIZUCCADNAwAhlgIIAM0DACGXAgAAzgMAIJgCQADJAwAhCJkCCAAAAAGgAggAAAABoQIIAAAAAaICCAAAAAGjAggAAAABpAIIAK8DACGlAggAAAAFpgIIAAAABQyZAoAAAAABmgIBAAAAAZsCAQAAAAGcAgEAAAABnQKAAAAAAZ4CgAAAAAGfAoAAAAABoAKAAAAAAaECgAAAAAGiAoAAAAABowKAAAAAAaQCgAAAAAEZ0gEAANcDACDUAQAA2AMAINUBAADZAwAgjwIAANMDADCQAgAAxwIAEJECAADTAwAwkgICAMcDACGYAkAAyQMAIbQCAQDIAwAhtQIBAMgDACG2AgEAyAMAIbcCAQDIAwAhuAIBANQDACG5AgIAxwMAIboCAgDHAwAhuwICAMcDACG8AgIAxwMAIb0CAgDHAwAhvgICAMcDACG_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-AIIAN0DACH5AgEAtgMAIfoCAQC2AwAh-wIIAN0DACH8AggA3QMAIQ2PAgAA8gMAMJACAACQAQAQkQIAAPIDADCSAgIAxwMAIZgCQADJAwAh3QIBAMgDACH2AgEAyAMAIfcCCADgAwAh-AIIAOADACH5AgEAyAMAIfoCAQDIAwAh-wIIAOADACH8AggA4AMAIQyPAgAA8wMAMJACAACKAQAQkQIAAPMDADCSAgIAqAMAIZgCQACpAwAh0AIBALYDACHYAgEAtgMAIf0CAQC2AwAh_gIBALYDACH_AgEAvQMAIYADQACpAwAhgQMCAKgDACEMjwIAAPQDADCQAgAAeQAQkQIAAPQDADCSAgIAxwMAIZgCQADJAwAh0AIBAMgDACHYAgEAyAMAIf0CAQDIAwAh_gIBAMgDACH_AgEA1AMAIYADQADJAwAhgQMCAMcDACEC_QIBAAAAAYADQAAAAAEJjwIAAPYDADCQAgAAcwAQkQIAAPYDADCSAgIAqAMAIZgCQACpAwAhzAJAAKkDACHdAgEAtgMAIYMDAgCoAwAhhAMIAN0DACENjwIAAPcDADCQAgAAXwAQkQIAAPcDADCSAgIAqAMAIZgCQACpAwAhtwIBALYDACHMAkAAqQMAIdACAQC2AwAh_QIBALYDACGFAwEAtgMAIYYDAQC2AwAhhwMBALYDACGIAyAAvwMAIQ43AAD5AwAgjwIAAPgDADCQAgAATgAQkQIAAPgDADCSAgIAxwMAIZgCQADJAwAhtwIBAMgDACHMAkAAyQMAIdACAQDIAwAh_QIBAMgDACGFAwEAyAMAIYYDAQDIAwAhhwMBAMgDACGIAyAA1gMAIQPDAgAASAAgxAIAAEgAIMUCAABIACAC3QIBAAAAAYMDAgAAAAEKNgAA_AMAII8CAAD7AwAwkAIAAEgAEJECAAD7AwAwkgICAMcDACGYAkAAyQMAIcwCQADJAwAh3QIBAMgDACGDAwIAxwMAIYQDCADgAwAhEDcAAPkDACCPAgAA-AMAMJACAABOABCRAgAA-AMAMJICAgDHAwAhmAJAAMkDACG3AgEAyAMAIcwCQADJAwAh0AIBAMgDACH9AgEAyAMAIYUDAQDIAwAhhgMBAMgDACGHAwEAyAMAIYgDIADWAwAhjgMAAE4AII8DAABOACAJCAAA_gMAII8CAAD9AwAwkAIAAEMAEJECAAD9AwAwkgICAKgDACGYAkAAqQMAIbcCAQC2AwAhzAJAAKkDACGKAwEAtgMAIQ8TAACxAwAgFgAA_wMAIBcAAP8DACCZAoAAAAABmgIBAAAAAZsCAQAAAAGcAgEAAAABnQKAAAAAAZ4CgAAAAAGfAoAAAAABoAKAAAAAAaECgAAAAAGiAoAAAAABowKAAAAAAaQCgAAAAAEMmQKAAAAAAZoCAQAAAAGbAgEAAAABnAIBAAAAAZ0CgAAAAAGeAoAAAAABnwKAAAAAAaACgAAAAAGhAoAAAAABogKAAAAAAaMCgAAAAAGkAoAAAAABCQgAAIEEACCPAgAAgAQAMJACAAAyABCRAgAAgAQAMJICAgDHAwAhmAJAAMkDACG3AgEAyAMAIcwCQADJAwAhigMBAMgDACEMmQKAAAAAAZoCAQAAAAGbAgEAAAABnAIBAAAAAZ0CgAAAAAGeAoAAAAABnwKAAAAAAaACgAAAAAGhAoAAAAABogKAAAAAAaMCgAAAAAGkAoAAAAABCo8CAACCBAAwkAIAACwAEJECAACCBAAwkgICAKgDACGYAkAAqQMAIacCAQC2AwAhzAJAAKkDACH9AgEAtgMAIf8CAQC2AwAhiwMBALYDACEKjwIAAIMEADCQAgAAGwAQkQIAAIMEADCSAgIAxwMAIZgCQADJAwAhpwIBAMgDACHMAkAAyQMAIf0CAQDIAwAh_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_BAAgkgICAAAAAZgCQAAAAAG0AgEAAAABtgIBAAAAAbcCAQAAAAG4AgEAAAABuQICAAAAAboCAgAAAAG7AgIAAAABvAICAAAAAb0CAgAAAAG-AgIAAAABvwICAAAAAcACQAAAAAHBAiAAAAABwgJAAAAAAQIAAADJAgAgDQAA0QQAIAMAAADJAgAgDQAA0QQAIA4AANAEACABCAAAyQUAMBfSAQAA1wMAINQBAADYAwAg1QEAANkDACCPAgAA0wMAMJACAADHAgAQkQIAANMDADCSAgIAAAABmAJAAMkDACG0AgEAAAABtQIBAMgDACG2AgEAyAMAIbcCAQDIAwAhuAIBANQDACG5AgIAxwMAIboCAgDHAwAhuwICAMcDACG8AgIAxwMAIb0CAgDHAwAhvgICAMcDACG_AgIA1QMAIcACQADSAwAhwQIgANYDACHCAkAA0gMAIQIAAADJAgAgCAAA0AQAIAIAAADOBAAgCAAAzwQAIBSPAgAAzQQAMJACAADOBAAQkQIAAM0EADCSAgIAxwMAIZgCQADJAwAhtAIBAMgDACG1AgEAyAMAIbYCAQDIAwAhtwIBAMgDACG4AgEA1AMAIbkCAgDHAwAhugICAMcDACG7AgIAxwMAIbwCAgDHAwAhvQICAMcDACG-AgIAxwMAIb8CAgDVAwAhwAJAANIDACHBAiAA1gMAIcICQADSAwAhFI8CAADNBAAwkAIAAM4EABCRAgAAzQQAMJICAgDHAwAhmAJAAMkDACG0AgEAyAMAIbUCAQDIAwAhtgIBAMgDACG3AgEAyAMAIbgCAQDUAwAhuQICAMcDACG6AgIAxwMAIbsCAgDHAwAhvAICAMcDACG9AgIAxwMAIb4CAgDHAwAhvwICANUDACHAAkAA0gMAIcECIADWAwAhwgJAANIDACEQkgICAI4EACGYAkAAjAQAIbQCAQCWBAAhtgIBAJYEACG3AgEAlgQAIbgCAQCfBAAhuQICAI4EACG6AgIAjgQAIbsCAgCOBAAhvAICAI4EACG9AgIAjgQAIb4CAgCOBAAhvwICAKAEACHAAkAAlwQAIcECIAChBAAhwgJAAJcEACES1AEAAKMEACDVAQAApAQAIJICAgCOBAAhmAJAAIwEACG0AgEAlgQAIbYCAQCWBAAhtwIBAJYEACG4AgEAnwQAIbkCAgCOBAAhugICAI4EACG7AgIAjgQAIbwCAgCOBAAhvQICAI4EACG-AgIAjgQAIb8CAgCgBAAhwAJAAJcEACHBAiAAoQQAIcICQACXBAAhEtQBAAC-BAAg1QEAAL8EACCSAgIAAAABmAJAAAAAAbQCAQAAAAG2AgEAAAABtwIBAAAAAbgCAQAAAAG5AgIAAAABugICAAAAAbsCAgAAAAG8AgIAAAABvQICAAAAAb4CAgAAAAG_AgIAAAABwAJAAAAAAcECIAAAAAHCAkAAAAABBA0AAMYEADCQAwAAxwQAMJIDAADJBAAglgMAAMoEADAAAbMCAQAAAAEI0gEAANcEACDUAQAA2AQAINUBAADZBAAguAIAAIYEACC_AgAAhgQAIMACAACGBAAgwgIAAIYEACCZAwAA2gQAIAGzAgEAAAABAtYBAADTBAAgmQMAANQEACAAAAGzAgEAAAABAAAAAAABswIBAAAAAQAAAAAABZMDCAAAAAGaAwgAAAABmwMIAAAAAZwDCAAAAAGdAwgAAAABAbMCAQAAAAEAAAAAAAGzAgEAAAABAAAAAAABswIBAAAAAQAAAAAAAbMCAQAAAAEAAAAAAAWTAwQAAAABmgMEAAAAAZsDBAAAAAGcAwQAAAABnQMEAAAAAQGzAgEAAAABAAAAAAABswIBAAAAAQAAAAAAAbMCAQAAAAEAAAAAAAGzAgEAAAABAAAAAAAFDQAAxAUAIA4AAMcFACCQAwAAxQUAIJEDAADGBQAglgMAAEYAIAMNAADEBQAgkAMAAMUFACCWAwAARgAgAAAAAAALDQAAoAUAMA4AAKUFADCQAwAAoQUAMJEDAACiBQAwkgMAAKMFACCTAwAApAUAMJQDAACkBQAwlQMAAKQFADCWAwAApAUAMJcDAACmBQAwmAMAAKcFADAFkgICAAAAAZgCQAAAAAHMAkAAAAAB3QIBAAAAAYQDCAAAAAECAAAASgAgDQAAqwUAIAMAAABKACANAACrBQAgDgAAqgUAIAEIAADDBQAwCzYAAPwDACCPAgAA-wMAMJACAABIABCRAgAA-wMAMJICAgAAAAGYAkAAyQMAIcwCQADJAwAh3QIBAMgDACGDAwIAxwMAIYQDCADgAwAhiQMAAPoDACACAAAASgAgCAAAqgUAIAIAAACoBQAgCAAAqQUAIAmPAgAApwUAMJACAACoBQAQkQIAAKcFADCSAgIAxwMAIZgCQADJAwAhzAJAAMkDACHdAgEAyAMAIYMDAgDHAwAhhAMIAOADACEJjwIAAKcFADCQAgAAqAUAEJECAACnBQAwkgICAMcDACGYAkAAyQMAIcwCQADJAwAh3QIBAMgDACGDAwIAxwMAIYQDCADgAwAhBZICAgCOBAAhmAJAAIwEACHMAkAAjAQAId0CAQCWBAAhhAMIAOYEACEFkgICAI4EACGYAkAAjAQAIcwCQACMBAAh3QIBAJYEACGEAwgA5gQAIQWSAgIAAAABmAJAAAAAAcwCQAAAAAHdAgEAAAABhAMIAAAAAQQNAACgBQAwkAMAAKEFADCSAwAAowUAIJYDAACkBQAwAAGzAgEAAAABAjcAAK0FACCZAwAArgUAIAGzAgEAAAABAAAAAAABswIBAAAAAQAAAAAAAbMCAQAAAAEAAAAAAAGzAgEAAAABBZICAgAAAAGYAkAAAAABzAJAAAAAAd0CAQAAAAGEAwgAAAABCpICAgAAAAGYAkAAAAABtwIBAAAAAcwCQAAAAAHQAgEAAAAB_QIBAAAAAYUDAQAAAAGGAwEAAAABhwMBAAAAAYgDIAAAAAECAAAARgAgDQAAxAUAIAMAAABOACANAADEBQAgDgAAyAUAIAwAAABOACAIAADIBQAgkgICAI4EACGYAkAAjAQAIbcCAQCWBAAhzAJAAIwEACHQAgEAlgQAIf0CAQCWBAAhhQMBAJYEACGGAwEAlgQAIYcDAQCWBAAhiAMgAKEEACEKkgICAI4EACGYAkAAjAQAIbcCAQCWBAAhzAJAAIwEACHQAgEAlgQAIf0CAQCWBAAhhQMBAJYEACGGAwEAlgQAIYcDAQCWBAAhiAMgAKEEACEQkgICAAAAAZgCQAAAAAG0AgEAAAABtgIBAAAAAbcCAQAAAAG4AgEAAAABuQICAAAAAboCAgAAAAG7AgIAAAABvAICAAAAAb0CAgAAAAG-AgIAAAABvwICAAAAAcACQAAAAAHBAiAAAAABwgJAAAAAAQSSAgIAAAABmAJAAAAAAbUCAQAAAAG3AgEAAAABAgAAAMUCACANAADKBQAgDpICAgAAAAGVAggAAAABlgIIAAAAAZcCgAAAAAGYAkAAAAABpwJAAAAAAagCCAAAAAGpAggAAAABqgIIAAAAAasCCAAAAAGsAggAAAABrQIIAAAAAa4CAQAAAAGvAkAAAAABBpICAgAAAAGUAkAAAAABlQIIAAAAAZYCCAAAAAGXAoAAAAABmAJAAAAAAQMAAADXAgAgDQAAygUAIA4AANAFACAGAAAA1wIAIAgAANAFACCSAgIAjgQAIZgCQACMBAAhtQIBAJYEACG3AgEAlgQAIQSSAgIAjgQAIZgCQACMBAAhtQIBAJYEACG3AgEAlgQAIRPSAQAAvQQAINUBAAC_BAAgkgICAAAAAZgCQAAAAAG0AgEAAAABtQIBAAAAAbYCAQAAAAG3AgEAAAABuAIBAAAAAbkCAgAAAAG6AgIAAAABuwICAAAAAbwCAgAAAAG9AgIAAAABvgICAAAAAb8CAgAAAAHAAkAAAAABwQIgAAAAAcICQAAAAAECAAAAyQIAIA0AANEFACADAAAAxwIAIA0AANEFACAOAADVBQAgFQAAAMcCACAIAADVBQAg0gEAAKIEACDVAQAApAQAIJICAgCOBAAhmAJAAIwEACG0AgEAlgQAIbUCAQCWBAAhtgIBAJYEACG3AgEAlgQAIbgCAQCfBAAhuQICAI4EACG6AgIAjgQAIbsCAgCOBAAhvAICAI4EACG9AgIAjgQAIb4CAgCOBAAhvwICAKAEACHAAkAAlwQAIcECIAChBAAhwgJAAJcEACET0gEAAKIEACDVAQAApAQAIJICAgCOBAAhmAJAAIwEACG0AgEAlgQAIbUCAQCWBAAhtgIBAJYEACG3AgEAlgQAIbgCAQCfBAAhuQICAI4EACG6AgIAjgQAIbsCAgCOBAAhvAICAI4EACG9AgIAjgQAIb4CAgCOBAAhvwICAKAEACHAAkAAlwQAIcECIAChBAAhwgJAAJcEACET0gEAAL0EACDUAQAAvgQAIJICAgAAAAGYAkAAAAABtAIBAAAAAbUCAQAAAAG2AgEAAAABtwIBAAAAAbgCAQAAAAG5AgIAAAABugICAAAAAbsCAgAAAAG8AgIAAAABvQICAAAAAb4CAgAAAAG_AgIAAAABwAJAAAAAAcECIAAAAAHCAkAAAAABAgAAAMkCACANAADWBQAgAwAAAMcCACANAADWBQAgDgAA2gUAIBUAAADHAgAgCAAA2gUAINIBAACiBAAg1AEAAKMEACCSAgIAjgQAIZgCQACMBAAhtAIBAJYEACG1AgEAlgQAIbYCAQCWBAAhtwIBAJYEACG4AgEAnwQAIbkCAgCOBAAhugICAI4EACG7AgIAjgQAIbwCAgCOBAAhvQICAI4EACG-AgIAjgQAIb8CAgCgBAAhwAJAAJcEACHBAiAAoQQAIcICQACXBAAhE9IBAACiBAAg1AEAAKMEACCSAgIAjgQAIZgCQACMBAAhtAIBAJYEACG1AgEAlgQAIbYCAQCWBAAhtwIBAJYEACG4AgEAnwQAIbkCAgCOBAAhugICAI4EACG7AgIAjgQAIbwCAgCOBAAhvQICAI4EACG-AgIAjgQAIb8CAgCgBAAhwAJAAJcEACHBAiAAoQQAIcICQACXBAAhAAAFEwAEFAAFFQAGFgAHFwAIAAAAAAAFEwAEFAAFFQAGFgAHFwAIAAUTAAwUAA0VAA4WAA8XABAAAAAAAAUTAAwUAA0VAA4WAA8XABAABRMAFBQAFRUAFhYAFxcAGAAAAAAABRMAFBQAFRUAFhYAFxcAGAITABw3SxsBNgAaATdMAAUTAB4UAB8VACAWACEXACIAAAAAAAUTAB4UAB8VACAWACEXACIFEwAlFAAmFQAnFgAoFwApAAAAAAAFEwAlFAAmFQAnFgAoFwApAAUTAC0UAC4VAC8WADAXADEAAAAAAAUTAC0UAC4VAC8WADAXADEABRMANRQANhUANxYAOBcAOQAAAAAABRMANRQANhUANxYAOBcAOQAFEwA9FAA-FQA_FgBAFwBBAAAAAAAFEwA9FAA-FQA_FgBAFwBBAAUTAEUUAEYVAEcWAEgXAEkAAAAAAAUTAEUUAEYVAEcWAEgXAEkABRMATRQAThUATxYAUBcAUQAAAAAABRMATRQAThUATxYAUBcAUQAFEwBVFABWFQBXFgBYFwBZAAAAAAAFEwBVFABWFQBXFgBYFwBZAAUTAF0UAF4VAF8WAGAXAGEAAAAAAAUTAF0UAF4VAF8WAGAXAGEABRMAZRQAZhUAZxYAaBcAaQAAAAAABRMAZRQAZhUAZxYAaBcAaQAFEwBtFABuFQBvFgBwFwBxAAAAAAAFEwBtFABuFQBvFgBwFwBxAhMAeNYBygJ0BBMAd9IBAHPUAc4CddUB0gJ2AdMBAHQB0wEAdALUAdMCANUB1AIAAdYB1QIABRMAehQAexUAfBYAfRcAfgAAAAAABRMAehQAexUAfBYAfRcAfgUTAIEBFACCARUAgwEWAIQBFwCFAQAAAAAABRMAgQEUAIIBFQCDARYAhAEXAIUBBRMAiAEUAIkBFQCKARYAiwEXAIwBAAAAAAAFEwCIARQAiQEVAIoBFgCLARcAjAEFEwCPARQAkAEVAJEBFgCSARcAkwEAAAAAAAUTAI8BFACQARUAkQEWAJIBFwCTAQECAQIDAQUGAQYHAQcIAQkKAQoMAgsOAQwQAg8RARASARETAhgWAxkXCRoZChsaChwdCh0eCh4fCh8hCiAjAiElCiInAiMoCiQpCiUqAiYtCycuESgwEikxEio0Eis1Eiw2Ei04Ei46Ai88EjA-AjE_EjJAEjNBAjREEzVFGThHGjlNGjpQGjtRGjxSGj1UGj5WAj9YGkBaAkFbGkJcGkNdAkRgHUVhI0ZiG0djG0hkG0llG0pmG0toG0xqAk1sG05uAk9vG1BwG1FxAlJ0JFN1KlR3K1V4K1Z7K1d8K1h9K1l_K1qBAQJbgwErXIUBAl2GAStehwErX4gBAmCLASxhjAEyYo4BM2OPATNkkgEzZZMBM2aUATNnlgEzaJgBAmmaATNqnAECa50BM2yeATNtnwECbqIBNG-jATpwpQE7caYBO3KpATtzqgE7dKsBO3WtATt2rwECd7EBO3izAQJ5tAE7erUBO3u2AQJ8uQE8fboBQn68AUN_vQFDgAHAAUOBAcEBQ4IBwgFDgwHEAUOEAcYBAoUByAFDhgHKAQKHAcsBQ4gBzAFDiQHNAQKKAdABRIsB0QFKjAHTAUuNAdQBS44B1wFLjwHYAUuQAdkBS5EB2wFLkgHdAQKTAd8BS5QB4QEClQHiAUuWAeMBS5cB5AECmAHnAUyZAegBUpoB6gFTmwHrAVOcAe4BU50B7wFTngHwAVOfAfIBU6AB9AECoQH2AVOiAfgBAqMB-QFTpAH6AVOlAfsBAqYB_gFUpwH_AVqoAYECW6kBggJbqgGFAlurAYYCW6wBhwJbrQGJAluuAYsCAq8BjQJbsAGPAgKxAZACW7IBkQJbswGSAgK0AZUCXLUBlgJitgGYAmO3AZkCY7gBnAJjuQGdAmO6AZ4CY7sBoAJjvAGiAgK9AaQCY74BpgICvwGnAmPAAagCY8EBqQICwgGsAmTDAa0CasQBrwJrxQGwAmvGAbMCa8cBtAJryAG1AmvJAbcCa8oBuQICywG7AmvMAb0CAs0BvgJrzgG_AmvPAcACAtABwwJs0QHEAnLXAcYCc9gB1gJz2QHZAnPaAdoCc9sB2wJz3AHdAnPdAd8CAt4B4QJz3wHjAgLgAeQCc-EB5QJz4gHmAgLjAekCeeQB6gJ_5QHrAnTmAewCdOcB7QJ06AHuAnTpAe8CdOoB8QJ06wHzAgLsAfUCdO0B9wIC7gH4AnTvAfkCdPAB-gIC8QH9AoAB8gH-AoYB8wH_AnX0AYADdfUBgQN19gGCA3X3AYMDdfgBhQN1-QGHAwL6AYkDdfsBiwMC_AGMA3X9AY0Ddf4BjgMC_wGRA4cBgAKSA40BgQKTA3aCApQDdoMClQN2hAKWA3aFApcDdoYCmQN2hwKbAwKIAp0DdokCnwMCigKgA3aLAqEDdowCogMCjQKlA44BjgKmA5QB" + strings: JSON.parse("[\"where\",\"orderBy\",\"cursor\",\"user\",\"habit\",\"records\",\"_count\",\"habits\",\"checkIns\",\"list\",\"items\",\"checkLists\",\"templates\",\"User.findUnique\",\"User.findUniqueOrThrow\",\"User.findFirst\",\"User.findFirstOrThrow\",\"User.findMany\",\"data\",\"User.createOne\",\"User.createMany\",\"User.updateOne\",\"User.updateMany\",\"create\",\"update\",\"User.upsertOne\",\"User.deleteOne\",\"User.deleteMany\",\"having\",\"_avg\",\"_sum\",\"_min\",\"_max\",\"User.groupBy\",\"User.aggregate\",\"Article.findUnique\",\"Article.findUniqueOrThrow\",\"Article.findFirst\",\"Article.findFirstOrThrow\",\"Article.findMany\",\"Article.createOne\",\"Article.createMany\",\"Article.updateOne\",\"Article.updateMany\",\"Article.upsertOne\",\"Article.deleteOne\",\"Article.deleteMany\",\"Article.groupBy\",\"Article.aggregate\",\"Strategy.findUnique\",\"Strategy.findUniqueOrThrow\",\"Strategy.findFirst\",\"Strategy.findFirstOrThrow\",\"Strategy.findMany\",\"Strategy.createOne\",\"Strategy.createMany\",\"Strategy.updateOne\",\"Strategy.updateMany\",\"Strategy.upsertOne\",\"Strategy.deleteOne\",\"Strategy.deleteMany\",\"Strategy.groupBy\",\"Strategy.aggregate\",\"indicator\",\"points\",\"Indicator.findUnique\",\"Indicator.findUniqueOrThrow\",\"Indicator.findFirst\",\"Indicator.findFirstOrThrow\",\"Indicator.findMany\",\"Indicator.createOne\",\"Indicator.createMany\",\"Indicator.updateOne\",\"Indicator.updateMany\",\"Indicator.upsertOne\",\"Indicator.deleteOne\",\"Indicator.deleteMany\",\"Indicator.groupBy\",\"Indicator.aggregate\",\"IndicatorPoint.findUnique\",\"IndicatorPoint.findUniqueOrThrow\",\"IndicatorPoint.findFirst\",\"IndicatorPoint.findFirstOrThrow\",\"IndicatorPoint.findMany\",\"IndicatorPoint.createOne\",\"IndicatorPoint.createMany\",\"IndicatorPoint.updateOne\",\"IndicatorPoint.updateMany\",\"IndicatorPoint.upsertOne\",\"IndicatorPoint.deleteOne\",\"IndicatorPoint.deleteMany\",\"IndicatorPoint.groupBy\",\"IndicatorPoint.aggregate\",\"News.findUnique\",\"News.findUniqueOrThrow\",\"News.findFirst\",\"News.findFirstOrThrow\",\"News.findMany\",\"News.createOne\",\"News.createMany\",\"News.updateOne\",\"News.updateMany\",\"News.upsertOne\",\"News.deleteOne\",\"News.deleteMany\",\"News.groupBy\",\"News.aggregate\",\"Alert.findUnique\",\"Alert.findUniqueOrThrow\",\"Alert.findFirst\",\"Alert.findFirstOrThrow\",\"Alert.findMany\",\"Alert.createOne\",\"Alert.createMany\",\"Alert.updateOne\",\"Alert.updateMany\",\"Alert.upsertOne\",\"Alert.deleteOne\",\"Alert.deleteMany\",\"Alert.groupBy\",\"Alert.aggregate\",\"ServerNode.findUnique\",\"ServerNode.findUniqueOrThrow\",\"ServerNode.findFirst\",\"ServerNode.findFirstOrThrow\",\"ServerNode.findMany\",\"ServerNode.createOne\",\"ServerNode.createMany\",\"ServerNode.updateOne\",\"ServerNode.updateMany\",\"ServerNode.upsertOne\",\"ServerNode.deleteOne\",\"ServerNode.deleteMany\",\"ServerNode.groupBy\",\"ServerNode.aggregate\",\"ServerNodeHistory.findUnique\",\"ServerNodeHistory.findUniqueOrThrow\",\"ServerNodeHistory.findFirst\",\"ServerNodeHistory.findFirstOrThrow\",\"ServerNodeHistory.findMany\",\"ServerNodeHistory.createOne\",\"ServerNodeHistory.createMany\",\"ServerNodeHistory.updateOne\",\"ServerNodeHistory.updateMany\",\"ServerNodeHistory.upsertOne\",\"ServerNodeHistory.deleteOne\",\"ServerNodeHistory.deleteMany\",\"ServerNodeHistory.groupBy\",\"ServerNodeHistory.aggregate\",\"ServiceCheck.findUnique\",\"ServiceCheck.findUniqueOrThrow\",\"ServiceCheck.findFirst\",\"ServiceCheck.findFirstOrThrow\",\"ServiceCheck.findMany\",\"ServiceCheck.createOne\",\"ServiceCheck.createMany\",\"ServiceCheck.updateOne\",\"ServiceCheck.updateMany\",\"ServiceCheck.upsertOne\",\"ServiceCheck.deleteOne\",\"ServiceCheck.deleteMany\",\"ServiceCheck.groupBy\",\"ServiceCheck.aggregate\",\"Econ_SowInventory.findUnique\",\"Econ_SowInventory.findUniqueOrThrow\",\"Econ_SowInventory.findFirst\",\"Econ_SowInventory.findFirstOrThrow\",\"Econ_SowInventory.findMany\",\"Econ_SowInventory.createOne\",\"Econ_SowInventory.createMany\",\"Econ_SowInventory.updateOne\",\"Econ_SowInventory.updateMany\",\"Econ_SowInventory.upsertOne\",\"Econ_SowInventory.deleteOne\",\"Econ_SowInventory.deleteMany\",\"Econ_SowInventory.groupBy\",\"Econ_SowInventory.aggregate\",\"ScraperCache.findUnique\",\"ScraperCache.findUniqueOrThrow\",\"ScraperCache.findFirst\",\"ScraperCache.findFirstOrThrow\",\"ScraperCache.findMany\",\"ScraperCache.createOne\",\"ScraperCache.createMany\",\"ScraperCache.updateOne\",\"ScraperCache.updateMany\",\"ScraperCache.upsertOne\",\"ScraperCache.deleteOne\",\"ScraperCache.deleteMany\",\"ScraperCache.groupBy\",\"ScraperCache.aggregate\",\"OilPriceHistory.findUnique\",\"OilPriceHistory.findUniqueOrThrow\",\"OilPriceHistory.findFirst\",\"OilPriceHistory.findFirstOrThrow\",\"OilPriceHistory.findMany\",\"OilPriceHistory.createOne\",\"OilPriceHistory.createMany\",\"OilPriceHistory.updateOne\",\"OilPriceHistory.updateMany\",\"OilPriceHistory.upsertOne\",\"OilPriceHistory.deleteOne\",\"OilPriceHistory.deleteMany\",\"OilPriceHistory.groupBy\",\"OilPriceHistory.aggregate\",\"MihomeAccount.findUnique\",\"MihomeAccount.findUniqueOrThrow\",\"MihomeAccount.findFirst\",\"MihomeAccount.findFirstOrThrow\",\"MihomeAccount.findMany\",\"MihomeAccount.createOne\",\"MihomeAccount.createMany\",\"MihomeAccount.updateOne\",\"MihomeAccount.updateMany\",\"MihomeAccount.upsertOne\",\"MihomeAccount.deleteOne\",\"MihomeAccount.deleteMany\",\"MihomeAccount.groupBy\",\"MihomeAccount.aggregate\",\"home\",\"device\",\"samples\",\"hours\",\"devices\",\"MihomeHome.findUnique\",\"MihomeHome.findUniqueOrThrow\",\"MihomeHome.findFirst\",\"MihomeHome.findFirstOrThrow\",\"MihomeHome.findMany\",\"MihomeHome.createOne\",\"MihomeHome.createMany\",\"MihomeHome.updateOne\",\"MihomeHome.updateMany\",\"MihomeHome.upsertOne\",\"MihomeHome.deleteOne\",\"MihomeHome.deleteMany\",\"MihomeHome.groupBy\",\"MihomeHome.aggregate\",\"MihomeDevice.findUnique\",\"MihomeDevice.findUniqueOrThrow\",\"MihomeDevice.findFirst\",\"MihomeDevice.findFirstOrThrow\",\"MihomeDevice.findMany\",\"MihomeDevice.createOne\",\"MihomeDevice.createMany\",\"MihomeDevice.updateOne\",\"MihomeDevice.updateMany\",\"MihomeDevice.upsertOne\",\"MihomeDevice.deleteOne\",\"MihomeDevice.deleteMany\",\"MihomeDevice.groupBy\",\"MihomeDevice.aggregate\",\"MihomeEnvSample.findUnique\",\"MihomeEnvSample.findUniqueOrThrow\",\"MihomeEnvSample.findFirst\",\"MihomeEnvSample.findFirstOrThrow\",\"MihomeEnvSample.findMany\",\"MihomeEnvSample.createOne\",\"MihomeEnvSample.createMany\",\"MihomeEnvSample.updateOne\",\"MihomeEnvSample.updateMany\",\"MihomeEnvSample.upsertOne\",\"MihomeEnvSample.deleteOne\",\"MihomeEnvSample.deleteMany\",\"MihomeEnvSample.groupBy\",\"MihomeEnvSample.aggregate\",\"MihomeEnvHour.findUnique\",\"MihomeEnvHour.findUniqueOrThrow\",\"MihomeEnvHour.findFirst\",\"MihomeEnvHour.findFirstOrThrow\",\"MihomeEnvHour.findMany\",\"MihomeEnvHour.createOne\",\"MihomeEnvHour.createMany\",\"MihomeEnvHour.updateOne\",\"MihomeEnvHour.updateMany\",\"MihomeEnvHour.upsertOne\",\"MihomeEnvHour.deleteOne\",\"MihomeEnvHour.deleteMany\",\"MihomeEnvHour.groupBy\",\"MihomeEnvHour.aggregate\",\"Habit.findUnique\",\"Habit.findUniqueOrThrow\",\"Habit.findFirst\",\"Habit.findFirstOrThrow\",\"Habit.findMany\",\"Habit.createOne\",\"Habit.createMany\",\"Habit.updateOne\",\"Habit.updateMany\",\"Habit.upsertOne\",\"Habit.deleteOne\",\"Habit.deleteMany\",\"Habit.groupBy\",\"Habit.aggregate\",\"CheckIn.findUnique\",\"CheckIn.findUniqueOrThrow\",\"CheckIn.findFirst\",\"CheckIn.findFirstOrThrow\",\"CheckIn.findMany\",\"CheckIn.createOne\",\"CheckIn.createMany\",\"CheckIn.updateOne\",\"CheckIn.updateMany\",\"CheckIn.upsertOne\",\"CheckIn.deleteOne\",\"CheckIn.deleteMany\",\"CheckIn.groupBy\",\"CheckIn.aggregate\",\"CheckList.findUnique\",\"CheckList.findUniqueOrThrow\",\"CheckList.findFirst\",\"CheckList.findFirstOrThrow\",\"CheckList.findMany\",\"CheckList.createOne\",\"CheckList.createMany\",\"CheckList.updateOne\",\"CheckList.updateMany\",\"CheckList.upsertOne\",\"CheckList.deleteOne\",\"CheckList.deleteMany\",\"CheckList.groupBy\",\"CheckList.aggregate\",\"CheckListItem.findUnique\",\"CheckListItem.findUniqueOrThrow\",\"CheckListItem.findFirst\",\"CheckListItem.findFirstOrThrow\",\"CheckListItem.findMany\",\"CheckListItem.createOne\",\"CheckListItem.createMany\",\"CheckListItem.updateOne\",\"CheckListItem.updateMany\",\"CheckListItem.upsertOne\",\"CheckListItem.deleteOne\",\"CheckListItem.deleteMany\",\"CheckListItem.groupBy\",\"CheckListItem.aggregate\",\"CheckListTemplate.findUnique\",\"CheckListTemplate.findUniqueOrThrow\",\"CheckListTemplate.findFirst\",\"CheckListTemplate.findFirstOrThrow\",\"CheckListTemplate.findMany\",\"CheckListTemplate.createOne\",\"CheckListTemplate.createMany\",\"CheckListTemplate.updateOne\",\"CheckListTemplate.updateMany\",\"CheckListTemplate.upsertOne\",\"CheckListTemplate.deleteOne\",\"CheckListTemplate.deleteMany\",\"CheckListTemplate.groupBy\",\"CheckListTemplate.aggregate\",\"AND\",\"OR\",\"NOT\",\"id\",\"userId\",\"name\",\"scene\",\"builtin\",\"createdAt\",\"updatedAt\",\"equals\",\"in\",\"notIn\",\"lt\",\"lte\",\"gt\",\"gte\",\"not\",\"string_contains\",\"string_starts_with\",\"string_ends_with\",\"array_starts_with\",\"array_ends_with\",\"array_contains\",\"contains\",\"startsWith\",\"endsWith\",\"search\",\"listId\",\"title\",\"note\",\"done\",\"doneAt\",\"sortOrder\",\"archived\",\"habitId\",\"date\",\"seq\",\"source\",\"period\",\"target\",\"color\",\"icon\",\"deviceId\",\"hour\",\"temperatureAvg\",\"humidityAvg\",\"raw\",\"temperature\",\"humidity\",\"temperatureMin\",\"temperatureMax\",\"humidityMin\",\"humidityMax\",\"origin\",\"sampledAt\",\"did\",\"homeId\",\"model\",\"alias\",\"tempSiid\",\"tempPiid\",\"humSiid\",\"humPiid\",\"battSiid\",\"battPiid\",\"battery\",\"batteryAt\",\"enabled\",\"lastSyncAt\",\"every\",\"some\",\"none\",\"deviceId_hour\",\"deviceId_date\",\"key\",\"status\",\"lastError\",\"province\",\"fuel\",\"price\",\"date_province_fuel\",\"scraperName\",\"lastDataHash\",\"lastUpdateAt\",\"metadata\",\"month\",\"inventory\",\"url\",\"latencyMs\",\"message\",\"lastCheckAt\",\"uuid\",\"cpu\",\"ram\",\"load\",\"disk\",\"netIn\",\"netOut\",\"process\",\"connections\",\"uuid_period\",\"cpuName\",\"os\",\"region\",\"memTotal\",\"diskTotal\",\"cpuCores\",\"cpuUsage\",\"ramUsed\",\"swapUsed\",\"load1\",\"load5\",\"load15\",\"diskUsed\",\"uptime\",\"recordedAt\",\"indicatorName\",\"valueA\",\"valueB\",\"sourceA\",\"sourceB\",\"diff\",\"diffRatio\",\"summary\",\"content\",\"publishedAt\",\"impactRank\",\"title_publishedAt\",\"indicatorId\",\"value\",\"groupName\",\"unit\",\"frequency\",\"hidden\",\"indicatorId_period\",\"description\",\"slug\",\"email\",\"password\",\"habitId_date_seq\",\"is\",\"isNot\",\"connectOrCreate\",\"upsert\",\"createMany\",\"set\",\"disconnect\",\"delete\",\"connect\",\"updateMany\",\"deleteMany\",\"_relevance\",\"increment\",\"decrement\",\"multiply\",\"divide\"]"), + graph: "lQi_AcICDQcAAIsFACAIAACMBQAgCwAAjQUAIAwAAI4FACDeAgAAigUAMN8CAAAaABDgAgAAigUAMOECAgAAAAHjAgEAzwQAIeYCQADQBAAh5wJAANAEACHoAwEAAAAB6QMBAM8EACEBAAAAAQAgEQMAAJQFACAFAACMBQAg3gIAAJkFADDfAgAAAwAQ4AIAAJkFADDhAgIAzgQAIeICAgDOBAAh4wIBAM8EACHmAkAA0AQAIecCQADQBAAh_AIBAM8EACH_AgIAzgQAIYADIADdBAAhhQMBAM8EACGGAwIAzgQAIYcDAQDPBAAhiAMBAM8EACEDAwAA0QcAIAUAAM0HACD2AwAA2QcAIBEDAACUBQAgBQAAjAUAIN4CAACZBQAw3wIAAAMAEOACAACZBQAw4QICAAAAAeICAgDOBAAh4wIBAM8EACHmAkAA0AQAIecCQADQBAAh_AIBAM8EACH_AgIAzgQAIYADIADdBAAhhQMBAM8EACGGAwIAzgQAIYcDAQDPBAAhiAMBAM8EACEDAAAAAwAgAQAABAAwAgAABQAgDQMAAJQFACAEAACYBQAg3gIAAJcFADDfAgAABwAQ4AIAAJcFADDhAgIAzgQAIeICAgDOBAAh5gJAANAEACH8AgEAzwQAIYEDAgDOBAAhggMBAM8EACGDAwIAzgQAIYQDAQDPBAAhAwMAANEHACAEAADXBwAg9gMAANgHACAOAwAAlAUAIAQAAJgFACDeAgAAlwUAMN8CAAAHABDgAgAAlwUAMOECAgAAAAHiAgIAzgQAIeYCQADQBAAh_AIBAM8EACGBAwIAzgQAIYIDAQDPBAAhgwMCAM4EACGEAwEAzwQAIeoDAACWBQAgAwAAAAcAIAEAAAgAMAIAAAkAIAEAAAAHACADAAAABwAgAQAACAAwAgAACQAgDQMAAJQFACAKAACVBQAg3gIAAJMFADDfAgAADQAQ4AIAAJMFADDhAgIAzgQAIeICAgDOBAAh5AIBAM8EACHmAkAA0AQAIecCQADQBAAh-wIBAM8EACH8AgEAzwQAIYADIADdBAAhAwMAANEHACAKAADVBwAg9gMAANYHACANAwAAlAUAIAoAAJUFACDeAgAAkwUAMN8CAAANABDgAgAAkwUAMOECAgAAAAHiAgIAzgQAIeQCAQDPBAAh5gJAANAEACHnAkAA0AQAIfsCAQDPBAAh_AIBAM8EACGAAyAA3QQAIQMAAAANACABAAAOADACAAAPACANCQAAkgUAIN4CAACRBQAw3wIAABEAEOACAACRBQAw4QICAM4EACHmAkAA0AQAIecCQADQBAAh-gICAM4EACH7AgEAzwQAIfwCAQDPBAAh_QIgAN0EACH-AkAA2QQAIf8CAgDOBAAhAwkAANMHACD-AgAAmgUAIPYDAADUBwAgDQkAAJIFACDeAgAAkQUAMN8CAAARABDgAgAAkQUAMOECAgAAAAHmAkAA0AQAIecCQADQBAAh-gICAM4EACH7AgEAzwQAIfwCAQDPBAAh_QIgAN0EACH-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_wQAMN8CAABqABDgAgAA_wQAMOECAgAAAAHjAgEAAAAB5gJAANAEACHnAkAA0AQAIfsCAQDPBAAhhAMBAM8EACHhAwEAzwQAIeIDAQDPBAAh4wMBAM8EACHkAyAA3QQAIQEAAABiACAKPwAAgwUAIN4CAACCBQAw3wIAAGQAEOACAACCBQAw4QICAM4EACHmAkAA0AQAIecCQADQBAAhhQMBAM8EACHfAwIAzgQAIeADCADnBAAhAj8AAIQHACD2AwAAhQcAIAs_AACDBQAg3gIAAIIFADDfAgAAZAAQ4AIAAIIFADDhAgIAAAAB5gJAANAEACHnAkAA0AQAIYUDAQDPBAAh3wMCAM4EACHgAwgA5wQAIeUDAACBBQAgAwAAAGQAIAEAAGUAMAIAAGYAIAEAAABkACABAAAAYgAgDkAAAIAFACDeAgAA_wQAMN8CAABqABDgAgAA_wQAMOECAgDOBAAh4wIBAM8EACHmAkAA0AQAIecCQADQBAAh-wIBAM8EACGEAwEAzwQAIeEDAQDPBAAh4gMBAM8EACHjAwEAzwQAIeQDIADdBAAhAkAAAIIHACD2AwAAgwcAIAMAAABqACABAABrADACAABiACADAAAAagAgAQAAawAwAgAAYgAgAwAAAGoAIAEAAGsAMAIAAGIAIAtAAACBBwAg4QICAAAAAeMCAQAAAAHmAkAAAAAB5wJAAAAAAfsCAQAAAAGEAwEAAAAB4QMBAAAAAeIDAQAAAAHjAwEAAAAB5AMgAAAAAQESAABvACAK4QICAAAAAeMCAQAAAAHmAkAAAAAB5wJAAAAAAfsCAQAAAAGEAwEAAAAB4QMBAAAAAeIDAQAAAAHjAwEAAAAB5AMgAAAAAQESAABxADALQAAA9AYAIOECAgCjBQAh4wIBAKAFACHmAkAAogUAIecCQACiBQAh-wIBAKAFACGEAwEAoAUAIeEDAQCgBQAh4gMBAKAFACHjAwEAoAUAIeQDIAChBQAhAgAAAGIAIBIAAHMAIArhAgIAowUAIeMCAQCgBQAh5gJAAKIFACHnAkAAogUAIfsCAQCgBQAhhAMBAKAFACHhAwEAoAUAIeIDAQCgBQAh4wMBAKAFACHkAyAAoQUAIQIAAABqACASAAB1ACADAAAAYgAgFwAAbwAgGAAAcwAgAQAAAGIAIAEAAABqACAFBgAA7wYAIB0AAPAGACAeAADzBgAgHwAA8gYAICAAAPEGACAN3gIAAP4EADDfAgAAewAQ4AIAAP4EADDhAgIAqAQAIeMCAQCqBAAh5gJAAK0EACHnAkAArQQAIfsCAQCqBAAhhAMBAKoEACHhAwEAqgQAIeIDAQCqBAAh4wMBAKoEACHkAyAArAQAIQMAAABqACABAAB6ADAcAAB7ACADAAAAagAgAQAAawAwAgAAYgAgAQAAAGYAIAEAAABmACADAAAAZAAgAQAAZQAwAgAAZgAgAwAAAGQAIAEAAGUAMAIAAGYAIAMAAABkACABAABlADACAABmACAHPwAA7gYAIOECAgAAAAHmAkAAAAAB5wJAAAAAAYUDAQAAAAHfAwIAAAAB4AMIAAAAAQESAACDAQAgBuECAgAAAAHmAkAAAAAB5wJAAAAAAYUDAQAAAAHfAwIAAAAB4AMIAAAAAQESAACFAQAwBz8AAO0GACDhAgIAowUAIeYCQACiBQAh5wJAAKIFACGFAwEAoAUAId8DAgCjBQAh4AMIALsGACECAAAAZgAgEgAAhwEAIAbhAgIAowUAIeYCQACiBQAh5wJAAKIFACGFAwEAoAUAId8DAgCjBQAh4AMIALsGACECAAAAZAAgEgAAiQEAIAMAAABmACAXAACDAQAgGAAAhwEAIAEAAABmACABAAAAZAAgBQYAAOgGACAdAADpBgAgHgAA7AYAIB8AAOsGACAgAADqBgAgCd4CAAD9BAAw3wIAAI8BABDgAgAA_QQAMOECAgCoBAAh5gJAAK0EACHnAkAArQQAIYUDAQCqBAAh3wMCAKgEACHgAwgA5AQAIQMAAABkACABAACOAQAwHAAAjwEAIAMAAABkACABAABlADACAABmACAN3gIAAPsEADDfAgAAlQEAEOACAAD7BAAw4QICAAAAAeYCQADQBAAh-wIBAM8EACGEAwEAzwQAIbYDAQDPBAAh2gMBAM8EACHbAwEA2wQAIdwDQADQBAAh3QMCAM4EACHeAwAA_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_AwQA9AQAIcADBAD0BAAhwQMCAM4EACHCAwIAzgQAIcQDAQDPBAAhxQMBAM8EACHGAwEAzwQAIccDBAD0BAAhyAMEAPQEACHJAwIAzgQAIcoDCADnBAAhywMEAPQEACHMAwQA9AQAIc0DCADnBAAhzgMIAOcEACHPAwgA5wQAIdADBAD0BAAh0QMEAPQEACHSA0AA0AQAIQH2AwAA2wYAIAMAAADDAQAgAQAAxAEAMAIAAMABACADAAAAwwEAIAEAAMQBADACAADAAQAgAwAAAMMBACABAADEAQAwAgAAwAEAIBnhAgIAAAAB4wIBAAAAAeYCQAAAAAHnAkAAAAABqgMBAAAAAboDAQAAAAG_AwQAAAABwAMEAAAAAcEDAgAAAAHCAwIAAAABxAMBAAAAAcUDAQAAAAHGAwEAAAABxwMEAAAAAcgDBAAAAAHJAwIAAAABygMIAAAAAcsDBAAAAAHMAwQAAAABzQMIAAAAAc4DCAAAAAHPAwgAAAAB0AMEAAAAAdEDBAAAAAHSA0AAAAABARIAAMgBACAZ4QICAAAAAeMCAQAAAAHmAkAAAAAB5wJAAAAAAaoDAQAAAAG6AwEAAAABvwMEAAAAAcADBAAAAAHBAwIAAAABwgMCAAAAAcQDAQAAAAHFAwEAAAABxgMBAAAAAccDBAAAAAHIAwQAAAAByQMCAAAAAcoDCAAAAAHLAwQAAAABzAMEAAAAAc0DCAAAAAHOAwgAAAABzwMIAAAAAdADBAAAAAHRAwQAAAAB0gNAAAAAAQESAADKAQAwGeECAgCjBQAh4wIBAKAFACHmAkAAogUAIecCQACiBQAhqgMBAKAFACG6AwEAoAUAIb8DBADUBgAhwAMEANQGACHBAwIAowUAIcIDAgCjBQAhxAMBAKAFACHFAwEAoAUAIcYDAQCgBQAhxwMEANQGACHIAwQA1AYAIckDAgCjBQAhygMIALsGACHLAwQA1AYAIcwDBADUBgAhzQMIALsGACHOAwgAuwYAIc8DCAC7BgAh0AMEANQGACHRAwQA1AYAIdIDQACiBQAhAgAAAMABACASAADMAQAgGeECAgCjBQAh4wIBAKAFACHmAkAAogUAIecCQACiBQAhqgMBAKAFACG6AwEAoAUAIb8DBADUBgAhwAMEANQGACHBAwIAowUAIcIDAgCjBQAhxAMBAKAFACHFAwEAoAUAIcYDAQCgBQAhxwMEANQGACHIAwQA1AYAIckDAgCjBQAhygMIALsGACHLAwQA1AYAIcwDBADUBgAhzQMIALsGACHOAwgAuwYAIc8DCAC7BgAh0AMEANQGACHRAwQA1AYAIdIDQACiBQAhAgAAAMMBACASAADOAQAgAwAAAMABACAXAADIAQAgGAAAzAEAIAEAAADAAQAgAQAAAMMBACAFBgAA1gYAIB0AANcGACAeAADaBgAgHwAA2QYAICAAANgGACAc3gIAAPYEADDfAgAA1AEAEOACAAD2BAAw4QICAKgEACHjAgEAqgQAIeYCQACtBAAh5wJAAK0EACGqAwEAqgQAIboDAQCqBAAhvwMEAPAEACHAAwQA8AQAIcEDAgCoBAAhwgMCAKgEACHEAwEAqgQAIcUDAQCqBAAhxgMBAKoEACHHAwQA8AQAIcgDBADwBAAhyQMCAKgEACHKAwgA5AQAIcsDBADwBAAhzAMEAPAEACHNAwgA5AQAIc4DCADkBAAhzwMIAOQEACHQAwQA8AQAIdEDBADwBAAh0gNAAK0EACEDAAAAwwEAIAEAANMBADAcAADUAQAgAwAAAMMBACABAADEAQAwAgAAwAEAIBDeAgAA8wQAMN8CAADaAQAQ4AIAAPMEADDhAgIAAAAB5gJAANAEACGFA0AA0AQAIboDAQDPBAAhuwMIAOcEACG8AwQA9AQAIb0DCADnBAAhvgMEAPQEACG_AwQA9AQAIcADBAD0BAAhwQMCAM4EACHCAwIAzgQAIcMDAAD1BAAgAQAAANcBACABAAAA1wEAIA_eAgAA8wQAMN8CAADaAQAQ4AIAAPMEADDhAgIAzgQAIeYCQADQBAAhhQNAANAEACG6AwEAzwQAIbsDCADnBAAhvAMEAPQEACG9AwgA5wQAIb4DBAD0BAAhvwMEAPQEACHAAwQA9AQAIcEDAgDOBAAhwgMCAM4EACEB9gMAANUGACADAAAA2gEAIAEAANsBADACAADXAQAgAwAAANoBACABAADbAQAwAgAA1wEAIAMAAADaAQAgAQAA2wEAMAIAANcBACAM4QICAAAAAeYCQAAAAAGFA0AAAAABugMBAAAAAbsDCAAAAAG8AwQAAAABvQMIAAAAAb4DBAAAAAG_AwQAAAABwAMEAAAAAcEDAgAAAAHCAwIAAAABARIAAN8BACAM4QICAAAAAeYCQAAAAAGFA0AAAAABugMBAAAAAbsDCAAAAAG8AwQAAAABvQMIAAAAAb4DBAAAAAG_AwQAAAABwAMEAAAAAcEDAgAAAAHCAwIAAAABARIAAOEBADAM4QICAKMFACHmAkAAogUAIYUDQACiBQAhugMBAKAFACG7AwgAuwYAIbwDBADUBgAhvQMIALsGACG-AwQA1AYAIb8DBADUBgAhwAMEANQGACHBAwIAowUAIcIDAgCjBQAhAgAAANcBACASAADjAQAgDOECAgCjBQAh5gJAAKIFACGFA0AAogUAIboDAQCgBQAhuwMIALsGACG8AwQA1AYAIb0DCAC7BgAhvgMEANQGACG_AwQA1AYAIcADBADUBgAhwQMCAKMFACHCAwIAowUAIQIAAADaAQAgEgAA5QEAIAMAAADXAQAgFwAA3wEAIBgAAOMBACABAAAA1wEAIAEAAADaAQAgBQYAAM8GACAdAADQBgAgHgAA0wYAIB8AANIGACAgAADRBgAgD94CAADvBAAw3wIAAOsBABDgAgAA7wQAMOECAgCoBAAh5gJAAK0EACGFA0AArQQAIboDAQCqBAAhuwMIAOQEACG8AwQA8AQAIb0DCADkBAAhvgMEAPAEACG_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-BgAgHgAAwQYAIB8AAMAGACAgAAC_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_hAgIAowUAIeYCQACiBQAhggNAAKIFACGJAwIAowUAIYsDCADnBQAhjAMIAOcFACGNA4AAAAABjgMIAOcFACGPAwgA5wUAIZADCADnBQAhkQMIAOcFACGSAwgA5wUAIZMDCADnBQAhlAMBAKAFACGVA0AArAUAIQIAAADnAgAgEgAApgMAIAMAAADpAgAgFwAAoAMAIBgAAKQDACABAAAA6QIAIAEAAADnAgAgDwYAAOoFACAdAADrBQAgHgAA7gUAIB8AAO0FACAgAADsBQAgiwMAAJoFACCMAwAAmgUAII0DAACaBQAgjgMAAJoFACCPAwAAmgUAIJADAACaBQAgkQMAAJoFACCSAwAAmgUAIJMDAACaBQAglQMAAJoFACAS3gIAAMcEADDfAgAArAMAEOACAADHBAAw4QICAKgEACHmAkAArQQAIYIDQACtBAAhiQMCAKgEACGLAwgAwwQAIYwDCADDBAAhjQMAAMQEACCOAwgAwwQAIY8DCADDBAAhkAMIAMMEACGRAwgAwwQAIZIDCADDBAAhkwMIAMMEACGUAwEAqgQAIZUDQAC8BAAhAwAAAOcCACABAACrAwAwHAAArAMAIAMAAADnAgAgAQAA6AIAMAIAAOkCACABAAAA7QIAIAEAAADtAgAgAwAAAOsCACABAADsAgAwAgAA7QIAIAMAAADrAgAgAQAA7AIAMAIAAO0CACADAAAA6wIAIAEAAOwCADACAADtAgAgCNwBAADpBQAg4QICAAAAAeYCQAAAAAGJAwIAAAABigNAAAAAAYsDCAAAAAGMAwgAAAABjQOAAAAAAQESAAC0AwAgB-ECAgAAAAHmAkAAAAABiQMCAAAAAYoDQAAAAAGLAwgAAAABjAMIAAAAAY0DgAAAAAEBEgAAtgMAMAjcAQAA6AUAIOECAgCjBQAh5gJAAKIFACGJAwIAowUAIYoDQACiBQAhiwMIAOcFACGMAwgA5wUAIY0DgAAAAAECAAAA7QIAIBIAALgDACAH4QICAKMFACHmAkAAogUAIYkDAgCjBQAhigNAAKIFACGLAwgA5wUAIYwDCADnBQAhjQOAAAAAAQIAAADrAgAgEgAAugMAIAMAAADtAgAgFwAAtAMAIBgAALgDACABAAAA7QIAIAEAAADrAgAgCAYAAOIFACAdAADjBQAgHgAA5gUAIB8AAOUFACAgAADkBQAgiwMAAJoFACCMAwAAmgUAII0DAACaBQAgCt4CAADCBAAw3wIAAMADABDgAgAAwgQAMOECAgCoBAAh5gJAAK0EACGJAwIAqAQAIYoDQACtBAAhiwMIAMMEACGMAwgAwwQAIY0DAADEBAAgAwAAAOsCACABAAC_AwAwHAAAwAMAIAMAAADrAgAgAQAA7AIAMAIAAO0CACABAAAABQAgAQAAAAUAIAMAAAADACABAAAEADACAAAFACADAAAAAwAgAQAABAAwAgAABQAgAwAAAAMAIAEAAAQAMAIAAAUAIA4DAADgBQAgBQAA4QUAIOECAgAAAAHiAgIAAAAB4wIBAAAAAeYCQAAAAAHnAkAAAAAB_AIBAAAAAf8CAgAAAAGAAyAAAAABhQMBAAAAAYYDAgAAAAGHAwEAAAABiAMBAAAAAQESAADIAwAgDOECAgAAAAHiAgIAAAAB4wIBAAAAAeYCQAAAAAHnAkAAAAAB_AIBAAAAAf8CAgAAAAGAAyAAAAABhQMBAAAAAYYDAgAAAAGHAwEAAAABiAMBAAAAAQESAADKAwAwDgMAANIFACAFAADTBQAg4QICAKMFACHiAgIAowUAIeMCAQCgBQAh5gJAAKIFACHnAkAAogUAIfwCAQCgBQAh_wICAKMFACGAAyAAoQUAIYUDAQCgBQAhhgMCAKMFACGHAwEAoAUAIYgDAQCgBQAhAgAAAAUAIBIAAMwDACAM4QICAKMFACHiAgIAowUAIeMCAQCgBQAh5gJAAKIFACHnAkAAogUAIfwCAQCgBQAh_wICAKMFACGAAyAAoQUAIYUDAQCgBQAhhgMCAKMFACGHAwEAoAUAIYgDAQCgBQAhAgAAAAMAIBIAAM4DACADAAAABQAgFwAAyAMAIBgAAMwDACABAAAABQAgAQAAAAMAIAUGAADNBQAgHQAAzgUAIB4AANEFACAfAADQBQAgIAAAzwUAIA_eAgAAwQQAMN8CAADUAwAQ4AIAAMEEADDhAgIAqAQAIeICAgCoBAAh4wIBAKoEACHmAkAArQQAIecCQACtBAAh_AIBAKoEACH_AgIAqAQAIYADIACsBAAhhQMBAKoEACGGAwIAqAQAIYcDAQCqBAAhiAMBAKoEACEDAAAAAwAgAQAA0wMAMBwAANQDACADAAAAAwAgAQAABAAwAgAABQAgAQAAAAkAIAEAAAAJACADAAAABwAgAQAACAAwAgAACQAgAwAAAAcAIAEAAAgAMAIAAAkAIAMAAAAHACABAAAIADACAAAJACAKAwAAzAUAIAQAAMsFACDhAgIAAAAB4gICAAAAAeYCQAAAAAH8AgEAAAABgQMCAAAAAYIDAQAAAAGDAwIAAAABhAMBAAAAAQESAADcAwAgCOECAgAAAAHiAgIAAAAB5gJAAAAAAfwCAQAAAAGBAwIAAAABggMBAAAAAYMDAgAAAAGEAwEAAAABARIAAN4DADAKAwAAygUAIAQAAMkFACDhAgIAowUAIeICAgCjBQAh5gJAAKIFACH8AgEAoAUAIYEDAgCjBQAhggMBAKAFACGDAwIAowUAIYQDAQCgBQAhAgAAAAkAIBIAAOADACAI4QICAKMFACHiAgIAowUAIeYCQACiBQAh_AIBAKAFACGBAwIAowUAIYIDAQCgBQAhgwMCAKMFACGEAwEAoAUAIQIAAAAHACASAADiAwAgAwAAAAkAIBcAANwDACAYAADgAwAgAQAAAAkAIAEAAAAHACAFBgAAxAUAIB0AAMUFACAeAADIBQAgHwAAxwUAICAAAMYFACAL3gIAAMAEADDfAgAA6AMAEOACAADABAAw4QICAKgEACHiAgIAqAQAIeYCQACtBAAh_AIBAKoEACGBAwIAqAQAIYIDAQCqBAAhgwMCAKgEACGEAwEAqgQAIQMAAAAHACABAADnAwAwHAAA6AMAIAMAAAAHACABAAAIADACAAAJACABAAAADwAgAQAAAA8AIAMAAAANACABAAAOADACAAAPACADAAAADQAgAQAADgAwAgAADwAgAwAAAA0AIAEAAA4AMAIAAA8AIAoDAADCBQAgCgAAwwUAIOECAgAAAAHiAgIAAAAB5AIBAAAAAeYCQAAAAAHnAkAAAAAB-wIBAAAAAfwCAQAAAAGAAyAAAAABARIAAPADACAI4QICAAAAAeICAgAAAAHkAgEAAAAB5gJAAAAAAecCQAAAAAH7AgEAAAAB_AIBAAAAAYADIAAAAAEBEgAA8gMAMAoDAAC0BQAgCgAAtQUAIOECAgCjBQAh4gICAKMFACHkAgEAoAUAIeYCQACiBQAh5wJAAKIFACH7AgEAoAUAIfwCAQCgBQAhgAMgAKEFACECAAAADwAgEgAA9AMAIAjhAgIAowUAIeICAgCjBQAh5AIBAKAFACHmAkAAogUAIecCQACiBQAh-wIBAKAFACH8AgEAoAUAIYADIAChBQAhAgAAAA0AIBIAAPYDACADAAAADwAgFwAA8AMAIBgAAPQDACABAAAADwAgAQAAAA0AIAUGAACvBQAgHQAAsAUAIB4AALMFACAfAACyBQAgIAAAsQUAIAveAgAAvwQAMN8CAAD8AwAQ4AIAAL8EADDhAgIAqAQAIeICAgCoBAAh5AIBAKoEACHmAkAArQQAIecCQACtBAAh-wIBAKoEACH8AgEAqgQAIYADIACsBAAhAwAAAA0AIAEAAPsDADAcAAD8AwAgAwAAAA0AIAEAAA4AMAIAAA8AIAEAAAATACABAAAAEwAgAwAAABEAIAEAABIAMAIAABMAIAMAAAARACABAAASADACAAATACADAAAAEQAgAQAAEgAwAgAAEwAgCgkAAK4FACDhAgIAAAAB5gJAAAAAAecCQAAAAAH6AgIAAAAB-wIBAAAAAfwCAQAAAAH9AiAAAAAB_gJAAAAAAf8CAgAAAAEBEgAAhAQAIAnhAgIAAAAB5gJAAAAAAecCQAAAAAH6AgIAAAAB-wIBAAAAAfwCAQAAAAH9AiAAAAAB_gJAAAAAAf8CAgAAAAEBEgAAhgQAMAoJAACtBQAg4QICAKMFACHmAkAAogUAIecCQACiBQAh-gICAKMFACH7AgEAoAUAIfwCAQCgBQAh_QIgAKEFACH-AkAArAUAIf8CAgCjBQAhAgAAABMAIBIAAIgEACAJ4QICAKMFACHmAkAAogUAIecCQACiBQAh-gICAKMFACH7AgEAoAUAIfwCAQCgBQAh_QIgAKEFACH-AkAArAUAIf8CAgCjBQAhAgAAABEAIBIAAIoEACADAAAAEwAgFwAAhAQAIBgAAIgEACABAAAAEwAgAQAAABEAIAYGAACnBQAgHQAAqAUAIB4AAKsFACAfAACqBQAgIAAAqQUAIP4CAACaBQAgDN4CAAC7BAAw3wIAAJAEABDgAgAAuwQAMOECAgCoBAAh5gJAAK0EACHnAkAArQQAIfoCAgCoBAAh-wIBAKoEACH8AgEAqgQAIf0CIACsBAAh_gJAALwEACH_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_AIBAKoEACH9AiAArAQAIf4CQAC8BAAh_wICAKgEACELBgAAtwQAIB8AAL4EACAgAAC-BAAg6AJAAAAAAekCQAAAAAXqAkAAAAAF6wJAAAAAAewCQAAAAAHtAkAAAAAB7gJAAAAAAe8CQAC9BAAhCwYAALcEACAfAAC-BAAgIAAAvgQAIOgCQAAAAAHpAkAAAAAF6gJAAAAABesCQAAAAAHsAkAAAAAB7QJAAAAAAe4CQAAAAAHvAkAAvQQAIQjoAkAAAAAB6QJAAAAABeoCQAAAAAXrAkAAAAAB7AJAAAAAAe0CQAAAAAHuAkAAAAAB7wJAAL4EACEL3gIAAL8EADDfAgAA_AMAEOACAAC_BAAw4QICAKgEACHiAgIAqAQAIeQCAQCqBAAh5gJAAK0EACHnAkAArQQAIfsCAQCqBAAh_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_AwQA8AQAIcADBADwBAAhwQMCAKgEACHCAwIAqAQAIQ0GAACvBAAgHQAAugQAIB4AAPIEACAfAADyBAAgIAAA8gQAIOgCBAAAAAHpAgQAAAAE6gIEAAAABOsCBAAAAAHsAgQAAAAB7QIEAAAAAe4CBAAAAAHvAgQA8QQAIQ0GAACvBAAgHQAAugQAIB4AAPIEACAfAADyBAAgIAAA8gQAIOgCBAAAAAHpAgQAAAAE6gIEAAAABOsCBAAAAAHsAgQAAAAB7QIEAAAAAe4CBAAAAAHvAgQA8QQAIQjoAgQAAAAB6QIEAAAABOoCBAAAAATrAgQAAAAB7AIEAAAAAe0CBAAAAAHuAgQAAAAB7wIEAPIEACEP3gIAAPMEADDfAgAA2gEAEOACAADzBAAw4QICAM4EACHmAkAA0AQAIYUDQADQBAAhugMBAM8EACG7AwgA5wQAIbwDBAD0BAAhvQMIAOcEACG-AwQA9AQAIb8DBAD0BAAhwAMEAPQEACHBAwIAzgQAIcIDAgDOBAAhCOgCBAAAAAHpAgQAAAAE6gIEAAAABOsCBAAAAAHsAgQAAAAB7QIEAAAAAe4CBAAAAAHvAgQA8gQAIQKFA0AAAAABugMBAAAAARzeAgAA9gQAMN8CAADUAQAQ4AIAAPYEADDhAgIAqAQAIeMCAQCqBAAh5gJAAK0EACHnAkAArQQAIaoDAQCqBAAhugMBAKoEACG_AwQA8AQAIcADBADwBAAhwQMCAKgEACHCAwIAqAQAIcQDAQCqBAAhxQMBAKoEACHGAwEAqgQAIccDBADwBAAhyAMEAPAEACHJAwIAqAQAIcoDCADkBAAhywMEAPAEACHMAwQA8AQAIc0DCADkBAAhzgMIAOQEACHPAwgA5AQAIdADBADwBAAh0QMEAPAEACHSA0AArQQAIRzeAgAA9wQAMN8CAADDAQAQ4AIAAPcEADDhAgIAzgQAIeMCAQDPBAAh5gJAANAEACHnAkAA0AQAIaoDAQDPBAAhugMBAM8EACG_AwQA9AQAIcADBAD0BAAhwQMCAM4EACHCAwIAzgQAIcQDAQDPBAAhxQMBAM8EACHGAwEAzwQAIccDBAD0BAAhyAMEAPQEACHJAwIAzgQAIcoDCADnBAAhywMEAPQEACHMAwQA9AQAIc0DCADnBAAhzgMIAOcEACHPAwgA5wQAIdADBAD0BAAh0QMEAPQEACHSA0AA0AQAIQ3eAgAA-AQAMN8CAAC9AQAQ4AIAAPgEADDhAgIAqAQAIeYCQACtBAAhhQMBAKoEACHTAwEAqgQAIdQDCADkBAAh1QMIAOQEACHWAwEAqgQAIdcDAQCqBAAh2AMIAOQEACHZAwgA5AQAIQ3eAgAA-QQAMN8CAACsAQAQ4AIAAPkEADDhAgIAzgQAIeYCQADQBAAhhQMBAM8EACHTAwEAzwQAIdQDCADnBAAh1QMIAOcEACHWAwEAzwQAIdcDAQDPBAAh2AMIAOcEACHZAwgA5wQAIQzeAgAA-gQAMN8CAACmAQAQ4AIAAPoEADDhAgIAqAQAIeYCQACtBAAh-wIBAKoEACGEAwEAqgQAIbYDAQCqBAAh2gMBAKoEACHbAwEAyQQAIdwDQACtBAAh3QMCAKgEACEM3gIAAPsEADDfAgAAlQEAEOACAAD7BAAw4QICAM4EACHmAkAA0AQAIfsCAQDPBAAhhAMBAM8EACG2AwEAzwQAIdoDAQDPBAAh2wMBANsEACHcA0AA0AQAId0DAgDOBAAhAvsCAQAAAAHcA0AAAAABCd4CAAD9BAAw3wIAAI8BABDgAgAA_QQAMOECAgCoBAAh5gJAAK0EACHnAkAArQQAIYUDAQCqBAAh3wMCAKgEACHgAwgA5AQAIQ3eAgAA_gQAMN8CAAB7ABDgAgAA_gQAMOECAgCoBAAh4wIBAKoEACHmAkAArQQAIecCQACtBAAh-wIBAKoEACGEAwEAqgQAIeEDAQCqBAAh4gMBAKoEACHjAwEAqgQAIeQDIACsBAAhDkAAAIAFACDeAgAA_wQAMN8CAABqABDgAgAA_wQAMOECAgDOBAAh4wIBAM8EACHmAkAA0AQAIecCQADQBAAh-wIBAM8EACGEAwEAzwQAIeEDAQDPBAAh4gMBAM8EACHjAwEAzwQAIeQDIADdBAAhA6QDAABkACClAwAAZAAgpgMAAGQAIAKFAwEAAAAB3wMCAAAAAQo_AACDBQAg3gIAAIIFADDfAgAAZAAQ4AIAAIIFADDhAgIAzgQAIeYCQADQBAAh5wJAANAEACGFAwEAzwQAId8DAgDOBAAh4AMIAOcEACEQQAAAgAUAIN4CAAD_BAAw3wIAAGoAEOACAAD_BAAw4QICAM4EACHjAgEAzwQAIeYCQADQBAAh5wJAANAEACH7AgEAzwQAIYQDAQDPBAAh4QMBAM8EACHiAwEAzwQAIeMDAQDPBAAh5AMgAN0EACHrAwAAagAg7AMAAGoAIAkSAACrBAAg3gIAAIQFADDfAgAAXwAQ4AIAAIQFADDhAgIAqAQAIeMCAQCqBAAh5gJAAK0EACHnAkAArQQAIeYDAQCqBAAhCRIAAIYFACDeAgAAhQUAMN8CAABOABDgAgAAhQUAMOECAgDOBAAh4wIBAM8EACHmAkAA0AQAIecCQADQBAAh5gMBAM8EACEM6AKAAAAAAesCgAAAAAHsAoAAAAAB7QKAAAAAAe4CgAAAAAHvAoAAAAAB8AIBAAAAAfECAQAAAAHyAgEAAAAB8wKAAAAAAfQCgAAAAAH1AoAAAAABCt4CAACHBQAw3wIAAEgAEOACAACHBQAw4QICAKgEACHmAkAArQQAIecCQACtBAAh-wIBAKoEACGCAwEAqgQAIdsDAQCqBAAh5wMBAKoEACEK3gIAAIgFADDfAgAANwAQ4AIAAIgFADDhAgIAzgQAIeYCQADQBAAh5wJAANAEACH7AgEAzwQAIYIDAQDPBAAh2wMBAM8EACHnAwEAzwQAIQneAgAAiQUAMN8CAAAxABDgAgAAiQUAMOECAgCoBAAh4wIBAKoEACHmAkAArQQAIecCQACtBAAh6AMBAKoEACHpAwEAqgQAIQ0HAACLBQAgCAAAjAUAIAsAAI0FACAMAACOBQAg3gIAAIoFADDfAgAAGgAQ4AIAAIoFADDhAgIAzgQAIeMCAQDPBAAh5gJAANAEACHnAkAA0AQAIegDAQDPBAAh6QMBAM8EACEDpAMAAAMAIKUDAAADACCmAwAAAwAgA6QDAAAHACClAwAABwAgpgMAAAcAIAOkAwAADQAgpQMAAA0AIKYDAAANACADpAMAABYAIKUDAAAWACCmAwAAFgAgDAMAAJAFACAKAACGBQAg3gIAAI8FADDfAgAAFgAQ4AIAAI8FADDhAgIAzgQAIeICAgDcBAAh4wIBAM8EACHkAgEAzwQAIeUCIADdBAAh5gJAANAEACHnAkAA0AQAIQ8HAACLBQAgCAAAjAUAIAsAAI0FACAMAACOBQAg3gIAAIoFADDfAgAAGgAQ4AIAAIoFADDhAgIAzgQAIeMCAQDPBAAh5gJAANAEACHnAkAA0AQAIegDAQDPBAAh6QMBAM8EACHrAwAAGgAg7AMAABoAIA0JAACSBQAg3gIAAJEFADDfAgAAEQAQ4AIAAJEFADDhAgIAzgQAIeYCQADQBAAh5wJAANAEACH6AgIAzgQAIfsCAQDPBAAh_AIBAM8EACH9AiAA3QQAIf4CQADZBAAh_wICAM4EACEPAwAAlAUAIAoAAJUFACDeAgAAkwUAMN8CAAANABDgAgAAkwUAMOECAgDOBAAh4gICAM4EACHkAgEAzwQAIeYCQADQBAAh5wJAANAEACH7AgEAzwQAIfwCAQDPBAAhgAMgAN0EACHrAwAADQAg7AMAAA0AIA0DAACUBQAgCgAAlQUAIN4CAACTBQAw3wIAAA0AEOACAACTBQAw4QICAM4EACHiAgIAzgQAIeQCAQDPBAAh5gJAANAEACHnAkAA0AQAIfsCAQDPBAAh_AIBAM8EACGAAyAA3QQAIQ8HAACLBQAgCAAAjAUAIAsAAI0FACAMAACOBQAg3gIAAIoFADDfAgAAGgAQ4AIAAIoFADDhAgIAzgQAIeMCAQDPBAAh5gJAANAEACHnAkAA0AQAIegDAQDPBAAh6QMBAM8EACHrAwAAGgAg7AMAABoAIAOkAwAAEQAgpQMAABEAIKYDAAARACADgQMCAAAAAYIDAQAAAAGDAwIAAAABDQMAAJQFACAEAACYBQAg3gIAAJcFADDfAgAABwAQ4AIAAJcFADDhAgIAzgQAIeICAgDOBAAh5gJAANAEACH8AgEAzwQAIYEDAgDOBAAhggMBAM8EACGDAwIAzgQAIYQDAQDPBAAhEwMAAJQFACAFAACMBQAg3gIAAJkFADDfAgAAAwAQ4AIAAJkFADDhAgIAzgQAIeICAgDOBAAh4wIBAM8EACHmAkAA0AQAIecCQADQBAAh_AIBAM8EACH_AgIAzgQAIYADIADdBAAhhQMBAM8EACGGAwIAzgQAIYcDAQDPBAAhiAMBAM8EACHrAwAAAwAg7AMAAAMAIBEDAACUBQAgBQAAjAUAIN4CAACZBQAw3wIAAAMAEOACAACZBQAw4QICAM4EACHiAgIAzgQAIeMCAQDPBAAh5gJAANAEACHnAkAA0AQAIfwCAQDPBAAh_wICAM4EACGAAyAA3QQAIYUDAQDPBAAhhgMCAM4EACGHAwEAzwQAIYgDAQDPBAAhAAAAAAAAAfADAQAAAAEB8AMgAAAAAQHwA0AAAAABBfADAgAAAAH3AwIAAAAB-AMCAAAAAfkDAgAAAAH6AwIAAAABBfADAgAAAAH3AwIAAAAB-AMCAAAAAfkDAgAAAAH6AwIAAAABBxcAAJEIACAYAACUCAAg7QMAAJIIACDuAwAAkwgAIPEDAAAaACDyAwAAGgAg8wMAAAEAIAMXAACRCAAg7QMAAJIIACDzAwAAAQAgAAAAAAAB8ANAAAAAAQUXAACMCAAgGAAAjwgAIO0DAACNCAAg7gMAAI4IACDzAwAADwAgAxcAAIwIACDtAwAAjQgAIPMDAAAPACAAAAAAAAUXAACGCAAgGAAAiggAIO0DAACHCAAg7gMAAIkIACDzAwAAAQAgCxcAALYFADAYAAC7BQAw7QMAALcFADDuAwAAuAUAMO8DAAC5BQAg8AMAALoFADDxAwAAugUAMPIDAAC6BQAw8wMAALoFADD0AwAAvAUAMPUDAAC9BQAwCOECAgAAAAHmAkAAAAAB5wJAAAAAAfsCAQAAAAH8AgEAAAAB_QIgAAAAAf4CQAAAAAH_AgIAAAABAgAAABMAIBcAAMEFACADAAAAEwAgFwAAwQUAIBgAAMAFACABEgAAiAgAMA0JAACSBQAg3gIAAJEFADDfAgAAEQAQ4AIAAJEFADDhAgIAAAAB5gJAANAEACHnAkAA0AQAIfoCAgDOBAAh-wIBAM8EACH8AgEAzwQAIf0CIADdBAAh_gJAANkEACH_AgIAzgQAIQIAAAATACASAADABQAgAgAAAL4FACASAAC_BQAgDN4CAAC9BQAw3wIAAL4FABDgAgAAvQUAMOECAgDOBAAh5gJAANAEACHnAkAA0AQAIfoCAgDOBAAh-wIBAM8EACH8AgEAzwQAIf0CIADdBAAh_gJAANkEACH_AgIAzgQAIQzeAgAAvQUAMN8CAAC-BQAQ4AIAAL0FADDhAgIAzgQAIeYCQADQBAAh5wJAANAEACH6AgIAzgQAIfsCAQDPBAAh_AIBAM8EACH9AiAA3QQAIf4CQADZBAAh_wICAM4EACEI4QICAKMFACHmAkAAogUAIecCQACiBQAh-wIBAKAFACH8AgEAoAUAIf0CIAChBQAh_gJAAKwFACH_AgIAowUAIQjhAgIAowUAIeYCQACiBQAh5wJAAKIFACH7AgEAoAUAIfwCAQCgBQAh_QIgAKEFACH-AkAArAUAIf8CAgCjBQAhCOECAgAAAAHmAkAAAAAB5wJAAAAAAfsCAQAAAAH8AgEAAAAB_QIgAAAAAf4CQAAAAAH_AgIAAAABAxcAAIYIACDtAwAAhwgAIPMDAAABACAEFwAAtgUAMO0DAAC3BQAw7wMAALkFACDzAwAAugUAMAAAAAAABRcAAP4HACAYAACECAAg7QMAAP8HACDuAwAAgwgAIPMDAAAFACAFFwAA_AcAIBgAAIEIACDtAwAA_QcAIO4DAACACAAg8wMAAAEAIAMXAAD-BwAg7QMAAP8HACDzAwAABQAgAxcAAPwHACDtAwAA_QcAIPMDAAABACAAAAAAAAUXAAD2BwAgGAAA-gcAIO0DAAD3BwAg7gMAAPkHACDzAwAAAQAgCxcAANQFADAYAADZBQAw7QMAANUFADDuAwAA1gUAMO8DAADXBQAg8AMAANgFADDxAwAA2AUAMPIDAADYBQAw8wMAANgFADD0AwAA2gUAMPUDAADbBQAwCAMAAMwFACDhAgIAAAAB4gICAAAAAeYCQAAAAAH8AgEAAAABggMBAAAAAYMDAgAAAAGEAwEAAAABAgAAAAkAIBcAAN8FACADAAAACQAgFwAA3wUAIBgAAN4FACABEgAA-AcAMA4DAACUBQAgBAAAmAUAIN4CAACXBQAw3wIAAAcAEOACAACXBQAw4QICAAAAAeICAgDOBAAh5gJAANAEACH8AgEAzwQAIYEDAgDOBAAhggMBAM8EACGDAwIAzgQAIYQDAQDPBAAh6gMAAJYFACACAAAACQAgEgAA3gUAIAIAAADcBQAgEgAA3QUAIAveAgAA2wUAMN8CAADcBQAQ4AIAANsFADDhAgIAzgQAIeICAgDOBAAh5gJAANAEACH8AgEAzwQAIYEDAgDOBAAhggMBAM8EACGDAwIAzgQAIYQDAQDPBAAhC94CAADbBQAw3wIAANwFABDgAgAA2wUAMOECAgDOBAAh4gICAM4EACHmAkAA0AQAIfwCAQDPBAAhgQMCAM4EACGCAwEAzwQAIYMDAgDOBAAhhAMBAM8EACEH4QICAKMFACHiAgIAowUAIeYCQACiBQAh_AIBAKAFACGCAwEAoAUAIYMDAgCjBQAhhAMBAKAFACEIAwAAygUAIOECAgCjBQAh4gICAKMFACHmAkAAogUAIfwCAQCgBQAhggMBAKAFACGDAwIAowUAIYQDAQCgBQAhCAMAAMwFACDhAgIAAAAB4gICAAAAAeYCQAAAAAH8AgEAAAABggMBAAAAAYMDAgAAAAGEAwEAAAABAxcAAPYHACDtAwAA9wcAIPMDAAABACAEFwAA1AUAMO0DAADVBQAw7wMAANcFACDzAwAA2AUAMAAAAAAABfADCAAAAAH3AwgAAAAB-AMIAAAAAfkDCAAAAAH6AwgAAAABBRcAAPEHACAYAAD0BwAg7QMAAPIHACDuAwAA8wcAIPMDAADlAgAgAxcAAPEHACDtAwAA8gcAIPMDAADlAgAgAAAAAAAFFwAA7AcAIBgAAO8HACDtAwAA7QcAIO4DAADuBwAg8wMAAOUCACADFwAA7AcAIO0DAADtBwAg8wMAAOUCACAAAAAAAAHwAwEAAAABBRcAAOUHACAYAADqBwAg7QMAAOYHACDuAwAA6QcAIPMDAADhAgAgCxcAAIYGADAYAACLBgAw7QMAAIcGADDuAwAAiAYAMO8DAACJBgAg8AMAAIoGADDxAwAAigYAMPIDAACKBgAw8wMAAIoGADD0AwAAjAYAMPUDAACNBgAwCxcAAPoFADAYAAD_BQAw7QMAAPsFADDuAwAA_AUAMO8DAAD9BQAg8AMAAP4FADDxAwAA_gUAMPIDAAD-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-QIBAAAAAQAAAAAABfADCAAAAAH3AwgAAAAB-AMIAAAAAfkDCAAAAAH6AwgAAAABAfkCAQAAAAEAAAAAAAH5AgEAAAABAAAAAAAB-QIBAAAAAQAAAAAAAfkCAQAAAAEAAAAAAAXwAwQAAAAB9wMEAAAAAfgDBAAAAAH5AwQAAAAB-gMEAAAAAQH5AgEAAAABAAAAAAAB-QIBAAAAAQAAAAAAAfkCAQAAAAEAAAAAAAH5AgEAAAABAAAAAAAFFwAA3wcAIBgAAOIHACDtAwAA4AcAIO4DAADhBwAg8wMAAGIAIAMXAADfBwAg7QMAAOAHACDzAwAAYgAgAAAAAAALFwAA9QYAMBgAAPoGADDtAwAA9gYAMO4DAAD3BgAw7wMAAPgGACDwAwAA-QYAMPEDAAD5BgAw8gMAAPkGADDzAwAA-QYAMPQDAAD7BgAw9QMAAPwGADAF4QICAAAAAeYCQAAAAAHnAkAAAAABhQMBAAAAAeADCAAAAAECAAAAZgAgFwAAgAcAIAMAAABmACAXAACABwAgGAAA_wYAIAESAADeBwAwCz8AAIMFACDeAgAAggUAMN8CAABkABDgAgAAggUAMOECAgAAAAHmAkAA0AQAIecCQADQBAAhhQMBAM8EACHfAwIAzgQAIeADCADnBAAh5QMAAIEFACACAAAAZgAgEgAA_wYAIAIAAAD9BgAgEgAA_gYAIAneAgAA_AYAMN8CAAD9BgAQ4AIAAPwGADDhAgIAzgQAIeYCQADQBAAh5wJAANAEACGFAwEAzwQAId8DAgDOBAAh4AMIAOcEACEJ3gIAAPwGADDfAgAA_QYAEOACAAD8BgAw4QICAM4EACHmAkAA0AQAIecCQADQBAAhhQMBAM8EACHfAwIAzgQAIeADCADnBAAhBeECAgCjBQAh5gJAAKIFACHnAkAAogUAIYUDAQCgBQAh4AMIALsGACEF4QICAKMFACHmAkAAogUAIecCQACiBQAhhQMBAKAFACHgAwgAuwYAIQXhAgIAAAAB5gJAAAAAAecCQAAAAAGFAwEAAAAB4AMIAAAAAQQXAAD1BgAw7QMAAPYGADDvAwAA-AYAIPMDAAD5BgAwAAH5AgEAAAABAkAAAIIHACD2AwAAgwcAIAH5AgEAAAABAAAAAAAB-QIBAAAAAQAAAAAAAfkCAQAAAAEAAAAAAAsXAAC8BwAwGAAAwQcAMO0DAAC9BwAw7gMAAL4HADDvAwAAvwcAIPADAADABwAw8QMAAMAHADDyAwAAwAcAMPMDAADABwAw9AMAAMIHADD1AwAAwwcAMAsXAACzBwAwGAAAtwcAMO0DAAC0BwAw7gMAALUHADDvAwAAtgcAIPADAADYBQAw8QMAANgFADDyAwAA2AUAMPMDAADYBQAw9AMAALgHADD1AwAA2wUAMAsXAACnBwAwGAAArAcAMO0DAACoBwAw7gMAAKkHADDvAwAAqgcAIPADAACrBwAw8QMAAKsHADDyAwAAqwcAMPMDAACrBwAw9AMAAK0HADD1AwAArgcAMAsXAACbBwAwGAAAoAcAMO0DAACcBwAw7gMAAJ0HADDvAwAAngcAIPADAACfBwAw8QMAAJ8HADDyAwAAnwcAMPMDAACfBwAw9AMAAKEHADD1AwAAogcAMAcKgAAAAAHhAgIAAAAB4wIBAAAAAeQCAQAAAAHlAiAAAAAB5gJAAAAAAecCQAAAAAECAAAAGAAgFwAApgcAIAMAAAAYACAXAACmBwAgGAAApQcAIAESAADdBwAwDAMAAJAFACAKAACGBQAg3gIAAI8FADDfAgAAFgAQ4AIAAI8FADDhAgIAAAAB4gICANwEACHjAgEAzwQAIeQCAQDPBAAh5QIgAN0EACHmAkAA0AQAIecCQADQBAAhAgAAABgAIBIAAKUHACACAAAAowcAIBIAAKQHACALCgAAhgUAIN4CAACiBwAw3wIAAKMHABDgAgAAogcAMOECAgDOBAAh4gICANwEACHjAgEAzwQAIeQCAQDPBAAh5QIgAN0EACHmAkAA0AQAIecCQADQBAAhCwoAAIYFACDeAgAAogcAMN8CAACjBwAQ4AIAAKIHADDhAgIAzgQAIeICAgDcBAAh4wIBAM8EACHkAgEAzwQAIeUCIADdBAAh5gJAANAEACHnAkAA0AQAIQcKgAAAAAHhAgIAowUAIeMCAQCgBQAh5AIBAKAFACHlAiAAoQUAIeYCQACiBQAh5wJAAKIFACEHCoAAAAAB4QICAKMFACHjAgEAoAUAIeQCAQCgBQAh5QIgAKEFACHmAkAAogUAIecCQACiBQAhBwqAAAAAAeECAgAAAAHjAgEAAAAB5AIBAAAAAeUCIAAAAAHmAkAAAAAB5wJAAAAAAQgKAADDBQAg4QICAAAAAeQCAQAAAAHmAkAAAAAB5wJAAAAAAfsCAQAAAAH8AgEAAAABgAMgAAAAAQIAAAAPACAXAACyBwAgAwAAAA8AIBcAALIHACAYAACxBwAgARIAANwHADANAwAAlAUAIAoAAJUFACDeAgAAkwUAMN8CAAANABDgAgAAkwUAMOECAgAAAAHiAgIAzgQAIeQCAQDPBAAh5gJAANAEACHnAkAA0AQAIfsCAQDPBAAh_AIBAM8EACGAAyAA3QQAIQIAAAAPACASAACxBwAgAgAAAK8HACASAACwBwAgC94CAACuBwAw3wIAAK8HABDgAgAArgcAMOECAgDOBAAh4gICAM4EACHkAgEAzwQAIeYCQADQBAAh5wJAANAEACH7AgEAzwQAIfwCAQDPBAAhgAMgAN0EACEL3gIAAK4HADDfAgAArwcAEOACAACuBwAw4QICAM4EACHiAgIAzgQAIeQCAQDPBAAh5gJAANAEACHnAkAA0AQAIfsCAQDPBAAh_AIBAM8EACGAAyAA3QQAIQfhAgIAowUAIeQCAQCgBQAh5gJAAKIFACHnAkAAogUAIfsCAQCgBQAh_AIBAKAFACGAAyAAoQUAIQgKAAC1BQAg4QICAKMFACHkAgEAoAUAIeYCQACiBQAh5wJAAKIFACH7AgEAoAUAIfwCAQCgBQAhgAMgAKEFACEICgAAwwUAIOECAgAAAAHkAgEAAAAB5gJAAAAAAecCQAAAAAH7AgEAAAAB_AIBAAAAAYADIAAAAAEIBAAAywUAIOECAgAAAAHmAkAAAAAB_AIBAAAAAYEDAgAAAAGCAwEAAAABgwMCAAAAAYQDAQAAAAECAAAACQAgFwAAuwcAIAMAAAAJACAXAAC7BwAgGAAAugcAIAESAADbBwAwAgAAAAkAIBIAALoHACACAAAA3AUAIBIAALkHACAH4QICAKMFACHmAkAAogUAIfwCAQCgBQAhgQMCAKMFACGCAwEAoAUAIYMDAgCjBQAhhAMBAKAFACEIBAAAyQUAIOECAgCjBQAh5gJAAKIFACH8AgEAoAUAIYEDAgCjBQAhggMBAKAFACGDAwIAowUAIYQDAQCgBQAhCAQAAMsFACDhAgIAAAAB5gJAAAAAAfwCAQAAAAGBAwIAAAABggMBAAAAAYMDAgAAAAGEAwEAAAABDAUAAOEFACDhAgIAAAAB4wIBAAAAAeYCQAAAAAHnAkAAAAAB_AIBAAAAAf8CAgAAAAGAAyAAAAABhQMBAAAAAYYDAgAAAAGHAwEAAAABiAMBAAAAAQIAAAAFACAXAADHBwAgAwAAAAUAIBcAAMcHACAYAADGBwAgARIAANoHADARAwAAlAUAIAUAAIwFACDeAgAAmQUAMN8CAAADABDgAgAAmQUAMOECAgAAAAHiAgIAzgQAIeMCAQDPBAAh5gJAANAEACHnAkAA0AQAIfwCAQDPBAAh_wICAM4EACGAAyAA3QQAIYUDAQDPBAAhhgMCAM4EACGHAwEAzwQAIYgDAQDPBAAhAgAAAAUAIBIAAMYHACACAAAAxAcAIBIAAMUHACAP3gIAAMMHADDfAgAAxAcAEOACAADDBwAw4QICAM4EACHiAgIAzgQAIeMCAQDPBAAh5gJAANAEACHnAkAA0AQAIfwCAQDPBAAh_wICAM4EACGAAyAA3QQAIYUDAQDPBAAhhgMCAM4EACGHAwEAzwQAIYgDAQDPBAAhD94CAADDBwAw3wIAAMQHABDgAgAAwwcAMOECAgDOBAAh4gICAM4EACHjAgEAzwQAIeYCQADQBAAh5wJAANAEACH8AgEAzwQAIf8CAgDOBAAhgAMgAN0EACGFAwEAzwQAIYYDAgDOBAAhhwMBAM8EACGIAwEAzwQAIQvhAgIAowUAIeMCAQCgBQAh5gJAAKIFACHnAkAAogUAIfwCAQCgBQAh_wICAKMFACGAAyAAoQUAIYUDAQCgBQAhhgMCAKMFACGHAwEAoAUAIYgDAQCgBQAhDAUAANMFACDhAgIAowUAIeMCAQCgBQAh5gJAAKIFACHnAkAAogUAIfwCAQCgBQAh_wICAKMFACGAAyAAoQUAIYUDAQCgBQAhhgMCAKMFACGHAwEAoAUAIYgDAQCgBQAhDAUAAOEFACDhAgIAAAAB4wIBAAAAAeYCQAAAAAHnAkAAAAAB_AIBAAAAAf8CAgAAAAGAAyAAAAABhQMBAAAAAYYDAgAAAAGHAwEAAAABiAMBAAAAAQQXAAC8BwAw7QMAAL0HADDvAwAAvwcAIPMDAADABwAwBBcAALMHADDtAwAAtAcAMO8DAAC2BwAg8wMAANgFADAEFwAApwcAMO0DAACoBwAw7wMAAKoHACDzAwAAqwcAMAQXAACbBwAw7QMAAJwHADDvAwAAngcAIPMDAACfBwAwAAAAAAH5AgEAAAABBQcAAMwHACAIAADNBwAgCwAAzgcAIAwAAM8HACD2AwAA0AcAIAH5AgEAAAABAwMAANEHACAKAADVBwAg9gMAANYHACAB-QIBAAAAAQAB-QIBAAAAAQMDAADRBwAgBQAAzQcAIPYDAADZBwAgAfkCAQAAAAEB-QIBAAAAAQvhAgIAAAAB4wIBAAAAAeYCQAAAAAHnAkAAAAAB_AIBAAAAAf8CAgAAAAGAAyAAAAABhQMBAAAAAYYDAgAAAAGHAwEAAAABiAMBAAAAAQfhAgIAAAAB5gJAAAAAAfwCAQAAAAGBAwIAAAABggMBAAAAAYMDAgAAAAGEAwEAAAABB-ECAgAAAAHkAgEAAAAB5gJAAAAAAecCQAAAAAH7AgEAAAAB_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_AIBAAAAAf8CAgAAAAGAAyAAAAABhQMBAAAAAYYDAgAAAAGHAwEAAAABiAMBAAAAAQIAAAAFACAXAAD-BwAgAwAAABoAIBcAAPwHACAYAACCCAAgCwAAABoAIAcAAJcHACALAACZBwAgDAAAmgcAIBIAAIIIACDhAgIAowUAIeMCAQCgBQAh5gJAAKIFACHnAkAAogUAIegDAQCgBQAh6QMBAKAFACEJBwAAlwcAIAsAAJkHACAMAACaBwAg4QICAKMFACHjAgEAoAUAIeYCQACiBQAh5wJAAKIFACHoAwEAoAUAIekDAQCgBQAhAwAAAAMAIBcAAP4HACAYAACFCAAgDwAAAAMAIAMAANIFACASAACFCAAg4QICAKMFACHiAgIAowUAIeMCAQCgBQAh5gJAAKIFACHnAkAAogUAIfwCAQCgBQAh_wICAKMFACGAAyAAoQUAIYUDAQCgBQAhhgMCAKMFACGHAwEAoAUAIYgDAQCgBQAhDQMAANIFACDhAgIAowUAIeICAgCjBQAh4wIBAKAFACHmAkAAogUAIecCQACiBQAh_AIBAKAFACH_AgIAowUAIYADIAChBQAhhQMBAKAFACGGAwIAowUAIYcDAQCgBQAhiAMBAKAFACEJBwAAyAcAIAgAAMkHACAMAADLBwAg4QICAAAAAeMCAQAAAAHmAkAAAAAB5wJAAAAAAegDAQAAAAHpAwEAAAABAgAAAAEAIBcAAIYIACAI4QICAAAAAeYCQAAAAAHnAkAAAAAB-wIBAAAAAfwCAQAAAAH9AiAAAAAB_gJAAAAAAf8CAgAAAAEDAAAAGgAgFwAAhggAIBgAAIsIACALAAAAGgAgBwAAlwcAIAgAAJgHACAMAACaBwAgEgAAiwgAIOECAgCjBQAh4wIBAKAFACHmAkAAogUAIecCQACiBQAh6AMBAKAFACHpAwEAoAUAIQkHAACXBwAgCAAAmAcAIAwAAJoHACDhAgIAowUAIeMCAQCgBQAh5gJAAKIFACHnAkAAogUAIegDAQCgBQAh6QMBAKAFACEJAwAAwgUAIOECAgAAAAHiAgIAAAAB5AIBAAAAAeYCQAAAAAHnAkAAAAAB-wIBAAAAAfwCAQAAAAGAAyAAAAABAgAAAA8AIBcAAIwIACADAAAADQAgFwAAjAgAIBgAAJAIACALAAAADQAgAwAAtAUAIBIAAJAIACDhAgIAowUAIeICAgCjBQAh5AIBAKAFACHmAkAAogUAIecCQACiBQAh-wIBAKAFACH8AgEAoAUAIYADIAChBQAhCQMAALQFACDhAgIAowUAIeICAgCjBQAh5AIBAKAFACHmAkAAogUAIecCQACiBQAh-wIBAKAFACH8AgEAoAUAIYADIAChBQAhCQcAAMgHACAIAADJBwAgCwAAygcAIOECAgAAAAHjAgEAAAAB5gJAAAAAAecCQAAAAAHoAwEAAAAB6QMBAAAAAQIAAAABACAXAACRCAAgAwAAABoAIBcAAJEIACAYAACVCAAgCwAAABoAIAcAAJcHACAIAACYBwAgCwAAmQcAIBIAAJUIACDhAgIAowUAIeMCAQCgBQAh5gJAAKIFACHnAkAAogUAIegDAQCgBQAh6QMBAKAFACEJBwAAlwcAIAgAAJgHACALAACZBwAg4QICAKMFACHjAgEAoAUAIeYCQACiBQAh5wJAAKIFACHoAwEAoAUAIekDAQCgBQAhBQYACQcGAggMAwsQBQwZCAMDAAEFCgMGAAQCAwABBAACAQULAAMDAAEGAAcKFAYBCQAFAQoVAAEDGwEEBxwACB0ACx4ADB8AAAUGAAwdAA0eAA4fAA8gABAAAAAAAAUGAAwdAA0eAA4fAA8gABAABQYAFB0AFR4AFh8AFyAAGAAAAAAABQYAFB0AFR4AFh8AFyAAGAAFBgAcHQAdHgAeHwAfIAAgAAAAAAAFBgAcHQAdHgAeHwAfIAAgAgYAJEBnIwE_ACIBQGgABQYAJh0AJx4AKB8AKSAAKgAAAAAABQYAJh0AJx4AKB8AKSAAKgUGAC0dAC4eAC8fADAgADEAAAAAAAUGAC0dAC4eAC8fADAgADEABQYANR0ANh4ANx8AOCAAOQAAAAAABQYANR0ANh4ANx8AOCAAOQAFBgA9HQA-HgA_HwBAIABBAAAAAAAFBgA9HQA-HgA_HwBAIABBAAUGAEUdAEYeAEcfAEggAEkAAAAAAAUGAEUdAEYeAEcfAEggAEkABQYATR0ATh4ATx8AUCAAUQAAAAAABQYATR0ATh4ATx8AUCAAUQAFBgBVHQBWHgBXHwBYIABZAAAAAAAFBgBVHQBWHgBXHwBYIABZAAUGAF0dAF4eAF8fAGAgAGEAAAAAAAUGAF0dAF4eAF8fAGAgAGEABQYAZR0AZh4AZx8AaCAAaQAAAAAABQYAZR0AZh4AZx8AaCAAaQAFBgBtHQBuHgBvHwBwIABxAAAAAAAFBgBtHQBuHgBvHwBwIABxAAUGAHUdAHYeAHcfAHggAHkAAAAAAAUGAHUdAHYeAHcfAHggAHkCBgCAAd8B5gJ8BAYAf9sBAHvdAeoCfd4B7gJ-AdwBAHwB3AEAfALdAe8CAN4B8AIAAd8B8QIABQYAggEdAIMBHgCEAR8AhQEgAIYBAAAAAAAFBgCCAR0AgwEeAIQBHwCFASAAhgEFBgCJAR0AigEeAIsBHwCMASAAjQEAAAAAAAUGAIkBHQCKAR4AiwEfAIwBIACNAQUGAJABHQCRAR4AkgEfAJMBIACUAQAAAAAABQYAkAEdAJEBHgCSAR8AkwEgAJQBBQYAlwEdAJgBHgCZAR8AmgEgAJsBAAAAAAAFBgCXAR0AmAEeAJkBHwCaASAAmwEFBgCeAR0AnwEeAKABHwChASAAogEAAAAAAAUGAJ4BHQCfAR4AoAEfAKEBIACiAQUGAKUBHQCmAR4ApwEfAKgBIACpAQAAAAAABQYApQEdAKYBHgCnAR8AqAEgAKkBBQYArAEdAK0BHgCuAR8ArwEgALABAAAAAAAFBgCsAR0ArQEeAK4BHwCvASAAsAEFBgCzAR0AtAEeALUBHwC2ASAAtwEAAAAAAAUGALMBHQC0AR4AtQEfALYBIAC3AQUGALoBHQC7AR4AvAEfAL0BIAC-AQAAAAAABQYAugEdALsBHgC8AR8AvQEgAL4BDQIBDiABDyIBECMBESQBEyYBFCgKFSoBFiwKGS0BGi4BGy8KITILIjMRIzUSJDYSJTkSJjoSJzsSKD0SKT8KKkESK0MKLEQSLUUSLkYKL0kTMEoZMUwaMk0aM1AaNFEaNVIaNlQaN1YKOFgaOVoKOlsaO1waPF0KPWAbPmEhQWMiQmkiQ2wiRG0iRW4iRnAiR3IKSHQiSXYKSnciS3giTHkKTXwlTn0rT34jUH8jUYABI1KBASNTggEjVIQBI1WGAQpWiAEjV4oBCliLASNZjAEjWo0BCluQASxckQEyXZMBM16UATNflwEzYJgBM2GZATNimwEzY50BCmSfATNloQEKZqIBM2ejATNopAEKaacBNGqoATprqgE7bKsBO22uATturwE7b7ABO3CyATtxtAEKcrYBO3O4AQp0uQE7dboBO3a7AQp3vgE8eL8BQnnBAUN6wgFDe8UBQ3zGAUN9xwFDfskBQ3_LAQqAAc0BQ4EBzwEKggHQAUODAdEBQ4QB0gEKhQHVAUSGAdYBSocB2AFLiAHZAUuJAdwBS4oB3QFLiwHeAUuMAeABS40B4gEKjgHkAUuPAeYBCpAB5wFLkQHoAUuSAekBCpMB7AFMlAHtAVKVAe8BU5YB8AFTlwHzAVOYAfQBU5kB9QFTmgH3AVObAfkBCpwB-wFTnQH9AQqeAf4BU58B_wFToAGAAgqhAYMCVKIBhAJaowGGAlukAYcCW6UBigJbpgGLAlunAYwCW6gBjgJbqQGQAgqqAZICW6sBlAIKrAGVAlutAZYCW64BlwIKrwGaAlywAZsCYrEBnQJjsgGeAmOzAaECY7QBogJjtQGjAmO2AaUCY7cBpwIKuAGpAmO5AasCCroBrAJjuwGtAmO8Aa4CCr0BsQJkvgGyAmq_AbQCa8ABtQJrwQG4AmvCAbkCa8MBugJrxAG8AmvFAb4CCsYBwAJrxwHCAgrIAcMCa8kBxAJrygHFAgrLAcgCbMwByQJyzQHLAnPOAcwCc88BzwJz0AHQAnPRAdECc9IB0wJz0wHVAgrUAdcCc9UB2QIK1gHaAnPXAdsCc9gB3AIK2QHfAnTaAeACeuAB4gJ74QHyAnviAfUCe-MB9gJ75AH3AnvlAfkCe-YB-wIK5wH9AnvoAf8CCukBgAN76gGBA3vrAYIDCuwBhQOBAe0BhgOHAe4BhwN87wGIA3zwAYkDfPEBigN88gGLA3zzAY0DfPQBjwMK9QGRA3z2AZMDCvcBlAN8-AGVA3z5AZYDCvoBmQOIAfsBmgOOAfwBmwN9_QGcA33-AZ0Dff8BngN9gAKfA32BAqEDfYICowMKgwKlA32EAqcDCoUCqAN9hgKpA32HAqoDCogCrQOPAYkCrgOVAYoCrwN-iwKwA36MArEDfo0CsgN-jgKzA36PArUDfpACtwMKkQK5A36SArsDCpMCvAN-lAK9A36VAr4DCpYCwQOWAZcCwgOcAZgCwwMCmQLEAwKaAsUDApsCxgMCnALHAwKdAskDAp4CywMKnwLNAwKgAs8DCqEC0AMCogLRAwKjAtIDCqQC1QOdAaUC1gOjAaYC1wMDpwLYAwOoAtkDA6kC2gMDqgLbAwOrAt0DA6wC3wMKrQLhAwOuAuMDCq8C5AMDsALlAwOxAuYDCrIC6QOkAbMC6gOqAbQC6wMFtQLsAwW2Au0DBbcC7gMFuALvAwW5AvEDBboC8wMKuwL1AwW8AvcDCr0C-AMFvgL5AwW_AvoDCsAC_QOrAcEC_gOxAcIC_wMGwwKABAbEAoEEBsUCggQGxgKDBAbHAoUEBsgChwQKyQKJBAbKAosECssCjAQGzAKNBAbNAo4ECs4CkQSyAc8CkgS4AdACkwQI0QKUBAjSApUECNMClgQI1AKXBAjVApkECNYCmwQK1wKdBAjYAp8ECtkCoAQI2gKhBAjbAqIECtwCpQS5Ad0CpgS_AQ" } async function decodeBase64AsWasm(wasmBase64: string): Promise { @@ -367,6 +367,56 @@ export interface PrismaClient< * ``` */ get mihomeEnvHour(): Prisma.MihomeEnvHourDelegate; + + /** + * `prisma.habit`: Exposes CRUD operations for the **Habit** model. + * Example usage: + * ```ts + * // Fetch zero or more Habits + * const habits = await prisma.habit.findMany() + * ``` + */ + get habit(): Prisma.HabitDelegate; + + /** + * `prisma.checkIn`: Exposes CRUD operations for the **CheckIn** model. + * Example usage: + * ```ts + * // Fetch zero or more CheckIns + * const checkIns = await prisma.checkIn.findMany() + * ``` + */ + get checkIn(): Prisma.CheckInDelegate; + + /** + * `prisma.checkList`: Exposes CRUD operations for the **CheckList** model. + * Example usage: + * ```ts + * // Fetch zero or more CheckLists + * const checkLists = await prisma.checkList.findMany() + * ``` + */ + get checkList(): Prisma.CheckListDelegate; + + /** + * `prisma.checkListItem`: Exposes CRUD operations for the **CheckListItem** model. + * Example usage: + * ```ts + * // Fetch zero or more CheckListItems + * const checkListItems = await prisma.checkListItem.findMany() + * ``` + */ + get checkListItem(): Prisma.CheckListItemDelegate; + + /** + * `prisma.checkListTemplate`: Exposes CRUD operations for the **CheckListTemplate** model. + * Example usage: + * ```ts + * // Fetch zero or more CheckListTemplates + * const checkListTemplates = await prisma.checkListTemplate.findMany() + * ``` + */ + get checkListTemplate(): Prisma.CheckListTemplateDelegate; } export function getPrismaClientClass(): PrismaClientConstructor { diff --git a/generated/prisma/internal/prismaNamespace.ts b/generated/prisma/internal/prismaNamespace.ts index 2a1166a..26ef65d 100644 --- a/generated/prisma/internal/prismaNamespace.ts +++ b/generated/prisma/internal/prismaNamespace.ts @@ -401,7 +401,12 @@ export const ModelName = { MihomeHome: 'MihomeHome', MihomeDevice: 'MihomeDevice', MihomeEnvSample: 'MihomeEnvSample', - MihomeEnvHour: 'MihomeEnvHour' + MihomeEnvHour: 'MihomeEnvHour', + Habit: 'Habit', + CheckIn: 'CheckIn', + CheckList: 'CheckList', + CheckListItem: 'CheckListItem', + CheckListTemplate: 'CheckListTemplate' } as const export type ModelName = (typeof ModelName)[keyof typeof ModelName] @@ -417,7 +422,7 @@ export type TypeMap + fields: Prisma.HabitFieldRefs + operations: { + findUnique: { + args: Prisma.HabitFindUniqueArgs + result: runtime.Types.Utils.PayloadToResult | null + } + findUniqueOrThrow: { + args: Prisma.HabitFindUniqueOrThrowArgs + result: runtime.Types.Utils.PayloadToResult + } + findFirst: { + args: Prisma.HabitFindFirstArgs + result: runtime.Types.Utils.PayloadToResult | null + } + findFirstOrThrow: { + args: Prisma.HabitFindFirstOrThrowArgs + result: runtime.Types.Utils.PayloadToResult + } + findMany: { + args: Prisma.HabitFindManyArgs + result: runtime.Types.Utils.PayloadToResult[] + } + create: { + args: Prisma.HabitCreateArgs + result: runtime.Types.Utils.PayloadToResult + } + createMany: { + args: Prisma.HabitCreateManyArgs + result: BatchPayload + } + delete: { + args: Prisma.HabitDeleteArgs + result: runtime.Types.Utils.PayloadToResult + } + update: { + args: Prisma.HabitUpdateArgs + result: runtime.Types.Utils.PayloadToResult + } + deleteMany: { + args: Prisma.HabitDeleteManyArgs + result: BatchPayload + } + updateMany: { + args: Prisma.HabitUpdateManyArgs + result: BatchPayload + } + upsert: { + args: Prisma.HabitUpsertArgs + result: runtime.Types.Utils.PayloadToResult + } + aggregate: { + args: Prisma.HabitAggregateArgs + result: runtime.Types.Utils.Optional + } + groupBy: { + args: Prisma.HabitGroupByArgs + result: runtime.Types.Utils.Optional[] + } + count: { + args: Prisma.HabitCountArgs + result: runtime.Types.Utils.Optional | number + } + } + } + CheckIn: { + payload: Prisma.$CheckInPayload + fields: Prisma.CheckInFieldRefs + operations: { + findUnique: { + args: Prisma.CheckInFindUniqueArgs + result: runtime.Types.Utils.PayloadToResult | null + } + findUniqueOrThrow: { + args: Prisma.CheckInFindUniqueOrThrowArgs + result: runtime.Types.Utils.PayloadToResult + } + findFirst: { + args: Prisma.CheckInFindFirstArgs + result: runtime.Types.Utils.PayloadToResult | null + } + findFirstOrThrow: { + args: Prisma.CheckInFindFirstOrThrowArgs + result: runtime.Types.Utils.PayloadToResult + } + findMany: { + args: Prisma.CheckInFindManyArgs + result: runtime.Types.Utils.PayloadToResult[] + } + create: { + args: Prisma.CheckInCreateArgs + result: runtime.Types.Utils.PayloadToResult + } + createMany: { + args: Prisma.CheckInCreateManyArgs + result: BatchPayload + } + delete: { + args: Prisma.CheckInDeleteArgs + result: runtime.Types.Utils.PayloadToResult + } + update: { + args: Prisma.CheckInUpdateArgs + result: runtime.Types.Utils.PayloadToResult + } + deleteMany: { + args: Prisma.CheckInDeleteManyArgs + result: BatchPayload + } + updateMany: { + args: Prisma.CheckInUpdateManyArgs + result: BatchPayload + } + upsert: { + args: Prisma.CheckInUpsertArgs + result: runtime.Types.Utils.PayloadToResult + } + aggregate: { + args: Prisma.CheckInAggregateArgs + result: runtime.Types.Utils.Optional + } + groupBy: { + args: Prisma.CheckInGroupByArgs + result: runtime.Types.Utils.Optional[] + } + count: { + args: Prisma.CheckInCountArgs + result: runtime.Types.Utils.Optional | number + } + } + } + CheckList: { + payload: Prisma.$CheckListPayload + fields: Prisma.CheckListFieldRefs + operations: { + findUnique: { + args: Prisma.CheckListFindUniqueArgs + result: runtime.Types.Utils.PayloadToResult | null + } + findUniqueOrThrow: { + args: Prisma.CheckListFindUniqueOrThrowArgs + result: runtime.Types.Utils.PayloadToResult + } + findFirst: { + args: Prisma.CheckListFindFirstArgs + result: runtime.Types.Utils.PayloadToResult | null + } + findFirstOrThrow: { + args: Prisma.CheckListFindFirstOrThrowArgs + result: runtime.Types.Utils.PayloadToResult + } + findMany: { + args: Prisma.CheckListFindManyArgs + result: runtime.Types.Utils.PayloadToResult[] + } + create: { + args: Prisma.CheckListCreateArgs + result: runtime.Types.Utils.PayloadToResult + } + createMany: { + args: Prisma.CheckListCreateManyArgs + result: BatchPayload + } + delete: { + args: Prisma.CheckListDeleteArgs + result: runtime.Types.Utils.PayloadToResult + } + update: { + args: Prisma.CheckListUpdateArgs + result: runtime.Types.Utils.PayloadToResult + } + deleteMany: { + args: Prisma.CheckListDeleteManyArgs + result: BatchPayload + } + updateMany: { + args: Prisma.CheckListUpdateManyArgs + result: BatchPayload + } + upsert: { + args: Prisma.CheckListUpsertArgs + result: runtime.Types.Utils.PayloadToResult + } + aggregate: { + args: Prisma.CheckListAggregateArgs + result: runtime.Types.Utils.Optional + } + groupBy: { + args: Prisma.CheckListGroupByArgs + result: runtime.Types.Utils.Optional[] + } + count: { + args: Prisma.CheckListCountArgs + result: runtime.Types.Utils.Optional | number + } + } + } + CheckListItem: { + payload: Prisma.$CheckListItemPayload + fields: Prisma.CheckListItemFieldRefs + operations: { + findUnique: { + args: Prisma.CheckListItemFindUniqueArgs + result: runtime.Types.Utils.PayloadToResult | null + } + findUniqueOrThrow: { + args: Prisma.CheckListItemFindUniqueOrThrowArgs + result: runtime.Types.Utils.PayloadToResult + } + findFirst: { + args: Prisma.CheckListItemFindFirstArgs + result: runtime.Types.Utils.PayloadToResult | null + } + findFirstOrThrow: { + args: Prisma.CheckListItemFindFirstOrThrowArgs + result: runtime.Types.Utils.PayloadToResult + } + findMany: { + args: Prisma.CheckListItemFindManyArgs + result: runtime.Types.Utils.PayloadToResult[] + } + create: { + args: Prisma.CheckListItemCreateArgs + result: runtime.Types.Utils.PayloadToResult + } + createMany: { + args: Prisma.CheckListItemCreateManyArgs + result: BatchPayload + } + delete: { + args: Prisma.CheckListItemDeleteArgs + result: runtime.Types.Utils.PayloadToResult + } + update: { + args: Prisma.CheckListItemUpdateArgs + result: runtime.Types.Utils.PayloadToResult + } + deleteMany: { + args: Prisma.CheckListItemDeleteManyArgs + result: BatchPayload + } + updateMany: { + args: Prisma.CheckListItemUpdateManyArgs + result: BatchPayload + } + upsert: { + args: Prisma.CheckListItemUpsertArgs + result: runtime.Types.Utils.PayloadToResult + } + aggregate: { + args: Prisma.CheckListItemAggregateArgs + result: runtime.Types.Utils.Optional + } + groupBy: { + args: Prisma.CheckListItemGroupByArgs + result: runtime.Types.Utils.Optional[] + } + count: { + args: Prisma.CheckListItemCountArgs + result: runtime.Types.Utils.Optional | number + } + } + } + CheckListTemplate: { + payload: Prisma.$CheckListTemplatePayload + fields: Prisma.CheckListTemplateFieldRefs + operations: { + findUnique: { + args: Prisma.CheckListTemplateFindUniqueArgs + result: runtime.Types.Utils.PayloadToResult | null + } + findUniqueOrThrow: { + args: Prisma.CheckListTemplateFindUniqueOrThrowArgs + result: runtime.Types.Utils.PayloadToResult + } + findFirst: { + args: Prisma.CheckListTemplateFindFirstArgs + result: runtime.Types.Utils.PayloadToResult | null + } + findFirstOrThrow: { + args: Prisma.CheckListTemplateFindFirstOrThrowArgs + result: runtime.Types.Utils.PayloadToResult + } + findMany: { + args: Prisma.CheckListTemplateFindManyArgs + result: runtime.Types.Utils.PayloadToResult[] + } + create: { + args: Prisma.CheckListTemplateCreateArgs + result: runtime.Types.Utils.PayloadToResult + } + createMany: { + args: Prisma.CheckListTemplateCreateManyArgs + result: BatchPayload + } + delete: { + args: Prisma.CheckListTemplateDeleteArgs + result: runtime.Types.Utils.PayloadToResult + } + update: { + args: Prisma.CheckListTemplateUpdateArgs + result: runtime.Types.Utils.PayloadToResult + } + deleteMany: { + args: Prisma.CheckListTemplateDeleteManyArgs + result: BatchPayload + } + updateMany: { + args: Prisma.CheckListTemplateUpdateManyArgs + result: BatchPayload + } + upsert: { + args: Prisma.CheckListTemplateUpsertArgs + result: runtime.Types.Utils.PayloadToResult + } + aggregate: { + args: Prisma.CheckListTemplateAggregateArgs + result: runtime.Types.Utils.Optional + } + groupBy: { + args: Prisma.CheckListTemplateGroupByArgs + result: runtime.Types.Utils.Optional[] + } + count: { + args: Prisma.CheckListTemplateCountArgs + result: runtime.Types.Utils.Optional | number + } + } + } } } & { other: { @@ -1924,6 +2259,81 @@ export const MihomeEnvHourScalarFieldEnum = { export type MihomeEnvHourScalarFieldEnum = (typeof MihomeEnvHourScalarFieldEnum)[keyof typeof MihomeEnvHourScalarFieldEnum] +export const HabitScalarFieldEnum = { + id: 'id', + userId: 'userId', + name: 'name', + period: 'period', + target: 'target', + color: 'color', + icon: 'icon', + note: 'note', + archived: 'archived', + sortOrder: 'sortOrder', + createdAt: 'createdAt', + updatedAt: 'updatedAt' +} as const + +export type HabitScalarFieldEnum = (typeof HabitScalarFieldEnum)[keyof typeof HabitScalarFieldEnum] + + +export const CheckInScalarFieldEnum = { + id: 'id', + habitId: 'habitId', + userId: 'userId', + date: 'date', + seq: 'seq', + note: 'note', + source: 'source', + createdAt: 'createdAt' +} as const + +export type CheckInScalarFieldEnum = (typeof CheckInScalarFieldEnum)[keyof typeof CheckInScalarFieldEnum] + + +export const CheckListScalarFieldEnum = { + id: 'id', + userId: 'userId', + title: 'title', + scene: 'scene', + note: 'note', + archived: 'archived', + createdAt: 'createdAt', + updatedAt: 'updatedAt' +} as const + +export type CheckListScalarFieldEnum = (typeof CheckListScalarFieldEnum)[keyof typeof CheckListScalarFieldEnum] + + +export const CheckListItemScalarFieldEnum = { + id: 'id', + listId: 'listId', + title: 'title', + note: 'note', + done: 'done', + doneAt: 'doneAt', + sortOrder: 'sortOrder', + createdAt: 'createdAt', + updatedAt: 'updatedAt' +} as const + +export type CheckListItemScalarFieldEnum = (typeof CheckListItemScalarFieldEnum)[keyof typeof CheckListItemScalarFieldEnum] + + +export const CheckListTemplateScalarFieldEnum = { + id: 'id', + userId: 'userId', + name: 'name', + scene: 'scene', + items: 'items', + builtin: 'builtin', + createdAt: 'createdAt', + updatedAt: 'updatedAt' +} as const + +export type CheckListTemplateScalarFieldEnum = (typeof CheckListTemplateScalarFieldEnum)[keyof typeof CheckListTemplateScalarFieldEnum] + + export const SortOrder = { asc: 'asc', desc: 'desc' @@ -2128,6 +2538,51 @@ export const MihomeEnvSampleOrderByRelevanceFieldEnum = { export type MihomeEnvSampleOrderByRelevanceFieldEnum = (typeof MihomeEnvSampleOrderByRelevanceFieldEnum)[keyof typeof MihomeEnvSampleOrderByRelevanceFieldEnum] +export const HabitOrderByRelevanceFieldEnum = { + name: 'name', + period: 'period', + color: 'color', + icon: 'icon', + note: 'note' +} as const + +export type HabitOrderByRelevanceFieldEnum = (typeof HabitOrderByRelevanceFieldEnum)[keyof typeof HabitOrderByRelevanceFieldEnum] + + +export const CheckInOrderByRelevanceFieldEnum = { + date: 'date', + note: 'note', + source: 'source' +} as const + +export type CheckInOrderByRelevanceFieldEnum = (typeof CheckInOrderByRelevanceFieldEnum)[keyof typeof CheckInOrderByRelevanceFieldEnum] + + +export const CheckListOrderByRelevanceFieldEnum = { + title: 'title', + scene: 'scene', + note: 'note' +} as const + +export type CheckListOrderByRelevanceFieldEnum = (typeof CheckListOrderByRelevanceFieldEnum)[keyof typeof CheckListOrderByRelevanceFieldEnum] + + +export const CheckListItemOrderByRelevanceFieldEnum = { + title: 'title', + note: 'note' +} as const + +export type CheckListItemOrderByRelevanceFieldEnum = (typeof CheckListItemOrderByRelevanceFieldEnum)[keyof typeof CheckListItemOrderByRelevanceFieldEnum] + + +export const CheckListTemplateOrderByRelevanceFieldEnum = { + name: 'name', + scene: 'scene' +} as const + +export type CheckListTemplateOrderByRelevanceFieldEnum = (typeof CheckListTemplateOrderByRelevanceFieldEnum)[keyof typeof CheckListTemplateOrderByRelevanceFieldEnum] + + /** * Field references @@ -2302,6 +2757,11 @@ export type GlobalOmitConfig = { mihomeDevice?: Prisma.MihomeDeviceOmit mihomeEnvSample?: Prisma.MihomeEnvSampleOmit mihomeEnvHour?: Prisma.MihomeEnvHourOmit + habit?: Prisma.HabitOmit + checkIn?: Prisma.CheckInOmit + checkList?: Prisma.CheckListOmit + checkListItem?: Prisma.CheckListItemOmit + checkListTemplate?: Prisma.CheckListTemplateOmit } /* Types for Logging */ diff --git a/generated/prisma/internal/prismaNamespaceBrowser.ts b/generated/prisma/internal/prismaNamespaceBrowser.ts index 96969ba..64b061e 100644 --- a/generated/prisma/internal/prismaNamespaceBrowser.ts +++ b/generated/prisma/internal/prismaNamespaceBrowser.ts @@ -68,7 +68,12 @@ export const ModelName = { MihomeHome: 'MihomeHome', MihomeDevice: 'MihomeDevice', MihomeEnvSample: 'MihomeEnvSample', - MihomeEnvHour: 'MihomeEnvHour' + MihomeEnvHour: 'MihomeEnvHour', + Habit: 'Habit', + CheckIn: 'CheckIn', + CheckList: 'CheckList', + CheckListItem: 'CheckListItem', + CheckListTemplate: 'CheckListTemplate' } as const export type ModelName = (typeof ModelName)[keyof typeof ModelName] @@ -363,6 +368,81 @@ export const MihomeEnvHourScalarFieldEnum = { export type MihomeEnvHourScalarFieldEnum = (typeof MihomeEnvHourScalarFieldEnum)[keyof typeof MihomeEnvHourScalarFieldEnum] +export const HabitScalarFieldEnum = { + id: 'id', + userId: 'userId', + name: 'name', + period: 'period', + target: 'target', + color: 'color', + icon: 'icon', + note: 'note', + archived: 'archived', + sortOrder: 'sortOrder', + createdAt: 'createdAt', + updatedAt: 'updatedAt' +} as const + +export type HabitScalarFieldEnum = (typeof HabitScalarFieldEnum)[keyof typeof HabitScalarFieldEnum] + + +export const CheckInScalarFieldEnum = { + id: 'id', + habitId: 'habitId', + userId: 'userId', + date: 'date', + seq: 'seq', + note: 'note', + source: 'source', + createdAt: 'createdAt' +} as const + +export type CheckInScalarFieldEnum = (typeof CheckInScalarFieldEnum)[keyof typeof CheckInScalarFieldEnum] + + +export const CheckListScalarFieldEnum = { + id: 'id', + userId: 'userId', + title: 'title', + scene: 'scene', + note: 'note', + archived: 'archived', + createdAt: 'createdAt', + updatedAt: 'updatedAt' +} as const + +export type CheckListScalarFieldEnum = (typeof CheckListScalarFieldEnum)[keyof typeof CheckListScalarFieldEnum] + + +export const CheckListItemScalarFieldEnum = { + id: 'id', + listId: 'listId', + title: 'title', + note: 'note', + done: 'done', + doneAt: 'doneAt', + sortOrder: 'sortOrder', + createdAt: 'createdAt', + updatedAt: 'updatedAt' +} as const + +export type CheckListItemScalarFieldEnum = (typeof CheckListItemScalarFieldEnum)[keyof typeof CheckListItemScalarFieldEnum] + + +export const CheckListTemplateScalarFieldEnum = { + id: 'id', + userId: 'userId', + name: 'name', + scene: 'scene', + items: 'items', + builtin: 'builtin', + createdAt: 'createdAt', + updatedAt: 'updatedAt' +} as const + +export type CheckListTemplateScalarFieldEnum = (typeof CheckListTemplateScalarFieldEnum)[keyof typeof CheckListTemplateScalarFieldEnum] + + export const SortOrder = { asc: 'asc', desc: 'desc' @@ -566,3 +646,48 @@ export const MihomeEnvSampleOrderByRelevanceFieldEnum = { export type MihomeEnvSampleOrderByRelevanceFieldEnum = (typeof MihomeEnvSampleOrderByRelevanceFieldEnum)[keyof typeof MihomeEnvSampleOrderByRelevanceFieldEnum] + +export const HabitOrderByRelevanceFieldEnum = { + name: 'name', + period: 'period', + color: 'color', + icon: 'icon', + note: 'note' +} as const + +export type HabitOrderByRelevanceFieldEnum = (typeof HabitOrderByRelevanceFieldEnum)[keyof typeof HabitOrderByRelevanceFieldEnum] + + +export const CheckInOrderByRelevanceFieldEnum = { + date: 'date', + note: 'note', + source: 'source' +} as const + +export type CheckInOrderByRelevanceFieldEnum = (typeof CheckInOrderByRelevanceFieldEnum)[keyof typeof CheckInOrderByRelevanceFieldEnum] + + +export const CheckListOrderByRelevanceFieldEnum = { + title: 'title', + scene: 'scene', + note: 'note' +} as const + +export type CheckListOrderByRelevanceFieldEnum = (typeof CheckListOrderByRelevanceFieldEnum)[keyof typeof CheckListOrderByRelevanceFieldEnum] + + +export const CheckListItemOrderByRelevanceFieldEnum = { + title: 'title', + note: 'note' +} as const + +export type CheckListItemOrderByRelevanceFieldEnum = (typeof CheckListItemOrderByRelevanceFieldEnum)[keyof typeof CheckListItemOrderByRelevanceFieldEnum] + + +export const CheckListTemplateOrderByRelevanceFieldEnum = { + name: 'name', + scene: 'scene' +} as const + +export type CheckListTemplateOrderByRelevanceFieldEnum = (typeof CheckListTemplateOrderByRelevanceFieldEnum)[keyof typeof CheckListTemplateOrderByRelevanceFieldEnum] + diff --git a/generated/prisma/models.ts b/generated/prisma/models.ts index 05ae935..5cd3c70 100644 --- a/generated/prisma/models.ts +++ b/generated/prisma/models.ts @@ -26,4 +26,9 @@ export type * from './models/MihomeHome.ts' export type * from './models/MihomeDevice.ts' export type * from './models/MihomeEnvSample.ts' export type * from './models/MihomeEnvHour.ts' +export type * from './models/Habit.ts' +export type * from './models/CheckIn.ts' +export type * from './models/CheckList.ts' +export type * from './models/CheckListItem.ts' +export type * from './models/CheckListTemplate.ts' export type * from './commonInputTypes.ts' \ No newline at end of file diff --git a/generated/prisma/models/CheckIn.ts b/generated/prisma/models/CheckIn.ts new file mode 100644 index 0000000..afe0207 --- /dev/null +++ b/generated/prisma/models/CheckIn.ts @@ -0,0 +1,1518 @@ + +/* !!! This is code generated by Prisma. Do not edit directly. !!! */ +/* eslint-disable */ +// biome-ignore-all lint: generated file +// @ts-nocheck +/* + * This file exports the `CheckIn` model and its related types. + * + * 🟢 You can import this file directly. + */ +import type * as runtime from "@prisma/client/runtime/client" +import type * as $Enums from "../enums.ts" +import type * as Prisma from "../internal/prismaNamespace.ts" + +/** + * Model CheckIn + * + */ +export type CheckInModel = runtime.Types.Result.DefaultSelection + +export type AggregateCheckIn = { + _count: CheckInCountAggregateOutputType | null + _avg: CheckInAvgAggregateOutputType | null + _sum: CheckInSumAggregateOutputType | null + _min: CheckInMinAggregateOutputType | null + _max: CheckInMaxAggregateOutputType | null +} + +export type CheckInAvgAggregateOutputType = { + id: number | null + habitId: number | null + userId: number | null + seq: number | null +} + +export type CheckInSumAggregateOutputType = { + id: number | null + habitId: number | null + userId: number | null + seq: number | null +} + +export type CheckInMinAggregateOutputType = { + id: number | null + habitId: number | null + userId: number | null + date: string | null + seq: number | null + note: string | null + source: string | null + createdAt: Date | null +} + +export type CheckInMaxAggregateOutputType = { + id: number | null + habitId: number | null + userId: number | null + date: string | null + seq: number | null + note: string | null + source: string | null + createdAt: Date | null +} + +export type CheckInCountAggregateOutputType = { + id: number + habitId: number + userId: number + date: number + seq: number + note: number + source: number + createdAt: number + _all: number +} + + +export type CheckInAvgAggregateInputType = { + id?: true + habitId?: true + userId?: true + seq?: true +} + +export type CheckInSumAggregateInputType = { + id?: true + habitId?: true + userId?: true + seq?: true +} + +export type CheckInMinAggregateInputType = { + id?: true + habitId?: true + userId?: true + date?: true + seq?: true + note?: true + source?: true + createdAt?: true +} + +export type CheckInMaxAggregateInputType = { + id?: true + habitId?: true + userId?: true + date?: true + seq?: true + note?: true + source?: true + createdAt?: true +} + +export type CheckInCountAggregateInputType = { + id?: true + habitId?: true + userId?: true + date?: true + seq?: true + note?: true + source?: true + createdAt?: true + _all?: true +} + +export type CheckInAggregateArgs = { + /** + * Filter which CheckIn to aggregate. + */ + where?: Prisma.CheckInWhereInput + /** + * {@link https://www.prisma.io/docs/concepts/components/prisma-client/sorting Sorting Docs} + * + * Determine the order of CheckIns to fetch. + */ + orderBy?: Prisma.CheckInOrderByWithRelationInput | Prisma.CheckInOrderByWithRelationInput[] + /** + * {@link https://www.prisma.io/docs/concepts/components/prisma-client/pagination#cursor-based-pagination Cursor Docs} + * + * Sets the start position + */ + cursor?: Prisma.CheckInWhereUniqueInput + /** + * {@link https://www.prisma.io/docs/concepts/components/prisma-client/pagination Pagination Docs} + * + * Take `±n` CheckIns from the position of the cursor. + */ + take?: number + /** + * {@link https://www.prisma.io/docs/concepts/components/prisma-client/pagination Pagination Docs} + * + * Skip the first `n` CheckIns. + */ + skip?: number + /** + * {@link https://www.prisma.io/docs/concepts/components/prisma-client/aggregations Aggregation Docs} + * + * Count returned CheckIns + **/ + _count?: true | CheckInCountAggregateInputType + /** + * {@link https://www.prisma.io/docs/concepts/components/prisma-client/aggregations Aggregation Docs} + * + * Select which fields to average + **/ + _avg?: CheckInAvgAggregateInputType + /** + * {@link https://www.prisma.io/docs/concepts/components/prisma-client/aggregations Aggregation Docs} + * + * Select which fields to sum + **/ + _sum?: CheckInSumAggregateInputType + /** + * {@link https://www.prisma.io/docs/concepts/components/prisma-client/aggregations Aggregation Docs} + * + * Select which fields to find the minimum value + **/ + _min?: CheckInMinAggregateInputType + /** + * {@link https://www.prisma.io/docs/concepts/components/prisma-client/aggregations Aggregation Docs} + * + * Select which fields to find the maximum value + **/ + _max?: CheckInMaxAggregateInputType +} + +export type GetCheckInAggregateType = { + [P in keyof T & keyof AggregateCheckIn]: P extends '_count' | 'count' + ? T[P] extends true + ? number + : Prisma.GetScalarType + : Prisma.GetScalarType +} + + + + +export type CheckInGroupByArgs = { + where?: Prisma.CheckInWhereInput + orderBy?: Prisma.CheckInOrderByWithAggregationInput | Prisma.CheckInOrderByWithAggregationInput[] + by: Prisma.CheckInScalarFieldEnum[] | Prisma.CheckInScalarFieldEnum + having?: Prisma.CheckInScalarWhereWithAggregatesInput + take?: number + skip?: number + _count?: CheckInCountAggregateInputType | true + _avg?: CheckInAvgAggregateInputType + _sum?: CheckInSumAggregateInputType + _min?: CheckInMinAggregateInputType + _max?: CheckInMaxAggregateInputType +} + +export type CheckInGroupByOutputType = { + id: number + habitId: number + userId: number + date: string + seq: number + note: string + source: string + createdAt: Date + _count: CheckInCountAggregateOutputType | null + _avg: CheckInAvgAggregateOutputType | null + _sum: CheckInSumAggregateOutputType | null + _min: CheckInMinAggregateOutputType | null + _max: CheckInMaxAggregateOutputType | null +} + +export type GetCheckInGroupByPayload = Prisma.PrismaPromise< + Array< + Prisma.PickEnumerable & + { + [P in ((keyof T) & (keyof CheckInGroupByOutputType))]: P extends '_count' + ? T[P] extends boolean + ? number + : Prisma.GetScalarType + : Prisma.GetScalarType + } + > + > + + + +export type CheckInWhereInput = { + AND?: Prisma.CheckInWhereInput | Prisma.CheckInWhereInput[] + OR?: Prisma.CheckInWhereInput[] + NOT?: Prisma.CheckInWhereInput | Prisma.CheckInWhereInput[] + id?: Prisma.IntFilter<"CheckIn"> | number + habitId?: Prisma.IntFilter<"CheckIn"> | number + userId?: Prisma.IntFilter<"CheckIn"> | number + date?: Prisma.StringFilter<"CheckIn"> | string + seq?: Prisma.IntFilter<"CheckIn"> | number + note?: Prisma.StringFilter<"CheckIn"> | string + source?: Prisma.StringFilter<"CheckIn"> | string + createdAt?: Prisma.DateTimeFilter<"CheckIn"> | Date | string + habit?: Prisma.XOR + user?: Prisma.XOR +} + +export type CheckInOrderByWithRelationInput = { + id?: Prisma.SortOrder + habitId?: Prisma.SortOrder + userId?: Prisma.SortOrder + date?: Prisma.SortOrder + seq?: Prisma.SortOrder + note?: Prisma.SortOrder + source?: Prisma.SortOrder + createdAt?: Prisma.SortOrder + habit?: Prisma.HabitOrderByWithRelationInput + user?: Prisma.UserOrderByWithRelationInput + _relevance?: Prisma.CheckInOrderByRelevanceInput +} + +export type CheckInWhereUniqueInput = Prisma.AtLeast<{ + id?: number + habitId_date_seq?: Prisma.CheckInHabitIdDateSeqCompoundUniqueInput + AND?: Prisma.CheckInWhereInput | Prisma.CheckInWhereInput[] + OR?: Prisma.CheckInWhereInput[] + NOT?: Prisma.CheckInWhereInput | Prisma.CheckInWhereInput[] + habitId?: Prisma.IntFilter<"CheckIn"> | number + userId?: Prisma.IntFilter<"CheckIn"> | number + date?: Prisma.StringFilter<"CheckIn"> | string + seq?: Prisma.IntFilter<"CheckIn"> | number + note?: Prisma.StringFilter<"CheckIn"> | string + source?: Prisma.StringFilter<"CheckIn"> | string + createdAt?: Prisma.DateTimeFilter<"CheckIn"> | Date | string + habit?: Prisma.XOR + user?: Prisma.XOR +}, "id" | "habitId_date_seq"> + +export type CheckInOrderByWithAggregationInput = { + id?: Prisma.SortOrder + habitId?: Prisma.SortOrder + userId?: Prisma.SortOrder + date?: Prisma.SortOrder + seq?: Prisma.SortOrder + note?: Prisma.SortOrder + source?: Prisma.SortOrder + createdAt?: Prisma.SortOrder + _count?: Prisma.CheckInCountOrderByAggregateInput + _avg?: Prisma.CheckInAvgOrderByAggregateInput + _max?: Prisma.CheckInMaxOrderByAggregateInput + _min?: Prisma.CheckInMinOrderByAggregateInput + _sum?: Prisma.CheckInSumOrderByAggregateInput +} + +export type CheckInScalarWhereWithAggregatesInput = { + AND?: Prisma.CheckInScalarWhereWithAggregatesInput | Prisma.CheckInScalarWhereWithAggregatesInput[] + OR?: Prisma.CheckInScalarWhereWithAggregatesInput[] + NOT?: Prisma.CheckInScalarWhereWithAggregatesInput | Prisma.CheckInScalarWhereWithAggregatesInput[] + id?: Prisma.IntWithAggregatesFilter<"CheckIn"> | number + habitId?: Prisma.IntWithAggregatesFilter<"CheckIn"> | number + userId?: Prisma.IntWithAggregatesFilter<"CheckIn"> | number + date?: Prisma.StringWithAggregatesFilter<"CheckIn"> | string + seq?: Prisma.IntWithAggregatesFilter<"CheckIn"> | number + note?: Prisma.StringWithAggregatesFilter<"CheckIn"> | string + source?: Prisma.StringWithAggregatesFilter<"CheckIn"> | string + createdAt?: Prisma.DateTimeWithAggregatesFilter<"CheckIn"> | Date | string +} + +export type CheckInCreateInput = { + date: string + seq?: number + note?: string + source?: string + createdAt?: Date | string + habit: Prisma.HabitCreateNestedOneWithoutRecordsInput + user: Prisma.UserCreateNestedOneWithoutCheckInsInput +} + +export type CheckInUncheckedCreateInput = { + id?: number + habitId: number + userId: number + date: string + seq?: number + note?: string + source?: string + createdAt?: Date | string +} + +export type CheckInUpdateInput = { + date?: Prisma.StringFieldUpdateOperationsInput | string + seq?: Prisma.IntFieldUpdateOperationsInput | number + note?: Prisma.StringFieldUpdateOperationsInput | string + source?: Prisma.StringFieldUpdateOperationsInput | string + createdAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string + habit?: Prisma.HabitUpdateOneRequiredWithoutRecordsNestedInput + user?: Prisma.UserUpdateOneRequiredWithoutCheckInsNestedInput +} + +export type CheckInUncheckedUpdateInput = { + id?: Prisma.IntFieldUpdateOperationsInput | number + habitId?: Prisma.IntFieldUpdateOperationsInput | number + userId?: Prisma.IntFieldUpdateOperationsInput | number + date?: Prisma.StringFieldUpdateOperationsInput | string + seq?: Prisma.IntFieldUpdateOperationsInput | number + note?: Prisma.StringFieldUpdateOperationsInput | string + source?: Prisma.StringFieldUpdateOperationsInput | string + createdAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string +} + +export type CheckInCreateManyInput = { + id?: number + habitId: number + userId: number + date: string + seq?: number + note?: string + source?: string + createdAt?: Date | string +} + +export type CheckInUpdateManyMutationInput = { + date?: Prisma.StringFieldUpdateOperationsInput | string + seq?: Prisma.IntFieldUpdateOperationsInput | number + note?: Prisma.StringFieldUpdateOperationsInput | string + source?: Prisma.StringFieldUpdateOperationsInput | string + createdAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string +} + +export type CheckInUncheckedUpdateManyInput = { + id?: Prisma.IntFieldUpdateOperationsInput | number + habitId?: Prisma.IntFieldUpdateOperationsInput | number + userId?: Prisma.IntFieldUpdateOperationsInput | number + date?: Prisma.StringFieldUpdateOperationsInput | string + seq?: Prisma.IntFieldUpdateOperationsInput | number + note?: Prisma.StringFieldUpdateOperationsInput | string + source?: Prisma.StringFieldUpdateOperationsInput | string + createdAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string +} + +export type CheckInListRelationFilter = { + every?: Prisma.CheckInWhereInput + some?: Prisma.CheckInWhereInput + none?: Prisma.CheckInWhereInput +} + +export type CheckInOrderByRelationAggregateInput = { + _count?: Prisma.SortOrder +} + +export type CheckInOrderByRelevanceInput = { + fields: Prisma.CheckInOrderByRelevanceFieldEnum | Prisma.CheckInOrderByRelevanceFieldEnum[] + sort: Prisma.SortOrder + search: string +} + +export type CheckInHabitIdDateSeqCompoundUniqueInput = { + habitId: number + date: string + seq: number +} + +export type CheckInCountOrderByAggregateInput = { + id?: Prisma.SortOrder + habitId?: Prisma.SortOrder + userId?: Prisma.SortOrder + date?: Prisma.SortOrder + seq?: Prisma.SortOrder + note?: Prisma.SortOrder + source?: Prisma.SortOrder + createdAt?: Prisma.SortOrder +} + +export type CheckInAvgOrderByAggregateInput = { + id?: Prisma.SortOrder + habitId?: Prisma.SortOrder + userId?: Prisma.SortOrder + seq?: Prisma.SortOrder +} + +export type CheckInMaxOrderByAggregateInput = { + id?: Prisma.SortOrder + habitId?: Prisma.SortOrder + userId?: Prisma.SortOrder + date?: Prisma.SortOrder + seq?: Prisma.SortOrder + note?: Prisma.SortOrder + source?: Prisma.SortOrder + createdAt?: Prisma.SortOrder +} + +export type CheckInMinOrderByAggregateInput = { + id?: Prisma.SortOrder + habitId?: Prisma.SortOrder + userId?: Prisma.SortOrder + date?: Prisma.SortOrder + seq?: Prisma.SortOrder + note?: Prisma.SortOrder + source?: Prisma.SortOrder + createdAt?: Prisma.SortOrder +} + +export type CheckInSumOrderByAggregateInput = { + id?: Prisma.SortOrder + habitId?: Prisma.SortOrder + userId?: Prisma.SortOrder + seq?: Prisma.SortOrder +} + +export type CheckInCreateNestedManyWithoutUserInput = { + create?: Prisma.XOR | Prisma.CheckInCreateWithoutUserInput[] | Prisma.CheckInUncheckedCreateWithoutUserInput[] + connectOrCreate?: Prisma.CheckInCreateOrConnectWithoutUserInput | Prisma.CheckInCreateOrConnectWithoutUserInput[] + createMany?: Prisma.CheckInCreateManyUserInputEnvelope + connect?: Prisma.CheckInWhereUniqueInput | Prisma.CheckInWhereUniqueInput[] +} + +export type CheckInUncheckedCreateNestedManyWithoutUserInput = { + create?: Prisma.XOR | Prisma.CheckInCreateWithoutUserInput[] | Prisma.CheckInUncheckedCreateWithoutUserInput[] + connectOrCreate?: Prisma.CheckInCreateOrConnectWithoutUserInput | Prisma.CheckInCreateOrConnectWithoutUserInput[] + createMany?: Prisma.CheckInCreateManyUserInputEnvelope + connect?: Prisma.CheckInWhereUniqueInput | Prisma.CheckInWhereUniqueInput[] +} + +export type CheckInUpdateManyWithoutUserNestedInput = { + create?: Prisma.XOR | Prisma.CheckInCreateWithoutUserInput[] | Prisma.CheckInUncheckedCreateWithoutUserInput[] + connectOrCreate?: Prisma.CheckInCreateOrConnectWithoutUserInput | Prisma.CheckInCreateOrConnectWithoutUserInput[] + upsert?: Prisma.CheckInUpsertWithWhereUniqueWithoutUserInput | Prisma.CheckInUpsertWithWhereUniqueWithoutUserInput[] + createMany?: Prisma.CheckInCreateManyUserInputEnvelope + set?: Prisma.CheckInWhereUniqueInput | Prisma.CheckInWhereUniqueInput[] + disconnect?: Prisma.CheckInWhereUniqueInput | Prisma.CheckInWhereUniqueInput[] + delete?: Prisma.CheckInWhereUniqueInput | Prisma.CheckInWhereUniqueInput[] + connect?: Prisma.CheckInWhereUniqueInput | Prisma.CheckInWhereUniqueInput[] + update?: Prisma.CheckInUpdateWithWhereUniqueWithoutUserInput | Prisma.CheckInUpdateWithWhereUniqueWithoutUserInput[] + updateMany?: Prisma.CheckInUpdateManyWithWhereWithoutUserInput | Prisma.CheckInUpdateManyWithWhereWithoutUserInput[] + deleteMany?: Prisma.CheckInScalarWhereInput | Prisma.CheckInScalarWhereInput[] +} + +export type CheckInUncheckedUpdateManyWithoutUserNestedInput = { + create?: Prisma.XOR | Prisma.CheckInCreateWithoutUserInput[] | Prisma.CheckInUncheckedCreateWithoutUserInput[] + connectOrCreate?: Prisma.CheckInCreateOrConnectWithoutUserInput | Prisma.CheckInCreateOrConnectWithoutUserInput[] + upsert?: Prisma.CheckInUpsertWithWhereUniqueWithoutUserInput | Prisma.CheckInUpsertWithWhereUniqueWithoutUserInput[] + createMany?: Prisma.CheckInCreateManyUserInputEnvelope + set?: Prisma.CheckInWhereUniqueInput | Prisma.CheckInWhereUniqueInput[] + disconnect?: Prisma.CheckInWhereUniqueInput | Prisma.CheckInWhereUniqueInput[] + delete?: Prisma.CheckInWhereUniqueInput | Prisma.CheckInWhereUniqueInput[] + connect?: Prisma.CheckInWhereUniqueInput | Prisma.CheckInWhereUniqueInput[] + update?: Prisma.CheckInUpdateWithWhereUniqueWithoutUserInput | Prisma.CheckInUpdateWithWhereUniqueWithoutUserInput[] + updateMany?: Prisma.CheckInUpdateManyWithWhereWithoutUserInput | Prisma.CheckInUpdateManyWithWhereWithoutUserInput[] + deleteMany?: Prisma.CheckInScalarWhereInput | Prisma.CheckInScalarWhereInput[] +} + +export type CheckInCreateNestedManyWithoutHabitInput = { + create?: Prisma.XOR | Prisma.CheckInCreateWithoutHabitInput[] | Prisma.CheckInUncheckedCreateWithoutHabitInput[] + connectOrCreate?: Prisma.CheckInCreateOrConnectWithoutHabitInput | Prisma.CheckInCreateOrConnectWithoutHabitInput[] + createMany?: Prisma.CheckInCreateManyHabitInputEnvelope + connect?: Prisma.CheckInWhereUniqueInput | Prisma.CheckInWhereUniqueInput[] +} + +export type CheckInUncheckedCreateNestedManyWithoutHabitInput = { + create?: Prisma.XOR | Prisma.CheckInCreateWithoutHabitInput[] | Prisma.CheckInUncheckedCreateWithoutHabitInput[] + connectOrCreate?: Prisma.CheckInCreateOrConnectWithoutHabitInput | Prisma.CheckInCreateOrConnectWithoutHabitInput[] + createMany?: Prisma.CheckInCreateManyHabitInputEnvelope + connect?: Prisma.CheckInWhereUniqueInput | Prisma.CheckInWhereUniqueInput[] +} + +export type CheckInUpdateManyWithoutHabitNestedInput = { + create?: Prisma.XOR | Prisma.CheckInCreateWithoutHabitInput[] | Prisma.CheckInUncheckedCreateWithoutHabitInput[] + connectOrCreate?: Prisma.CheckInCreateOrConnectWithoutHabitInput | Prisma.CheckInCreateOrConnectWithoutHabitInput[] + upsert?: Prisma.CheckInUpsertWithWhereUniqueWithoutHabitInput | Prisma.CheckInUpsertWithWhereUniqueWithoutHabitInput[] + createMany?: Prisma.CheckInCreateManyHabitInputEnvelope + set?: Prisma.CheckInWhereUniqueInput | Prisma.CheckInWhereUniqueInput[] + disconnect?: Prisma.CheckInWhereUniqueInput | Prisma.CheckInWhereUniqueInput[] + delete?: Prisma.CheckInWhereUniqueInput | Prisma.CheckInWhereUniqueInput[] + connect?: Prisma.CheckInWhereUniqueInput | Prisma.CheckInWhereUniqueInput[] + update?: Prisma.CheckInUpdateWithWhereUniqueWithoutHabitInput | Prisma.CheckInUpdateWithWhereUniqueWithoutHabitInput[] + updateMany?: Prisma.CheckInUpdateManyWithWhereWithoutHabitInput | Prisma.CheckInUpdateManyWithWhereWithoutHabitInput[] + deleteMany?: Prisma.CheckInScalarWhereInput | Prisma.CheckInScalarWhereInput[] +} + +export type CheckInUncheckedUpdateManyWithoutHabitNestedInput = { + create?: Prisma.XOR | Prisma.CheckInCreateWithoutHabitInput[] | Prisma.CheckInUncheckedCreateWithoutHabitInput[] + connectOrCreate?: Prisma.CheckInCreateOrConnectWithoutHabitInput | Prisma.CheckInCreateOrConnectWithoutHabitInput[] + upsert?: Prisma.CheckInUpsertWithWhereUniqueWithoutHabitInput | Prisma.CheckInUpsertWithWhereUniqueWithoutHabitInput[] + createMany?: Prisma.CheckInCreateManyHabitInputEnvelope + set?: Prisma.CheckInWhereUniqueInput | Prisma.CheckInWhereUniqueInput[] + disconnect?: Prisma.CheckInWhereUniqueInput | Prisma.CheckInWhereUniqueInput[] + delete?: Prisma.CheckInWhereUniqueInput | Prisma.CheckInWhereUniqueInput[] + connect?: Prisma.CheckInWhereUniqueInput | Prisma.CheckInWhereUniqueInput[] + update?: Prisma.CheckInUpdateWithWhereUniqueWithoutHabitInput | Prisma.CheckInUpdateWithWhereUniqueWithoutHabitInput[] + updateMany?: Prisma.CheckInUpdateManyWithWhereWithoutHabitInput | Prisma.CheckInUpdateManyWithWhereWithoutHabitInput[] + deleteMany?: Prisma.CheckInScalarWhereInput | Prisma.CheckInScalarWhereInput[] +} + +export type CheckInCreateWithoutUserInput = { + date: string + seq?: number + note?: string + source?: string + createdAt?: Date | string + habit: Prisma.HabitCreateNestedOneWithoutRecordsInput +} + +export type CheckInUncheckedCreateWithoutUserInput = { + id?: number + habitId: number + date: string + seq?: number + note?: string + source?: string + createdAt?: Date | string +} + +export type CheckInCreateOrConnectWithoutUserInput = { + where: Prisma.CheckInWhereUniqueInput + create: Prisma.XOR +} + +export type CheckInCreateManyUserInputEnvelope = { + data: Prisma.CheckInCreateManyUserInput | Prisma.CheckInCreateManyUserInput[] + skipDuplicates?: boolean +} + +export type CheckInUpsertWithWhereUniqueWithoutUserInput = { + where: Prisma.CheckInWhereUniqueInput + update: Prisma.XOR + create: Prisma.XOR +} + +export type CheckInUpdateWithWhereUniqueWithoutUserInput = { + where: Prisma.CheckInWhereUniqueInput + data: Prisma.XOR +} + +export type CheckInUpdateManyWithWhereWithoutUserInput = { + where: Prisma.CheckInScalarWhereInput + data: Prisma.XOR +} + +export type CheckInScalarWhereInput = { + AND?: Prisma.CheckInScalarWhereInput | Prisma.CheckInScalarWhereInput[] + OR?: Prisma.CheckInScalarWhereInput[] + NOT?: Prisma.CheckInScalarWhereInput | Prisma.CheckInScalarWhereInput[] + id?: Prisma.IntFilter<"CheckIn"> | number + habitId?: Prisma.IntFilter<"CheckIn"> | number + userId?: Prisma.IntFilter<"CheckIn"> | number + date?: Prisma.StringFilter<"CheckIn"> | string + seq?: Prisma.IntFilter<"CheckIn"> | number + note?: Prisma.StringFilter<"CheckIn"> | string + source?: Prisma.StringFilter<"CheckIn"> | string + createdAt?: Prisma.DateTimeFilter<"CheckIn"> | Date | string +} + +export type CheckInCreateWithoutHabitInput = { + date: string + seq?: number + note?: string + source?: string + createdAt?: Date | string + user: Prisma.UserCreateNestedOneWithoutCheckInsInput +} + +export type CheckInUncheckedCreateWithoutHabitInput = { + id?: number + userId: number + date: string + seq?: number + note?: string + source?: string + createdAt?: Date | string +} + +export type CheckInCreateOrConnectWithoutHabitInput = { + where: Prisma.CheckInWhereUniqueInput + create: Prisma.XOR +} + +export type CheckInCreateManyHabitInputEnvelope = { + data: Prisma.CheckInCreateManyHabitInput | Prisma.CheckInCreateManyHabitInput[] + skipDuplicates?: boolean +} + +export type CheckInUpsertWithWhereUniqueWithoutHabitInput = { + where: Prisma.CheckInWhereUniqueInput + update: Prisma.XOR + create: Prisma.XOR +} + +export type CheckInUpdateWithWhereUniqueWithoutHabitInput = { + where: Prisma.CheckInWhereUniqueInput + data: Prisma.XOR +} + +export type CheckInUpdateManyWithWhereWithoutHabitInput = { + where: Prisma.CheckInScalarWhereInput + data: Prisma.XOR +} + +export type CheckInCreateManyUserInput = { + id?: number + habitId: number + date: string + seq?: number + note?: string + source?: string + createdAt?: Date | string +} + +export type CheckInUpdateWithoutUserInput = { + date?: Prisma.StringFieldUpdateOperationsInput | string + seq?: Prisma.IntFieldUpdateOperationsInput | number + note?: Prisma.StringFieldUpdateOperationsInput | string + source?: Prisma.StringFieldUpdateOperationsInput | string + createdAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string + habit?: Prisma.HabitUpdateOneRequiredWithoutRecordsNestedInput +} + +export type CheckInUncheckedUpdateWithoutUserInput = { + id?: Prisma.IntFieldUpdateOperationsInput | number + habitId?: Prisma.IntFieldUpdateOperationsInput | number + date?: Prisma.StringFieldUpdateOperationsInput | string + seq?: Prisma.IntFieldUpdateOperationsInput | number + note?: Prisma.StringFieldUpdateOperationsInput | string + source?: Prisma.StringFieldUpdateOperationsInput | string + createdAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string +} + +export type CheckInUncheckedUpdateManyWithoutUserInput = { + id?: Prisma.IntFieldUpdateOperationsInput | number + habitId?: Prisma.IntFieldUpdateOperationsInput | number + date?: Prisma.StringFieldUpdateOperationsInput | string + seq?: Prisma.IntFieldUpdateOperationsInput | number + note?: Prisma.StringFieldUpdateOperationsInput | string + source?: Prisma.StringFieldUpdateOperationsInput | string + createdAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string +} + +export type CheckInCreateManyHabitInput = { + id?: number + userId: number + date: string + seq?: number + note?: string + source?: string + createdAt?: Date | string +} + +export type CheckInUpdateWithoutHabitInput = { + date?: Prisma.StringFieldUpdateOperationsInput | string + seq?: Prisma.IntFieldUpdateOperationsInput | number + note?: Prisma.StringFieldUpdateOperationsInput | string + source?: Prisma.StringFieldUpdateOperationsInput | string + createdAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string + user?: Prisma.UserUpdateOneRequiredWithoutCheckInsNestedInput +} + +export type CheckInUncheckedUpdateWithoutHabitInput = { + id?: Prisma.IntFieldUpdateOperationsInput | number + userId?: Prisma.IntFieldUpdateOperationsInput | number + date?: Prisma.StringFieldUpdateOperationsInput | string + seq?: Prisma.IntFieldUpdateOperationsInput | number + note?: Prisma.StringFieldUpdateOperationsInput | string + source?: Prisma.StringFieldUpdateOperationsInput | string + createdAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string +} + +export type CheckInUncheckedUpdateManyWithoutHabitInput = { + id?: Prisma.IntFieldUpdateOperationsInput | number + userId?: Prisma.IntFieldUpdateOperationsInput | number + date?: Prisma.StringFieldUpdateOperationsInput | string + seq?: Prisma.IntFieldUpdateOperationsInput | number + note?: Prisma.StringFieldUpdateOperationsInput | string + source?: Prisma.StringFieldUpdateOperationsInput | string + createdAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string +} + + + +export type CheckInSelect = runtime.Types.Extensions.GetSelect<{ + id?: boolean + habitId?: boolean + userId?: boolean + date?: boolean + seq?: boolean + note?: boolean + source?: boolean + createdAt?: boolean + habit?: boolean | Prisma.HabitDefaultArgs + user?: boolean | Prisma.UserDefaultArgs +}, ExtArgs["result"]["checkIn"]> + + + +export type CheckInSelectScalar = { + id?: boolean + habitId?: boolean + userId?: boolean + date?: boolean + seq?: boolean + note?: boolean + source?: boolean + createdAt?: boolean +} + +export type CheckInOmit = runtime.Types.Extensions.GetOmit<"id" | "habitId" | "userId" | "date" | "seq" | "note" | "source" | "createdAt", ExtArgs["result"]["checkIn"]> +export type CheckInInclude = { + habit?: boolean | Prisma.HabitDefaultArgs + user?: boolean | Prisma.UserDefaultArgs +} + +export type $CheckInPayload = { + name: "CheckIn" + objects: { + habit: Prisma.$HabitPayload + user: Prisma.$UserPayload + } + scalars: runtime.Types.Extensions.GetPayloadResult<{ + id: number + habitId: number + userId: number + date: string + seq: number + note: string + source: string + createdAt: Date + }, ExtArgs["result"]["checkIn"]> + composites: {} +} + +export type CheckInGetPayload = runtime.Types.Result.GetResult + +export type CheckInCountArgs = + Omit & { + select?: CheckInCountAggregateInputType | true + } + +export interface CheckInDelegate { + [K: symbol]: { types: Prisma.TypeMap['model']['CheckIn'], meta: { name: 'CheckIn' } } + /** + * Find zero or one CheckIn that matches the filter. + * @param {CheckInFindUniqueArgs} args - Arguments to find a CheckIn + * @example + * // Get one CheckIn + * const checkIn = await prisma.checkIn.findUnique({ + * where: { + * // ... provide filter here + * } + * }) + */ + findUnique(args: Prisma.SelectSubset>): Prisma.Prisma__CheckInClient, T, "findUnique", GlobalOmitOptions> | null, null, ExtArgs, GlobalOmitOptions> + + /** + * Find one CheckIn that matches the filter or throw an error with `error.code='P2025'` + * if no matches were found. + * @param {CheckInFindUniqueOrThrowArgs} args - Arguments to find a CheckIn + * @example + * // Get one CheckIn + * const checkIn = await prisma.checkIn.findUniqueOrThrow({ + * where: { + * // ... provide filter here + * } + * }) + */ + findUniqueOrThrow(args: Prisma.SelectSubset>): Prisma.Prisma__CheckInClient, T, "findUniqueOrThrow", GlobalOmitOptions>, never, ExtArgs, GlobalOmitOptions> + + /** + * Find the first CheckIn that matches the filter. + * Note, that providing `undefined` is treated as the value not being there. + * Read more here: https://pris.ly/d/null-undefined + * @param {CheckInFindFirstArgs} args - Arguments to find a CheckIn + * @example + * // Get one CheckIn + * const checkIn = await prisma.checkIn.findFirst({ + * where: { + * // ... provide filter here + * } + * }) + */ + findFirst(args?: Prisma.SelectSubset>): Prisma.Prisma__CheckInClient, T, "findFirst", GlobalOmitOptions> | null, null, ExtArgs, GlobalOmitOptions> + + /** + * Find the first CheckIn that matches the filter or + * throw `PrismaKnownClientError` with `P2025` code if no matches were found. + * Note, that providing `undefined` is treated as the value not being there. + * Read more here: https://pris.ly/d/null-undefined + * @param {CheckInFindFirstOrThrowArgs} args - Arguments to find a CheckIn + * @example + * // Get one CheckIn + * const checkIn = await prisma.checkIn.findFirstOrThrow({ + * where: { + * // ... provide filter here + * } + * }) + */ + findFirstOrThrow(args?: Prisma.SelectSubset>): Prisma.Prisma__CheckInClient, T, "findFirstOrThrow", GlobalOmitOptions>, never, ExtArgs, GlobalOmitOptions> + + /** + * Find zero or more CheckIns that matches the filter. + * Note, that providing `undefined` is treated as the value not being there. + * Read more here: https://pris.ly/d/null-undefined + * @param {CheckInFindManyArgs} args - Arguments to filter and select certain fields only. + * @example + * // Get all CheckIns + * const checkIns = await prisma.checkIn.findMany() + * + * // Get first 10 CheckIns + * const checkIns = await prisma.checkIn.findMany({ take: 10 }) + * + * // Only select the `id` + * const checkInWithIdOnly = await prisma.checkIn.findMany({ select: { id: true } }) + * + */ + findMany(args?: Prisma.SelectSubset>): Prisma.PrismaPromise, T, "findMany", GlobalOmitOptions>> + + /** + * Create a CheckIn. + * @param {CheckInCreateArgs} args - Arguments to create a CheckIn. + * @example + * // Create one CheckIn + * const CheckIn = await prisma.checkIn.create({ + * data: { + * // ... data to create a CheckIn + * } + * }) + * + */ + create(args: Prisma.SelectSubset>): Prisma.Prisma__CheckInClient, T, "create", GlobalOmitOptions>, never, ExtArgs, GlobalOmitOptions> + + /** + * Create many CheckIns. + * @param {CheckInCreateManyArgs} args - Arguments to create many CheckIns. + * @example + * // Create many CheckIns + * const checkIn = await prisma.checkIn.createMany({ + * data: [ + * // ... provide data here + * ] + * }) + * + */ + createMany(args?: Prisma.SelectSubset>): Prisma.PrismaPromise + + /** + * Delete a CheckIn. + * @param {CheckInDeleteArgs} args - Arguments to delete one CheckIn. + * @example + * // Delete one CheckIn + * const CheckIn = await prisma.checkIn.delete({ + * where: { + * // ... filter to delete one CheckIn + * } + * }) + * + */ + delete(args: Prisma.SelectSubset>): Prisma.Prisma__CheckInClient, T, "delete", GlobalOmitOptions>, never, ExtArgs, GlobalOmitOptions> + + /** + * Update one CheckIn. + * @param {CheckInUpdateArgs} args - Arguments to update one CheckIn. + * @example + * // Update one CheckIn + * const checkIn = await prisma.checkIn.update({ + * where: { + * // ... provide filter here + * }, + * data: { + * // ... provide data here + * } + * }) + * + */ + update(args: Prisma.SelectSubset>): Prisma.Prisma__CheckInClient, T, "update", GlobalOmitOptions>, never, ExtArgs, GlobalOmitOptions> + + /** + * Delete zero or more CheckIns. + * @param {CheckInDeleteManyArgs} args - Arguments to filter CheckIns to delete. + * @example + * // Delete a few CheckIns + * const { count } = await prisma.checkIn.deleteMany({ + * where: { + * // ... provide filter here + * } + * }) + * + */ + deleteMany(args?: Prisma.SelectSubset>): Prisma.PrismaPromise + + /** + * Update zero or more CheckIns. + * Note, that providing `undefined` is treated as the value not being there. + * Read more here: https://pris.ly/d/null-undefined + * @param {CheckInUpdateManyArgs} args - Arguments to update one or more rows. + * @example + * // Update many CheckIns + * const checkIn = await prisma.checkIn.updateMany({ + * where: { + * // ... provide filter here + * }, + * data: { + * // ... provide data here + * } + * }) + * + */ + updateMany(args: Prisma.SelectSubset>): Prisma.PrismaPromise + + /** + * Create or update one CheckIn. + * @param {CheckInUpsertArgs} args - Arguments to update or create a CheckIn. + * @example + * // Update or create a CheckIn + * const checkIn = await prisma.checkIn.upsert({ + * create: { + * // ... data to create a CheckIn + * }, + * update: { + * // ... in case it already exists, update + * }, + * where: { + * // ... the filter for the CheckIn we want to update + * } + * }) + */ + upsert(args: Prisma.SelectSubset>): Prisma.Prisma__CheckInClient, T, "upsert", GlobalOmitOptions>, never, ExtArgs, GlobalOmitOptions> + + + /** + * Count the number of CheckIns. + * Note, that providing `undefined` is treated as the value not being there. + * Read more here: https://pris.ly/d/null-undefined + * @param {CheckInCountArgs} args - Arguments to filter CheckIns to count. + * @example + * // Count the number of CheckIns + * const count = await prisma.checkIn.count({ + * where: { + * // ... the filter for the CheckIns we want to count + * } + * }) + **/ + count( + args?: Prisma.Subset, + ): Prisma.PrismaPromise< + T extends runtime.Types.Utils.Record<'select', any> + ? T['select'] extends true + ? number + : Prisma.GetScalarType + : number + > + + /** + * Allows you to perform aggregations operations on a CheckIn. + * Note, that providing `undefined` is treated as the value not being there. + * Read more here: https://pris.ly/d/null-undefined + * @param {CheckInAggregateArgs} args - Select which aggregations you would like to apply and on what fields. + * @example + * // Ordered by age ascending + * // Where email contains prisma.io + * // Limited to the 10 users + * const aggregations = await prisma.user.aggregate({ + * _avg: { + * age: true, + * }, + * where: { + * email: { + * contains: "prisma.io", + * }, + * }, + * orderBy: { + * age: "asc", + * }, + * take: 10, + * }) + **/ + aggregate(args: Prisma.Subset): Prisma.PrismaPromise> + + /** + * Group by CheckIn. + * Note, that providing `undefined` is treated as the value not being there. + * Read more here: https://pris.ly/d/null-undefined + * @param {CheckInGroupByArgs} args - Group by arguments. + * @example + * // Group by city, order by createdAt, get count + * const result = await prisma.user.groupBy({ + * by: ['city', 'createdAt'], + * orderBy: { + * createdAt: true + * }, + * _count: { + * _all: true + * }, + * }) + * + **/ + groupBy< + T extends CheckInGroupByArgs, + HasSelectOrTake extends Prisma.Or< + Prisma.Extends<'skip', Prisma.Keys>, + Prisma.Extends<'take', Prisma.Keys> + >, + OrderByArg extends Prisma.True extends HasSelectOrTake + ? { orderBy: CheckInGroupByArgs['orderBy'] } + : { orderBy?: CheckInGroupByArgs['orderBy'] }, + OrderFields extends Prisma.ExcludeUnderscoreKeys>>, + ByFields extends Prisma.MaybeTupleToUnion, + ByValid extends Prisma.Has, + HavingFields extends Prisma.GetHavingFields, + HavingValid extends Prisma.Has, + ByEmpty extends T['by'] extends never[] ? Prisma.True : Prisma.False, + InputErrors extends ByEmpty extends Prisma.True + ? `Error: "by" must not be empty.` + : HavingValid extends Prisma.False + ? { + [P in HavingFields]: P extends ByFields + ? never + : P extends string + ? `Error: Field "${P}" used in "having" needs to be provided in "by".` + : [ + Error, + 'Field ', + P, + ` in "having" needs to be provided in "by"`, + ] + }[HavingFields] + : 'take' extends Prisma.Keys + ? 'orderBy' extends Prisma.Keys + ? ByValid extends Prisma.True + ? {} + : { + [P in OrderFields]: P extends ByFields + ? never + : `Error: Field "${P}" in "orderBy" needs to be provided in "by"` + }[OrderFields] + : 'Error: If you provide "take", you also need to provide "orderBy"' + : 'skip' extends Prisma.Keys + ? 'orderBy' extends Prisma.Keys + ? ByValid extends Prisma.True + ? {} + : { + [P in OrderFields]: P extends ByFields + ? never + : `Error: Field "${P}" in "orderBy" needs to be provided in "by"` + }[OrderFields] + : 'Error: If you provide "skip", you also need to provide "orderBy"' + : ByValid extends Prisma.True + ? {} + : { + [P in OrderFields]: P extends ByFields + ? never + : `Error: Field "${P}" in "orderBy" needs to be provided in "by"` + }[OrderFields] + >(args: Prisma.SubsetIntersection & InputErrors): {} extends InputErrors ? GetCheckInGroupByPayload : Prisma.PrismaPromise +/** + * Fields of the CheckIn model + */ +readonly fields: CheckInFieldRefs; +} + +/** + * The delegate class that acts as a "Promise-like" for CheckIn. + * Why is this prefixed with `Prisma__`? + * Because we want to prevent naming conflicts as mentioned in + * https://github.com/prisma/prisma-client-js/issues/707 + */ +export interface Prisma__CheckInClient extends Prisma.PrismaPromise { + readonly [Symbol.toStringTag]: "PrismaPromise" + habit = {}>(args?: Prisma.Subset>): Prisma.Prisma__HabitClient, T, "findUniqueOrThrow", GlobalOmitOptions> | Null, Null, ExtArgs, GlobalOmitOptions> + user = {}>(args?: Prisma.Subset>): Prisma.Prisma__UserClient, T, "findUniqueOrThrow", GlobalOmitOptions> | Null, Null, ExtArgs, GlobalOmitOptions> + /** + * Attaches callbacks for the resolution and/or rejection of the Promise. + * @param onfulfilled The callback to execute when the Promise is resolved. + * @param onrejected The callback to execute when the Promise is rejected. + * @returns A Promise for the completion of which ever callback is executed. + */ + then(onfulfilled?: ((value: T) => TResult1 | PromiseLike) | undefined | null, onrejected?: ((reason: any) => TResult2 | PromiseLike) | undefined | null): runtime.Types.Utils.JsPromise + /** + * Attaches a callback for only the rejection of the Promise. + * @param onrejected The callback to execute when the Promise is rejected. + * @returns A Promise for the completion of the callback. + */ + catch(onrejected?: ((reason: any) => TResult | PromiseLike) | undefined | null): runtime.Types.Utils.JsPromise + /** + * Attaches a callback that is invoked when the Promise is settled (fulfilled or rejected). The + * resolved value cannot be modified from the callback. + * @param onfinally The callback to execute when the Promise is settled (fulfilled or rejected). + * @returns A Promise for the completion of the callback. + */ + finally(onfinally?: (() => void) | undefined | null): runtime.Types.Utils.JsPromise +} + + + + +/** + * Fields of the CheckIn model + */ +export interface CheckInFieldRefs { + readonly id: Prisma.FieldRef<"CheckIn", 'Int'> + readonly habitId: Prisma.FieldRef<"CheckIn", 'Int'> + readonly userId: Prisma.FieldRef<"CheckIn", 'Int'> + readonly date: Prisma.FieldRef<"CheckIn", 'String'> + readonly seq: Prisma.FieldRef<"CheckIn", 'Int'> + readonly note: Prisma.FieldRef<"CheckIn", 'String'> + readonly source: Prisma.FieldRef<"CheckIn", 'String'> + readonly createdAt: Prisma.FieldRef<"CheckIn", 'DateTime'> +} + + +// Custom InputTypes +/** + * CheckIn findUnique + */ +export type CheckInFindUniqueArgs = { + /** + * Select specific fields to fetch from the CheckIn + */ + select?: Prisma.CheckInSelect | null + /** + * Omit specific fields from the CheckIn + */ + omit?: Prisma.CheckInOmit | null + /** + * Choose, which related nodes to fetch as well + */ + include?: Prisma.CheckInInclude | null + /** + * Filter, which CheckIn to fetch. + */ + where: Prisma.CheckInWhereUniqueInput +} + +/** + * CheckIn findUniqueOrThrow + */ +export type CheckInFindUniqueOrThrowArgs = { + /** + * Select specific fields to fetch from the CheckIn + */ + select?: Prisma.CheckInSelect | null + /** + * Omit specific fields from the CheckIn + */ + omit?: Prisma.CheckInOmit | null + /** + * Choose, which related nodes to fetch as well + */ + include?: Prisma.CheckInInclude | null + /** + * Filter, which CheckIn to fetch. + */ + where: Prisma.CheckInWhereUniqueInput +} + +/** + * CheckIn findFirst + */ +export type CheckInFindFirstArgs = { + /** + * Select specific fields to fetch from the CheckIn + */ + select?: Prisma.CheckInSelect | null + /** + * Omit specific fields from the CheckIn + */ + omit?: Prisma.CheckInOmit | null + /** + * Choose, which related nodes to fetch as well + */ + include?: Prisma.CheckInInclude | null + /** + * Filter, which CheckIn to fetch. + */ + where?: Prisma.CheckInWhereInput + /** + * {@link https://www.prisma.io/docs/concepts/components/prisma-client/sorting Sorting Docs} + * + * Determine the order of CheckIns to fetch. + */ + orderBy?: Prisma.CheckInOrderByWithRelationInput | Prisma.CheckInOrderByWithRelationInput[] + /** + * {@link https://www.prisma.io/docs/concepts/components/prisma-client/pagination#cursor-based-pagination Cursor Docs} + * + * Sets the position for searching for CheckIns. + */ + cursor?: Prisma.CheckInWhereUniqueInput + /** + * {@link https://www.prisma.io/docs/concepts/components/prisma-client/pagination Pagination Docs} + * + * Take `±n` CheckIns from the position of the cursor. + */ + take?: number + /** + * {@link https://www.prisma.io/docs/concepts/components/prisma-client/pagination Pagination Docs} + * + * Skip the first `n` CheckIns. + */ + skip?: number + /** + * {@link https://www.prisma.io/docs/concepts/components/prisma-client/distinct Distinct Docs} + * + * Filter by unique combinations of CheckIns. + */ + distinct?: Prisma.CheckInScalarFieldEnum | Prisma.CheckInScalarFieldEnum[] +} + +/** + * CheckIn findFirstOrThrow + */ +export type CheckInFindFirstOrThrowArgs = { + /** + * Select specific fields to fetch from the CheckIn + */ + select?: Prisma.CheckInSelect | null + /** + * Omit specific fields from the CheckIn + */ + omit?: Prisma.CheckInOmit | null + /** + * Choose, which related nodes to fetch as well + */ + include?: Prisma.CheckInInclude | null + /** + * Filter, which CheckIn to fetch. + */ + where?: Prisma.CheckInWhereInput + /** + * {@link https://www.prisma.io/docs/concepts/components/prisma-client/sorting Sorting Docs} + * + * Determine the order of CheckIns to fetch. + */ + orderBy?: Prisma.CheckInOrderByWithRelationInput | Prisma.CheckInOrderByWithRelationInput[] + /** + * {@link https://www.prisma.io/docs/concepts/components/prisma-client/pagination#cursor-based-pagination Cursor Docs} + * + * Sets the position for searching for CheckIns. + */ + cursor?: Prisma.CheckInWhereUniqueInput + /** + * {@link https://www.prisma.io/docs/concepts/components/prisma-client/pagination Pagination Docs} + * + * Take `±n` CheckIns from the position of the cursor. + */ + take?: number + /** + * {@link https://www.prisma.io/docs/concepts/components/prisma-client/pagination Pagination Docs} + * + * Skip the first `n` CheckIns. + */ + skip?: number + /** + * {@link https://www.prisma.io/docs/concepts/components/prisma-client/distinct Distinct Docs} + * + * Filter by unique combinations of CheckIns. + */ + distinct?: Prisma.CheckInScalarFieldEnum | Prisma.CheckInScalarFieldEnum[] +} + +/** + * CheckIn findMany + */ +export type CheckInFindManyArgs = { + /** + * Select specific fields to fetch from the CheckIn + */ + select?: Prisma.CheckInSelect | null + /** + * Omit specific fields from the CheckIn + */ + omit?: Prisma.CheckInOmit | null + /** + * Choose, which related nodes to fetch as well + */ + include?: Prisma.CheckInInclude | null + /** + * Filter, which CheckIns to fetch. + */ + where?: Prisma.CheckInWhereInput + /** + * {@link https://www.prisma.io/docs/concepts/components/prisma-client/sorting Sorting Docs} + * + * Determine the order of CheckIns to fetch. + */ + orderBy?: Prisma.CheckInOrderByWithRelationInput | Prisma.CheckInOrderByWithRelationInput[] + /** + * {@link https://www.prisma.io/docs/concepts/components/prisma-client/pagination#cursor-based-pagination Cursor Docs} + * + * Sets the position for listing CheckIns. + */ + cursor?: Prisma.CheckInWhereUniqueInput + /** + * {@link https://www.prisma.io/docs/concepts/components/prisma-client/pagination Pagination Docs} + * + * Take `±n` CheckIns from the position of the cursor. + */ + take?: number + /** + * {@link https://www.prisma.io/docs/concepts/components/prisma-client/pagination Pagination Docs} + * + * Skip the first `n` CheckIns. + */ + skip?: number + /** + * {@link https://www.prisma.io/docs/concepts/components/prisma-client/distinct Distinct Docs} + * + * Filter by unique combinations of CheckIns. + */ + distinct?: Prisma.CheckInScalarFieldEnum | Prisma.CheckInScalarFieldEnum[] +} + +/** + * CheckIn create + */ +export type CheckInCreateArgs = { + /** + * Select specific fields to fetch from the CheckIn + */ + select?: Prisma.CheckInSelect | null + /** + * Omit specific fields from the CheckIn + */ + omit?: Prisma.CheckInOmit | null + /** + * Choose, which related nodes to fetch as well + */ + include?: Prisma.CheckInInclude | null + /** + * The data needed to create a CheckIn. + */ + data: Prisma.XOR +} + +/** + * CheckIn createMany + */ +export type CheckInCreateManyArgs = { + /** + * The data used to create many CheckIns. + */ + data: Prisma.CheckInCreateManyInput | Prisma.CheckInCreateManyInput[] + skipDuplicates?: boolean +} + +/** + * CheckIn update + */ +export type CheckInUpdateArgs = { + /** + * Select specific fields to fetch from the CheckIn + */ + select?: Prisma.CheckInSelect | null + /** + * Omit specific fields from the CheckIn + */ + omit?: Prisma.CheckInOmit | null + /** + * Choose, which related nodes to fetch as well + */ + include?: Prisma.CheckInInclude | null + /** + * The data needed to update a CheckIn. + */ + data: Prisma.XOR + /** + * Choose, which CheckIn to update. + */ + where: Prisma.CheckInWhereUniqueInput +} + +/** + * CheckIn updateMany + */ +export type CheckInUpdateManyArgs = { + /** + * The data used to update CheckIns. + */ + data: Prisma.XOR + /** + * Filter which CheckIns to update + */ + where?: Prisma.CheckInWhereInput + /** + * Limit how many CheckIns to update. + */ + limit?: number +} + +/** + * CheckIn upsert + */ +export type CheckInUpsertArgs = { + /** + * Select specific fields to fetch from the CheckIn + */ + select?: Prisma.CheckInSelect | null + /** + * Omit specific fields from the CheckIn + */ + omit?: Prisma.CheckInOmit | null + /** + * Choose, which related nodes to fetch as well + */ + include?: Prisma.CheckInInclude | null + /** + * The filter to search for the CheckIn to update in case it exists. + */ + where: Prisma.CheckInWhereUniqueInput + /** + * In case the CheckIn found by the `where` argument doesn't exist, create a new CheckIn with this data. + */ + create: Prisma.XOR + /** + * In case the CheckIn was found with the provided `where` argument, update it with this data. + */ + update: Prisma.XOR +} + +/** + * CheckIn delete + */ +export type CheckInDeleteArgs = { + /** + * Select specific fields to fetch from the CheckIn + */ + select?: Prisma.CheckInSelect | null + /** + * Omit specific fields from the CheckIn + */ + omit?: Prisma.CheckInOmit | null + /** + * Choose, which related nodes to fetch as well + */ + include?: Prisma.CheckInInclude | null + /** + * Filter which CheckIn to delete. + */ + where: Prisma.CheckInWhereUniqueInput +} + +/** + * CheckIn deleteMany + */ +export type CheckInDeleteManyArgs = { + /** + * Filter which CheckIns to delete + */ + where?: Prisma.CheckInWhereInput + /** + * Limit how many CheckIns to delete. + */ + limit?: number +} + +/** + * CheckIn without action + */ +export type CheckInDefaultArgs = { + /** + * Select specific fields to fetch from the CheckIn + */ + select?: Prisma.CheckInSelect | null + /** + * Omit specific fields from the CheckIn + */ + omit?: Prisma.CheckInOmit | null + /** + * Choose, which related nodes to fetch as well + */ + include?: Prisma.CheckInInclude | null +} diff --git a/generated/prisma/models/CheckList.ts b/generated/prisma/models/CheckList.ts new file mode 100644 index 0000000..551ee73 --- /dev/null +++ b/generated/prisma/models/CheckList.ts @@ -0,0 +1,1514 @@ + +/* !!! This is code generated by Prisma. Do not edit directly. !!! */ +/* eslint-disable */ +// biome-ignore-all lint: generated file +// @ts-nocheck +/* + * This file exports the `CheckList` model and its related types. + * + * 🟢 You can import this file directly. + */ +import type * as runtime from "@prisma/client/runtime/client" +import type * as $Enums from "../enums.ts" +import type * as Prisma from "../internal/prismaNamespace.ts" + +/** + * Model CheckList + * + */ +export type CheckListModel = runtime.Types.Result.DefaultSelection + +export type AggregateCheckList = { + _count: CheckListCountAggregateOutputType | null + _avg: CheckListAvgAggregateOutputType | null + _sum: CheckListSumAggregateOutputType | null + _min: CheckListMinAggregateOutputType | null + _max: CheckListMaxAggregateOutputType | null +} + +export type CheckListAvgAggregateOutputType = { + id: number | null + userId: number | null +} + +export type CheckListSumAggregateOutputType = { + id: number | null + userId: number | null +} + +export type CheckListMinAggregateOutputType = { + id: number | null + userId: number | null + title: string | null + scene: string | null + note: string | null + archived: boolean | null + createdAt: Date | null + updatedAt: Date | null +} + +export type CheckListMaxAggregateOutputType = { + id: number | null + userId: number | null + title: string | null + scene: string | null + note: string | null + archived: boolean | null + createdAt: Date | null + updatedAt: Date | null +} + +export type CheckListCountAggregateOutputType = { + id: number + userId: number + title: number + scene: number + note: number + archived: number + createdAt: number + updatedAt: number + _all: number +} + + +export type CheckListAvgAggregateInputType = { + id?: true + userId?: true +} + +export type CheckListSumAggregateInputType = { + id?: true + userId?: true +} + +export type CheckListMinAggregateInputType = { + id?: true + userId?: true + title?: true + scene?: true + note?: true + archived?: true + createdAt?: true + updatedAt?: true +} + +export type CheckListMaxAggregateInputType = { + id?: true + userId?: true + title?: true + scene?: true + note?: true + archived?: true + createdAt?: true + updatedAt?: true +} + +export type CheckListCountAggregateInputType = { + id?: true + userId?: true + title?: true + scene?: true + note?: true + archived?: true + createdAt?: true + updatedAt?: true + _all?: true +} + +export type CheckListAggregateArgs = { + /** + * Filter which CheckList to aggregate. + */ + where?: Prisma.CheckListWhereInput + /** + * {@link https://www.prisma.io/docs/concepts/components/prisma-client/sorting Sorting Docs} + * + * Determine the order of CheckLists to fetch. + */ + orderBy?: Prisma.CheckListOrderByWithRelationInput | Prisma.CheckListOrderByWithRelationInput[] + /** + * {@link https://www.prisma.io/docs/concepts/components/prisma-client/pagination#cursor-based-pagination Cursor Docs} + * + * Sets the start position + */ + cursor?: Prisma.CheckListWhereUniqueInput + /** + * {@link https://www.prisma.io/docs/concepts/components/prisma-client/pagination Pagination Docs} + * + * Take `±n` CheckLists from the position of the cursor. + */ + take?: number + /** + * {@link https://www.prisma.io/docs/concepts/components/prisma-client/pagination Pagination Docs} + * + * Skip the first `n` CheckLists. + */ + skip?: number + /** + * {@link https://www.prisma.io/docs/concepts/components/prisma-client/aggregations Aggregation Docs} + * + * Count returned CheckLists + **/ + _count?: true | CheckListCountAggregateInputType + /** + * {@link https://www.prisma.io/docs/concepts/components/prisma-client/aggregations Aggregation Docs} + * + * Select which fields to average + **/ + _avg?: CheckListAvgAggregateInputType + /** + * {@link https://www.prisma.io/docs/concepts/components/prisma-client/aggregations Aggregation Docs} + * + * Select which fields to sum + **/ + _sum?: CheckListSumAggregateInputType + /** + * {@link https://www.prisma.io/docs/concepts/components/prisma-client/aggregations Aggregation Docs} + * + * Select which fields to find the minimum value + **/ + _min?: CheckListMinAggregateInputType + /** + * {@link https://www.prisma.io/docs/concepts/components/prisma-client/aggregations Aggregation Docs} + * + * Select which fields to find the maximum value + **/ + _max?: CheckListMaxAggregateInputType +} + +export type GetCheckListAggregateType = { + [P in keyof T & keyof AggregateCheckList]: P extends '_count' | 'count' + ? T[P] extends true + ? number + : Prisma.GetScalarType + : Prisma.GetScalarType +} + + + + +export type CheckListGroupByArgs = { + where?: Prisma.CheckListWhereInput + orderBy?: Prisma.CheckListOrderByWithAggregationInput | Prisma.CheckListOrderByWithAggregationInput[] + by: Prisma.CheckListScalarFieldEnum[] | Prisma.CheckListScalarFieldEnum + having?: Prisma.CheckListScalarWhereWithAggregatesInput + take?: number + skip?: number + _count?: CheckListCountAggregateInputType | true + _avg?: CheckListAvgAggregateInputType + _sum?: CheckListSumAggregateInputType + _min?: CheckListMinAggregateInputType + _max?: CheckListMaxAggregateInputType +} + +export type CheckListGroupByOutputType = { + id: number + userId: number + title: string + scene: string + note: string + archived: boolean + createdAt: Date + updatedAt: Date + _count: CheckListCountAggregateOutputType | null + _avg: CheckListAvgAggregateOutputType | null + _sum: CheckListSumAggregateOutputType | null + _min: CheckListMinAggregateOutputType | null + _max: CheckListMaxAggregateOutputType | null +} + +export type GetCheckListGroupByPayload = Prisma.PrismaPromise< + Array< + Prisma.PickEnumerable & + { + [P in ((keyof T) & (keyof CheckListGroupByOutputType))]: P extends '_count' + ? T[P] extends boolean + ? number + : Prisma.GetScalarType + : Prisma.GetScalarType + } + > + > + + + +export type CheckListWhereInput = { + AND?: Prisma.CheckListWhereInput | Prisma.CheckListWhereInput[] + OR?: Prisma.CheckListWhereInput[] + NOT?: Prisma.CheckListWhereInput | Prisma.CheckListWhereInput[] + id?: Prisma.IntFilter<"CheckList"> | number + userId?: Prisma.IntFilter<"CheckList"> | number + title?: Prisma.StringFilter<"CheckList"> | string + scene?: Prisma.StringFilter<"CheckList"> | string + note?: Prisma.StringFilter<"CheckList"> | string + archived?: Prisma.BoolFilter<"CheckList"> | boolean + createdAt?: Prisma.DateTimeFilter<"CheckList"> | Date | string + updatedAt?: Prisma.DateTimeFilter<"CheckList"> | Date | string + user?: Prisma.XOR + items?: Prisma.CheckListItemListRelationFilter +} + +export type CheckListOrderByWithRelationInput = { + id?: Prisma.SortOrder + userId?: Prisma.SortOrder + title?: Prisma.SortOrder + scene?: Prisma.SortOrder + note?: Prisma.SortOrder + archived?: Prisma.SortOrder + createdAt?: Prisma.SortOrder + updatedAt?: Prisma.SortOrder + user?: Prisma.UserOrderByWithRelationInput + items?: Prisma.CheckListItemOrderByRelationAggregateInput + _relevance?: Prisma.CheckListOrderByRelevanceInput +} + +export type CheckListWhereUniqueInput = Prisma.AtLeast<{ + id?: number + AND?: Prisma.CheckListWhereInput | Prisma.CheckListWhereInput[] + OR?: Prisma.CheckListWhereInput[] + NOT?: Prisma.CheckListWhereInput | Prisma.CheckListWhereInput[] + userId?: Prisma.IntFilter<"CheckList"> | number + title?: Prisma.StringFilter<"CheckList"> | string + scene?: Prisma.StringFilter<"CheckList"> | string + note?: Prisma.StringFilter<"CheckList"> | string + archived?: Prisma.BoolFilter<"CheckList"> | boolean + createdAt?: Prisma.DateTimeFilter<"CheckList"> | Date | string + updatedAt?: Prisma.DateTimeFilter<"CheckList"> | Date | string + user?: Prisma.XOR + items?: Prisma.CheckListItemListRelationFilter +}, "id"> + +export type CheckListOrderByWithAggregationInput = { + id?: Prisma.SortOrder + userId?: Prisma.SortOrder + title?: Prisma.SortOrder + scene?: Prisma.SortOrder + note?: Prisma.SortOrder + archived?: Prisma.SortOrder + createdAt?: Prisma.SortOrder + updatedAt?: Prisma.SortOrder + _count?: Prisma.CheckListCountOrderByAggregateInput + _avg?: Prisma.CheckListAvgOrderByAggregateInput + _max?: Prisma.CheckListMaxOrderByAggregateInput + _min?: Prisma.CheckListMinOrderByAggregateInput + _sum?: Prisma.CheckListSumOrderByAggregateInput +} + +export type CheckListScalarWhereWithAggregatesInput = { + AND?: Prisma.CheckListScalarWhereWithAggregatesInput | Prisma.CheckListScalarWhereWithAggregatesInput[] + OR?: Prisma.CheckListScalarWhereWithAggregatesInput[] + NOT?: Prisma.CheckListScalarWhereWithAggregatesInput | Prisma.CheckListScalarWhereWithAggregatesInput[] + id?: Prisma.IntWithAggregatesFilter<"CheckList"> | number + userId?: Prisma.IntWithAggregatesFilter<"CheckList"> | number + title?: Prisma.StringWithAggregatesFilter<"CheckList"> | string + scene?: Prisma.StringWithAggregatesFilter<"CheckList"> | string + note?: Prisma.StringWithAggregatesFilter<"CheckList"> | string + archived?: Prisma.BoolWithAggregatesFilter<"CheckList"> | boolean + createdAt?: Prisma.DateTimeWithAggregatesFilter<"CheckList"> | Date | string + updatedAt?: Prisma.DateTimeWithAggregatesFilter<"CheckList"> | Date | string +} + +export type CheckListCreateInput = { + title: string + scene?: string + note?: string + archived?: boolean + createdAt?: Date | string + updatedAt?: Date | string + user: Prisma.UserCreateNestedOneWithoutCheckListsInput + items?: Prisma.CheckListItemCreateNestedManyWithoutListInput +} + +export type CheckListUncheckedCreateInput = { + id?: number + userId: number + title: string + scene?: string + note?: string + archived?: boolean + createdAt?: Date | string + updatedAt?: Date | string + items?: Prisma.CheckListItemUncheckedCreateNestedManyWithoutListInput +} + +export type CheckListUpdateInput = { + title?: Prisma.StringFieldUpdateOperationsInput | string + scene?: Prisma.StringFieldUpdateOperationsInput | string + note?: Prisma.StringFieldUpdateOperationsInput | string + archived?: Prisma.BoolFieldUpdateOperationsInput | boolean + createdAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string + updatedAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string + user?: Prisma.UserUpdateOneRequiredWithoutCheckListsNestedInput + items?: Prisma.CheckListItemUpdateManyWithoutListNestedInput +} + +export type CheckListUncheckedUpdateInput = { + id?: Prisma.IntFieldUpdateOperationsInput | number + userId?: Prisma.IntFieldUpdateOperationsInput | number + title?: Prisma.StringFieldUpdateOperationsInput | string + scene?: Prisma.StringFieldUpdateOperationsInput | string + note?: Prisma.StringFieldUpdateOperationsInput | string + archived?: Prisma.BoolFieldUpdateOperationsInput | boolean + createdAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string + updatedAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string + items?: Prisma.CheckListItemUncheckedUpdateManyWithoutListNestedInput +} + +export type CheckListCreateManyInput = { + id?: number + userId: number + title: string + scene?: string + note?: string + archived?: boolean + createdAt?: Date | string + updatedAt?: Date | string +} + +export type CheckListUpdateManyMutationInput = { + title?: Prisma.StringFieldUpdateOperationsInput | string + scene?: Prisma.StringFieldUpdateOperationsInput | string + note?: Prisma.StringFieldUpdateOperationsInput | string + archived?: Prisma.BoolFieldUpdateOperationsInput | boolean + createdAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string + updatedAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string +} + +export type CheckListUncheckedUpdateManyInput = { + id?: Prisma.IntFieldUpdateOperationsInput | number + userId?: Prisma.IntFieldUpdateOperationsInput | number + title?: Prisma.StringFieldUpdateOperationsInput | string + scene?: Prisma.StringFieldUpdateOperationsInput | string + note?: Prisma.StringFieldUpdateOperationsInput | string + archived?: Prisma.BoolFieldUpdateOperationsInput | boolean + createdAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string + updatedAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string +} + +export type CheckListListRelationFilter = { + every?: Prisma.CheckListWhereInput + some?: Prisma.CheckListWhereInput + none?: Prisma.CheckListWhereInput +} + +export type CheckListOrderByRelationAggregateInput = { + _count?: Prisma.SortOrder +} + +export type CheckListOrderByRelevanceInput = { + fields: Prisma.CheckListOrderByRelevanceFieldEnum | Prisma.CheckListOrderByRelevanceFieldEnum[] + sort: Prisma.SortOrder + search: string +} + +export type CheckListCountOrderByAggregateInput = { + id?: Prisma.SortOrder + userId?: Prisma.SortOrder + title?: Prisma.SortOrder + scene?: Prisma.SortOrder + note?: Prisma.SortOrder + archived?: Prisma.SortOrder + createdAt?: Prisma.SortOrder + updatedAt?: Prisma.SortOrder +} + +export type CheckListAvgOrderByAggregateInput = { + id?: Prisma.SortOrder + userId?: Prisma.SortOrder +} + +export type CheckListMaxOrderByAggregateInput = { + id?: Prisma.SortOrder + userId?: Prisma.SortOrder + title?: Prisma.SortOrder + scene?: Prisma.SortOrder + note?: Prisma.SortOrder + archived?: Prisma.SortOrder + createdAt?: Prisma.SortOrder + updatedAt?: Prisma.SortOrder +} + +export type CheckListMinOrderByAggregateInput = { + id?: Prisma.SortOrder + userId?: Prisma.SortOrder + title?: Prisma.SortOrder + scene?: Prisma.SortOrder + note?: Prisma.SortOrder + archived?: Prisma.SortOrder + createdAt?: Prisma.SortOrder + updatedAt?: Prisma.SortOrder +} + +export type CheckListSumOrderByAggregateInput = { + id?: Prisma.SortOrder + userId?: Prisma.SortOrder +} + +export type CheckListScalarRelationFilter = { + is?: Prisma.CheckListWhereInput + isNot?: Prisma.CheckListWhereInput +} + +export type CheckListCreateNestedManyWithoutUserInput = { + create?: Prisma.XOR | Prisma.CheckListCreateWithoutUserInput[] | Prisma.CheckListUncheckedCreateWithoutUserInput[] + connectOrCreate?: Prisma.CheckListCreateOrConnectWithoutUserInput | Prisma.CheckListCreateOrConnectWithoutUserInput[] + createMany?: Prisma.CheckListCreateManyUserInputEnvelope + connect?: Prisma.CheckListWhereUniqueInput | Prisma.CheckListWhereUniqueInput[] +} + +export type CheckListUncheckedCreateNestedManyWithoutUserInput = { + create?: Prisma.XOR | Prisma.CheckListCreateWithoutUserInput[] | Prisma.CheckListUncheckedCreateWithoutUserInput[] + connectOrCreate?: Prisma.CheckListCreateOrConnectWithoutUserInput | Prisma.CheckListCreateOrConnectWithoutUserInput[] + createMany?: Prisma.CheckListCreateManyUserInputEnvelope + connect?: Prisma.CheckListWhereUniqueInput | Prisma.CheckListWhereUniqueInput[] +} + +export type CheckListUpdateManyWithoutUserNestedInput = { + create?: Prisma.XOR | Prisma.CheckListCreateWithoutUserInput[] | Prisma.CheckListUncheckedCreateWithoutUserInput[] + connectOrCreate?: Prisma.CheckListCreateOrConnectWithoutUserInput | Prisma.CheckListCreateOrConnectWithoutUserInput[] + upsert?: Prisma.CheckListUpsertWithWhereUniqueWithoutUserInput | Prisma.CheckListUpsertWithWhereUniqueWithoutUserInput[] + createMany?: Prisma.CheckListCreateManyUserInputEnvelope + set?: Prisma.CheckListWhereUniqueInput | Prisma.CheckListWhereUniqueInput[] + disconnect?: Prisma.CheckListWhereUniqueInput | Prisma.CheckListWhereUniqueInput[] + delete?: Prisma.CheckListWhereUniqueInput | Prisma.CheckListWhereUniqueInput[] + connect?: Prisma.CheckListWhereUniqueInput | Prisma.CheckListWhereUniqueInput[] + update?: Prisma.CheckListUpdateWithWhereUniqueWithoutUserInput | Prisma.CheckListUpdateWithWhereUniqueWithoutUserInput[] + updateMany?: Prisma.CheckListUpdateManyWithWhereWithoutUserInput | Prisma.CheckListUpdateManyWithWhereWithoutUserInput[] + deleteMany?: Prisma.CheckListScalarWhereInput | Prisma.CheckListScalarWhereInput[] +} + +export type CheckListUncheckedUpdateManyWithoutUserNestedInput = { + create?: Prisma.XOR | Prisma.CheckListCreateWithoutUserInput[] | Prisma.CheckListUncheckedCreateWithoutUserInput[] + connectOrCreate?: Prisma.CheckListCreateOrConnectWithoutUserInput | Prisma.CheckListCreateOrConnectWithoutUserInput[] + upsert?: Prisma.CheckListUpsertWithWhereUniqueWithoutUserInput | Prisma.CheckListUpsertWithWhereUniqueWithoutUserInput[] + createMany?: Prisma.CheckListCreateManyUserInputEnvelope + set?: Prisma.CheckListWhereUniqueInput | Prisma.CheckListWhereUniqueInput[] + disconnect?: Prisma.CheckListWhereUniqueInput | Prisma.CheckListWhereUniqueInput[] + delete?: Prisma.CheckListWhereUniqueInput | Prisma.CheckListWhereUniqueInput[] + connect?: Prisma.CheckListWhereUniqueInput | Prisma.CheckListWhereUniqueInput[] + update?: Prisma.CheckListUpdateWithWhereUniqueWithoutUserInput | Prisma.CheckListUpdateWithWhereUniqueWithoutUserInput[] + updateMany?: Prisma.CheckListUpdateManyWithWhereWithoutUserInput | Prisma.CheckListUpdateManyWithWhereWithoutUserInput[] + deleteMany?: Prisma.CheckListScalarWhereInput | Prisma.CheckListScalarWhereInput[] +} + +export type CheckListCreateNestedOneWithoutItemsInput = { + create?: Prisma.XOR + connectOrCreate?: Prisma.CheckListCreateOrConnectWithoutItemsInput + connect?: Prisma.CheckListWhereUniqueInput +} + +export type CheckListUpdateOneRequiredWithoutItemsNestedInput = { + create?: Prisma.XOR + connectOrCreate?: Prisma.CheckListCreateOrConnectWithoutItemsInput + upsert?: Prisma.CheckListUpsertWithoutItemsInput + connect?: Prisma.CheckListWhereUniqueInput + update?: Prisma.XOR, Prisma.CheckListUncheckedUpdateWithoutItemsInput> +} + +export type CheckListCreateWithoutUserInput = { + title: string + scene?: string + note?: string + archived?: boolean + createdAt?: Date | string + updatedAt?: Date | string + items?: Prisma.CheckListItemCreateNestedManyWithoutListInput +} + +export type CheckListUncheckedCreateWithoutUserInput = { + id?: number + title: string + scene?: string + note?: string + archived?: boolean + createdAt?: Date | string + updatedAt?: Date | string + items?: Prisma.CheckListItemUncheckedCreateNestedManyWithoutListInput +} + +export type CheckListCreateOrConnectWithoutUserInput = { + where: Prisma.CheckListWhereUniqueInput + create: Prisma.XOR +} + +export type CheckListCreateManyUserInputEnvelope = { + data: Prisma.CheckListCreateManyUserInput | Prisma.CheckListCreateManyUserInput[] + skipDuplicates?: boolean +} + +export type CheckListUpsertWithWhereUniqueWithoutUserInput = { + where: Prisma.CheckListWhereUniqueInput + update: Prisma.XOR + create: Prisma.XOR +} + +export type CheckListUpdateWithWhereUniqueWithoutUserInput = { + where: Prisma.CheckListWhereUniqueInput + data: Prisma.XOR +} + +export type CheckListUpdateManyWithWhereWithoutUserInput = { + where: Prisma.CheckListScalarWhereInput + data: Prisma.XOR +} + +export type CheckListScalarWhereInput = { + AND?: Prisma.CheckListScalarWhereInput | Prisma.CheckListScalarWhereInput[] + OR?: Prisma.CheckListScalarWhereInput[] + NOT?: Prisma.CheckListScalarWhereInput | Prisma.CheckListScalarWhereInput[] + id?: Prisma.IntFilter<"CheckList"> | number + userId?: Prisma.IntFilter<"CheckList"> | number + title?: Prisma.StringFilter<"CheckList"> | string + scene?: Prisma.StringFilter<"CheckList"> | string + note?: Prisma.StringFilter<"CheckList"> | string + archived?: Prisma.BoolFilter<"CheckList"> | boolean + createdAt?: Prisma.DateTimeFilter<"CheckList"> | Date | string + updatedAt?: Prisma.DateTimeFilter<"CheckList"> | Date | string +} + +export type CheckListCreateWithoutItemsInput = { + title: string + scene?: string + note?: string + archived?: boolean + createdAt?: Date | string + updatedAt?: Date | string + user: Prisma.UserCreateNestedOneWithoutCheckListsInput +} + +export type CheckListUncheckedCreateWithoutItemsInput = { + id?: number + userId: number + title: string + scene?: string + note?: string + archived?: boolean + createdAt?: Date | string + updatedAt?: Date | string +} + +export type CheckListCreateOrConnectWithoutItemsInput = { + where: Prisma.CheckListWhereUniqueInput + create: Prisma.XOR +} + +export type CheckListUpsertWithoutItemsInput = { + update: Prisma.XOR + create: Prisma.XOR + where?: Prisma.CheckListWhereInput +} + +export type CheckListUpdateToOneWithWhereWithoutItemsInput = { + where?: Prisma.CheckListWhereInput + data: Prisma.XOR +} + +export type CheckListUpdateWithoutItemsInput = { + title?: Prisma.StringFieldUpdateOperationsInput | string + scene?: Prisma.StringFieldUpdateOperationsInput | string + note?: Prisma.StringFieldUpdateOperationsInput | string + archived?: Prisma.BoolFieldUpdateOperationsInput | boolean + createdAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string + updatedAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string + user?: Prisma.UserUpdateOneRequiredWithoutCheckListsNestedInput +} + +export type CheckListUncheckedUpdateWithoutItemsInput = { + id?: Prisma.IntFieldUpdateOperationsInput | number + userId?: Prisma.IntFieldUpdateOperationsInput | number + title?: Prisma.StringFieldUpdateOperationsInput | string + scene?: Prisma.StringFieldUpdateOperationsInput | string + note?: Prisma.StringFieldUpdateOperationsInput | string + archived?: Prisma.BoolFieldUpdateOperationsInput | boolean + createdAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string + updatedAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string +} + +export type CheckListCreateManyUserInput = { + id?: number + title: string + scene?: string + note?: string + archived?: boolean + createdAt?: Date | string + updatedAt?: Date | string +} + +export type CheckListUpdateWithoutUserInput = { + title?: Prisma.StringFieldUpdateOperationsInput | string + scene?: Prisma.StringFieldUpdateOperationsInput | string + note?: Prisma.StringFieldUpdateOperationsInput | string + archived?: Prisma.BoolFieldUpdateOperationsInput | boolean + createdAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string + updatedAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string + items?: Prisma.CheckListItemUpdateManyWithoutListNestedInput +} + +export type CheckListUncheckedUpdateWithoutUserInput = { + id?: Prisma.IntFieldUpdateOperationsInput | number + title?: Prisma.StringFieldUpdateOperationsInput | string + scene?: Prisma.StringFieldUpdateOperationsInput | string + note?: Prisma.StringFieldUpdateOperationsInput | string + archived?: Prisma.BoolFieldUpdateOperationsInput | boolean + createdAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string + updatedAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string + items?: Prisma.CheckListItemUncheckedUpdateManyWithoutListNestedInput +} + +export type CheckListUncheckedUpdateManyWithoutUserInput = { + id?: Prisma.IntFieldUpdateOperationsInput | number + title?: Prisma.StringFieldUpdateOperationsInput | string + scene?: Prisma.StringFieldUpdateOperationsInput | string + note?: Prisma.StringFieldUpdateOperationsInput | string + archived?: Prisma.BoolFieldUpdateOperationsInput | boolean + createdAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string + updatedAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string +} + + +/** + * Count Type CheckListCountOutputType + */ + +export type CheckListCountOutputType = { + items: number +} + +export type CheckListCountOutputTypeSelect = { + items?: boolean | CheckListCountOutputTypeCountItemsArgs +} + +/** + * CheckListCountOutputType without action + */ +export type CheckListCountOutputTypeDefaultArgs = { + /** + * Select specific fields to fetch from the CheckListCountOutputType + */ + select?: Prisma.CheckListCountOutputTypeSelect | null +} + +/** + * CheckListCountOutputType without action + */ +export type CheckListCountOutputTypeCountItemsArgs = { + where?: Prisma.CheckListItemWhereInput +} + + +export type CheckListSelect = runtime.Types.Extensions.GetSelect<{ + id?: boolean + userId?: boolean + title?: boolean + scene?: boolean + note?: boolean + archived?: boolean + createdAt?: boolean + updatedAt?: boolean + user?: boolean | Prisma.UserDefaultArgs + items?: boolean | Prisma.CheckList$itemsArgs + _count?: boolean | Prisma.CheckListCountOutputTypeDefaultArgs +}, ExtArgs["result"]["checkList"]> + + + +export type CheckListSelectScalar = { + id?: boolean + userId?: boolean + title?: boolean + scene?: boolean + note?: boolean + archived?: boolean + createdAt?: boolean + updatedAt?: boolean +} + +export type CheckListOmit = runtime.Types.Extensions.GetOmit<"id" | "userId" | "title" | "scene" | "note" | "archived" | "createdAt" | "updatedAt", ExtArgs["result"]["checkList"]> +export type CheckListInclude = { + user?: boolean | Prisma.UserDefaultArgs + items?: boolean | Prisma.CheckList$itemsArgs + _count?: boolean | Prisma.CheckListCountOutputTypeDefaultArgs +} + +export type $CheckListPayload = { + name: "CheckList" + objects: { + user: Prisma.$UserPayload + items: Prisma.$CheckListItemPayload[] + } + scalars: runtime.Types.Extensions.GetPayloadResult<{ + id: number + userId: number + title: string + scene: string + note: string + archived: boolean + createdAt: Date + updatedAt: Date + }, ExtArgs["result"]["checkList"]> + composites: {} +} + +export type CheckListGetPayload = runtime.Types.Result.GetResult + +export type CheckListCountArgs = + Omit & { + select?: CheckListCountAggregateInputType | true + } + +export interface CheckListDelegate { + [K: symbol]: { types: Prisma.TypeMap['model']['CheckList'], meta: { name: 'CheckList' } } + /** + * Find zero or one CheckList that matches the filter. + * @param {CheckListFindUniqueArgs} args - Arguments to find a CheckList + * @example + * // Get one CheckList + * const checkList = await prisma.checkList.findUnique({ + * where: { + * // ... provide filter here + * } + * }) + */ + findUnique(args: Prisma.SelectSubset>): Prisma.Prisma__CheckListClient, T, "findUnique", GlobalOmitOptions> | null, null, ExtArgs, GlobalOmitOptions> + + /** + * Find one CheckList that matches the filter or throw an error with `error.code='P2025'` + * if no matches were found. + * @param {CheckListFindUniqueOrThrowArgs} args - Arguments to find a CheckList + * @example + * // Get one CheckList + * const checkList = await prisma.checkList.findUniqueOrThrow({ + * where: { + * // ... provide filter here + * } + * }) + */ + findUniqueOrThrow(args: Prisma.SelectSubset>): Prisma.Prisma__CheckListClient, T, "findUniqueOrThrow", GlobalOmitOptions>, never, ExtArgs, GlobalOmitOptions> + + /** + * Find the first CheckList that matches the filter. + * Note, that providing `undefined` is treated as the value not being there. + * Read more here: https://pris.ly/d/null-undefined + * @param {CheckListFindFirstArgs} args - Arguments to find a CheckList + * @example + * // Get one CheckList + * const checkList = await prisma.checkList.findFirst({ + * where: { + * // ... provide filter here + * } + * }) + */ + findFirst(args?: Prisma.SelectSubset>): Prisma.Prisma__CheckListClient, T, "findFirst", GlobalOmitOptions> | null, null, ExtArgs, GlobalOmitOptions> + + /** + * Find the first CheckList that matches the filter or + * throw `PrismaKnownClientError` with `P2025` code if no matches were found. + * Note, that providing `undefined` is treated as the value not being there. + * Read more here: https://pris.ly/d/null-undefined + * @param {CheckListFindFirstOrThrowArgs} args - Arguments to find a CheckList + * @example + * // Get one CheckList + * const checkList = await prisma.checkList.findFirstOrThrow({ + * where: { + * // ... provide filter here + * } + * }) + */ + findFirstOrThrow(args?: Prisma.SelectSubset>): Prisma.Prisma__CheckListClient, T, "findFirstOrThrow", GlobalOmitOptions>, never, ExtArgs, GlobalOmitOptions> + + /** + * Find zero or more CheckLists that matches the filter. + * Note, that providing `undefined` is treated as the value not being there. + * Read more here: https://pris.ly/d/null-undefined + * @param {CheckListFindManyArgs} args - Arguments to filter and select certain fields only. + * @example + * // Get all CheckLists + * const checkLists = await prisma.checkList.findMany() + * + * // Get first 10 CheckLists + * const checkLists = await prisma.checkList.findMany({ take: 10 }) + * + * // Only select the `id` + * const checkListWithIdOnly = await prisma.checkList.findMany({ select: { id: true } }) + * + */ + findMany(args?: Prisma.SelectSubset>): Prisma.PrismaPromise, T, "findMany", GlobalOmitOptions>> + + /** + * Create a CheckList. + * @param {CheckListCreateArgs} args - Arguments to create a CheckList. + * @example + * // Create one CheckList + * const CheckList = await prisma.checkList.create({ + * data: { + * // ... data to create a CheckList + * } + * }) + * + */ + create(args: Prisma.SelectSubset>): Prisma.Prisma__CheckListClient, T, "create", GlobalOmitOptions>, never, ExtArgs, GlobalOmitOptions> + + /** + * Create many CheckLists. + * @param {CheckListCreateManyArgs} args - Arguments to create many CheckLists. + * @example + * // Create many CheckLists + * const checkList = await prisma.checkList.createMany({ + * data: [ + * // ... provide data here + * ] + * }) + * + */ + createMany(args?: Prisma.SelectSubset>): Prisma.PrismaPromise + + /** + * Delete a CheckList. + * @param {CheckListDeleteArgs} args - Arguments to delete one CheckList. + * @example + * // Delete one CheckList + * const CheckList = await prisma.checkList.delete({ + * where: { + * // ... filter to delete one CheckList + * } + * }) + * + */ + delete(args: Prisma.SelectSubset>): Prisma.Prisma__CheckListClient, T, "delete", GlobalOmitOptions>, never, ExtArgs, GlobalOmitOptions> + + /** + * Update one CheckList. + * @param {CheckListUpdateArgs} args - Arguments to update one CheckList. + * @example + * // Update one CheckList + * const checkList = await prisma.checkList.update({ + * where: { + * // ... provide filter here + * }, + * data: { + * // ... provide data here + * } + * }) + * + */ + update(args: Prisma.SelectSubset>): Prisma.Prisma__CheckListClient, T, "update", GlobalOmitOptions>, never, ExtArgs, GlobalOmitOptions> + + /** + * Delete zero or more CheckLists. + * @param {CheckListDeleteManyArgs} args - Arguments to filter CheckLists to delete. + * @example + * // Delete a few CheckLists + * const { count } = await prisma.checkList.deleteMany({ + * where: { + * // ... provide filter here + * } + * }) + * + */ + deleteMany(args?: Prisma.SelectSubset>): Prisma.PrismaPromise + + /** + * Update zero or more CheckLists. + * Note, that providing `undefined` is treated as the value not being there. + * Read more here: https://pris.ly/d/null-undefined + * @param {CheckListUpdateManyArgs} args - Arguments to update one or more rows. + * @example + * // Update many CheckLists + * const checkList = await prisma.checkList.updateMany({ + * where: { + * // ... provide filter here + * }, + * data: { + * // ... provide data here + * } + * }) + * + */ + updateMany(args: Prisma.SelectSubset>): Prisma.PrismaPromise + + /** + * Create or update one CheckList. + * @param {CheckListUpsertArgs} args - Arguments to update or create a CheckList. + * @example + * // Update or create a CheckList + * const checkList = await prisma.checkList.upsert({ + * create: { + * // ... data to create a CheckList + * }, + * update: { + * // ... in case it already exists, update + * }, + * where: { + * // ... the filter for the CheckList we want to update + * } + * }) + */ + upsert(args: Prisma.SelectSubset>): Prisma.Prisma__CheckListClient, T, "upsert", GlobalOmitOptions>, never, ExtArgs, GlobalOmitOptions> + + + /** + * Count the number of CheckLists. + * Note, that providing `undefined` is treated as the value not being there. + * Read more here: https://pris.ly/d/null-undefined + * @param {CheckListCountArgs} args - Arguments to filter CheckLists to count. + * @example + * // Count the number of CheckLists + * const count = await prisma.checkList.count({ + * where: { + * // ... the filter for the CheckLists we want to count + * } + * }) + **/ + count( + args?: Prisma.Subset, + ): Prisma.PrismaPromise< + T extends runtime.Types.Utils.Record<'select', any> + ? T['select'] extends true + ? number + : Prisma.GetScalarType + : number + > + + /** + * Allows you to perform aggregations operations on a CheckList. + * Note, that providing `undefined` is treated as the value not being there. + * Read more here: https://pris.ly/d/null-undefined + * @param {CheckListAggregateArgs} args - Select which aggregations you would like to apply and on what fields. + * @example + * // Ordered by age ascending + * // Where email contains prisma.io + * // Limited to the 10 users + * const aggregations = await prisma.user.aggregate({ + * _avg: { + * age: true, + * }, + * where: { + * email: { + * contains: "prisma.io", + * }, + * }, + * orderBy: { + * age: "asc", + * }, + * take: 10, + * }) + **/ + aggregate(args: Prisma.Subset): Prisma.PrismaPromise> + + /** + * Group by CheckList. + * Note, that providing `undefined` is treated as the value not being there. + * Read more here: https://pris.ly/d/null-undefined + * @param {CheckListGroupByArgs} args - Group by arguments. + * @example + * // Group by city, order by createdAt, get count + * const result = await prisma.user.groupBy({ + * by: ['city', 'createdAt'], + * orderBy: { + * createdAt: true + * }, + * _count: { + * _all: true + * }, + * }) + * + **/ + groupBy< + T extends CheckListGroupByArgs, + HasSelectOrTake extends Prisma.Or< + Prisma.Extends<'skip', Prisma.Keys>, + Prisma.Extends<'take', Prisma.Keys> + >, + OrderByArg extends Prisma.True extends HasSelectOrTake + ? { orderBy: CheckListGroupByArgs['orderBy'] } + : { orderBy?: CheckListGroupByArgs['orderBy'] }, + OrderFields extends Prisma.ExcludeUnderscoreKeys>>, + ByFields extends Prisma.MaybeTupleToUnion, + ByValid extends Prisma.Has, + HavingFields extends Prisma.GetHavingFields, + HavingValid extends Prisma.Has, + ByEmpty extends T['by'] extends never[] ? Prisma.True : Prisma.False, + InputErrors extends ByEmpty extends Prisma.True + ? `Error: "by" must not be empty.` + : HavingValid extends Prisma.False + ? { + [P in HavingFields]: P extends ByFields + ? never + : P extends string + ? `Error: Field "${P}" used in "having" needs to be provided in "by".` + : [ + Error, + 'Field ', + P, + ` in "having" needs to be provided in "by"`, + ] + }[HavingFields] + : 'take' extends Prisma.Keys + ? 'orderBy' extends Prisma.Keys + ? ByValid extends Prisma.True + ? {} + : { + [P in OrderFields]: P extends ByFields + ? never + : `Error: Field "${P}" in "orderBy" needs to be provided in "by"` + }[OrderFields] + : 'Error: If you provide "take", you also need to provide "orderBy"' + : 'skip' extends Prisma.Keys + ? 'orderBy' extends Prisma.Keys + ? ByValid extends Prisma.True + ? {} + : { + [P in OrderFields]: P extends ByFields + ? never + : `Error: Field "${P}" in "orderBy" needs to be provided in "by"` + }[OrderFields] + : 'Error: If you provide "skip", you also need to provide "orderBy"' + : ByValid extends Prisma.True + ? {} + : { + [P in OrderFields]: P extends ByFields + ? never + : `Error: Field "${P}" in "orderBy" needs to be provided in "by"` + }[OrderFields] + >(args: Prisma.SubsetIntersection & InputErrors): {} extends InputErrors ? GetCheckListGroupByPayload : Prisma.PrismaPromise +/** + * Fields of the CheckList model + */ +readonly fields: CheckListFieldRefs; +} + +/** + * The delegate class that acts as a "Promise-like" for CheckList. + * Why is this prefixed with `Prisma__`? + * Because we want to prevent naming conflicts as mentioned in + * https://github.com/prisma/prisma-client-js/issues/707 + */ +export interface Prisma__CheckListClient extends Prisma.PrismaPromise { + readonly [Symbol.toStringTag]: "PrismaPromise" + user = {}>(args?: Prisma.Subset>): Prisma.Prisma__UserClient, T, "findUniqueOrThrow", GlobalOmitOptions> | Null, Null, ExtArgs, GlobalOmitOptions> + items = {}>(args?: Prisma.Subset>): Prisma.PrismaPromise, T, "findMany", GlobalOmitOptions> | Null> + /** + * Attaches callbacks for the resolution and/or rejection of the Promise. + * @param onfulfilled The callback to execute when the Promise is resolved. + * @param onrejected The callback to execute when the Promise is rejected. + * @returns A Promise for the completion of which ever callback is executed. + */ + then(onfulfilled?: ((value: T) => TResult1 | PromiseLike) | undefined | null, onrejected?: ((reason: any) => TResult2 | PromiseLike) | undefined | null): runtime.Types.Utils.JsPromise + /** + * Attaches a callback for only the rejection of the Promise. + * @param onrejected The callback to execute when the Promise is rejected. + * @returns A Promise for the completion of the callback. + */ + catch(onrejected?: ((reason: any) => TResult | PromiseLike) | undefined | null): runtime.Types.Utils.JsPromise + /** + * Attaches a callback that is invoked when the Promise is settled (fulfilled or rejected). The + * resolved value cannot be modified from the callback. + * @param onfinally The callback to execute when the Promise is settled (fulfilled or rejected). + * @returns A Promise for the completion of the callback. + */ + finally(onfinally?: (() => void) | undefined | null): runtime.Types.Utils.JsPromise +} + + + + +/** + * Fields of the CheckList model + */ +export interface CheckListFieldRefs { + readonly id: Prisma.FieldRef<"CheckList", 'Int'> + readonly userId: Prisma.FieldRef<"CheckList", 'Int'> + readonly title: Prisma.FieldRef<"CheckList", 'String'> + readonly scene: Prisma.FieldRef<"CheckList", 'String'> + readonly note: Prisma.FieldRef<"CheckList", 'String'> + readonly archived: Prisma.FieldRef<"CheckList", 'Boolean'> + readonly createdAt: Prisma.FieldRef<"CheckList", 'DateTime'> + readonly updatedAt: Prisma.FieldRef<"CheckList", 'DateTime'> +} + + +// Custom InputTypes +/** + * CheckList findUnique + */ +export type CheckListFindUniqueArgs = { + /** + * Select specific fields to fetch from the CheckList + */ + select?: Prisma.CheckListSelect | null + /** + * Omit specific fields from the CheckList + */ + omit?: Prisma.CheckListOmit | null + /** + * Choose, which related nodes to fetch as well + */ + include?: Prisma.CheckListInclude | null + /** + * Filter, which CheckList to fetch. + */ + where: Prisma.CheckListWhereUniqueInput +} + +/** + * CheckList findUniqueOrThrow + */ +export type CheckListFindUniqueOrThrowArgs = { + /** + * Select specific fields to fetch from the CheckList + */ + select?: Prisma.CheckListSelect | null + /** + * Omit specific fields from the CheckList + */ + omit?: Prisma.CheckListOmit | null + /** + * Choose, which related nodes to fetch as well + */ + include?: Prisma.CheckListInclude | null + /** + * Filter, which CheckList to fetch. + */ + where: Prisma.CheckListWhereUniqueInput +} + +/** + * CheckList findFirst + */ +export type CheckListFindFirstArgs = { + /** + * Select specific fields to fetch from the CheckList + */ + select?: Prisma.CheckListSelect | null + /** + * Omit specific fields from the CheckList + */ + omit?: Prisma.CheckListOmit | null + /** + * Choose, which related nodes to fetch as well + */ + include?: Prisma.CheckListInclude | null + /** + * Filter, which CheckList to fetch. + */ + where?: Prisma.CheckListWhereInput + /** + * {@link https://www.prisma.io/docs/concepts/components/prisma-client/sorting Sorting Docs} + * + * Determine the order of CheckLists to fetch. + */ + orderBy?: Prisma.CheckListOrderByWithRelationInput | Prisma.CheckListOrderByWithRelationInput[] + /** + * {@link https://www.prisma.io/docs/concepts/components/prisma-client/pagination#cursor-based-pagination Cursor Docs} + * + * Sets the position for searching for CheckLists. + */ + cursor?: Prisma.CheckListWhereUniqueInput + /** + * {@link https://www.prisma.io/docs/concepts/components/prisma-client/pagination Pagination Docs} + * + * Take `±n` CheckLists from the position of the cursor. + */ + take?: number + /** + * {@link https://www.prisma.io/docs/concepts/components/prisma-client/pagination Pagination Docs} + * + * Skip the first `n` CheckLists. + */ + skip?: number + /** + * {@link https://www.prisma.io/docs/concepts/components/prisma-client/distinct Distinct Docs} + * + * Filter by unique combinations of CheckLists. + */ + distinct?: Prisma.CheckListScalarFieldEnum | Prisma.CheckListScalarFieldEnum[] +} + +/** + * CheckList findFirstOrThrow + */ +export type CheckListFindFirstOrThrowArgs = { + /** + * Select specific fields to fetch from the CheckList + */ + select?: Prisma.CheckListSelect | null + /** + * Omit specific fields from the CheckList + */ + omit?: Prisma.CheckListOmit | null + /** + * Choose, which related nodes to fetch as well + */ + include?: Prisma.CheckListInclude | null + /** + * Filter, which CheckList to fetch. + */ + where?: Prisma.CheckListWhereInput + /** + * {@link https://www.prisma.io/docs/concepts/components/prisma-client/sorting Sorting Docs} + * + * Determine the order of CheckLists to fetch. + */ + orderBy?: Prisma.CheckListOrderByWithRelationInput | Prisma.CheckListOrderByWithRelationInput[] + /** + * {@link https://www.prisma.io/docs/concepts/components/prisma-client/pagination#cursor-based-pagination Cursor Docs} + * + * Sets the position for searching for CheckLists. + */ + cursor?: Prisma.CheckListWhereUniqueInput + /** + * {@link https://www.prisma.io/docs/concepts/components/prisma-client/pagination Pagination Docs} + * + * Take `±n` CheckLists from the position of the cursor. + */ + take?: number + /** + * {@link https://www.prisma.io/docs/concepts/components/prisma-client/pagination Pagination Docs} + * + * Skip the first `n` CheckLists. + */ + skip?: number + /** + * {@link https://www.prisma.io/docs/concepts/components/prisma-client/distinct Distinct Docs} + * + * Filter by unique combinations of CheckLists. + */ + distinct?: Prisma.CheckListScalarFieldEnum | Prisma.CheckListScalarFieldEnum[] +} + +/** + * CheckList findMany + */ +export type CheckListFindManyArgs = { + /** + * Select specific fields to fetch from the CheckList + */ + select?: Prisma.CheckListSelect | null + /** + * Omit specific fields from the CheckList + */ + omit?: Prisma.CheckListOmit | null + /** + * Choose, which related nodes to fetch as well + */ + include?: Prisma.CheckListInclude | null + /** + * Filter, which CheckLists to fetch. + */ + where?: Prisma.CheckListWhereInput + /** + * {@link https://www.prisma.io/docs/concepts/components/prisma-client/sorting Sorting Docs} + * + * Determine the order of CheckLists to fetch. + */ + orderBy?: Prisma.CheckListOrderByWithRelationInput | Prisma.CheckListOrderByWithRelationInput[] + /** + * {@link https://www.prisma.io/docs/concepts/components/prisma-client/pagination#cursor-based-pagination Cursor Docs} + * + * Sets the position for listing CheckLists. + */ + cursor?: Prisma.CheckListWhereUniqueInput + /** + * {@link https://www.prisma.io/docs/concepts/components/prisma-client/pagination Pagination Docs} + * + * Take `±n` CheckLists from the position of the cursor. + */ + take?: number + /** + * {@link https://www.prisma.io/docs/concepts/components/prisma-client/pagination Pagination Docs} + * + * Skip the first `n` CheckLists. + */ + skip?: number + /** + * {@link https://www.prisma.io/docs/concepts/components/prisma-client/distinct Distinct Docs} + * + * Filter by unique combinations of CheckLists. + */ + distinct?: Prisma.CheckListScalarFieldEnum | Prisma.CheckListScalarFieldEnum[] +} + +/** + * CheckList create + */ +export type CheckListCreateArgs = { + /** + * Select specific fields to fetch from the CheckList + */ + select?: Prisma.CheckListSelect | null + /** + * Omit specific fields from the CheckList + */ + omit?: Prisma.CheckListOmit | null + /** + * Choose, which related nodes to fetch as well + */ + include?: Prisma.CheckListInclude | null + /** + * The data needed to create a CheckList. + */ + data: Prisma.XOR +} + +/** + * CheckList createMany + */ +export type CheckListCreateManyArgs = { + /** + * The data used to create many CheckLists. + */ + data: Prisma.CheckListCreateManyInput | Prisma.CheckListCreateManyInput[] + skipDuplicates?: boolean +} + +/** + * CheckList update + */ +export type CheckListUpdateArgs = { + /** + * Select specific fields to fetch from the CheckList + */ + select?: Prisma.CheckListSelect | null + /** + * Omit specific fields from the CheckList + */ + omit?: Prisma.CheckListOmit | null + /** + * Choose, which related nodes to fetch as well + */ + include?: Prisma.CheckListInclude | null + /** + * The data needed to update a CheckList. + */ + data: Prisma.XOR + /** + * Choose, which CheckList to update. + */ + where: Prisma.CheckListWhereUniqueInput +} + +/** + * CheckList updateMany + */ +export type CheckListUpdateManyArgs = { + /** + * The data used to update CheckLists. + */ + data: Prisma.XOR + /** + * Filter which CheckLists to update + */ + where?: Prisma.CheckListWhereInput + /** + * Limit how many CheckLists to update. + */ + limit?: number +} + +/** + * CheckList upsert + */ +export type CheckListUpsertArgs = { + /** + * Select specific fields to fetch from the CheckList + */ + select?: Prisma.CheckListSelect | null + /** + * Omit specific fields from the CheckList + */ + omit?: Prisma.CheckListOmit | null + /** + * Choose, which related nodes to fetch as well + */ + include?: Prisma.CheckListInclude | null + /** + * The filter to search for the CheckList to update in case it exists. + */ + where: Prisma.CheckListWhereUniqueInput + /** + * In case the CheckList found by the `where` argument doesn't exist, create a new CheckList with this data. + */ + create: Prisma.XOR + /** + * In case the CheckList was found with the provided `where` argument, update it with this data. + */ + update: Prisma.XOR +} + +/** + * CheckList delete + */ +export type CheckListDeleteArgs = { + /** + * Select specific fields to fetch from the CheckList + */ + select?: Prisma.CheckListSelect | null + /** + * Omit specific fields from the CheckList + */ + omit?: Prisma.CheckListOmit | null + /** + * Choose, which related nodes to fetch as well + */ + include?: Prisma.CheckListInclude | null + /** + * Filter which CheckList to delete. + */ + where: Prisma.CheckListWhereUniqueInput +} + +/** + * CheckList deleteMany + */ +export type CheckListDeleteManyArgs = { + /** + * Filter which CheckLists to delete + */ + where?: Prisma.CheckListWhereInput + /** + * Limit how many CheckLists to delete. + */ + limit?: number +} + +/** + * CheckList.items + */ +export type CheckList$itemsArgs = { + /** + * Select specific fields to fetch from the CheckListItem + */ + select?: Prisma.CheckListItemSelect | null + /** + * Omit specific fields from the CheckListItem + */ + omit?: Prisma.CheckListItemOmit | null + /** + * Choose, which related nodes to fetch as well + */ + include?: Prisma.CheckListItemInclude | null + where?: Prisma.CheckListItemWhereInput + orderBy?: Prisma.CheckListItemOrderByWithRelationInput | Prisma.CheckListItemOrderByWithRelationInput[] + cursor?: Prisma.CheckListItemWhereUniqueInput + take?: number + skip?: number + distinct?: Prisma.CheckListItemScalarFieldEnum | Prisma.CheckListItemScalarFieldEnum[] +} + +/** + * CheckList without action + */ +export type CheckListDefaultArgs = { + /** + * Select specific fields to fetch from the CheckList + */ + select?: Prisma.CheckListSelect | null + /** + * Omit specific fields from the CheckList + */ + omit?: Prisma.CheckListOmit | null + /** + * Choose, which related nodes to fetch as well + */ + include?: Prisma.CheckListInclude | null +} diff --git a/generated/prisma/models/CheckListItem.ts b/generated/prisma/models/CheckListItem.ts new file mode 100644 index 0000000..df1e459 --- /dev/null +++ b/generated/prisma/models/CheckListItem.ts @@ -0,0 +1,1406 @@ + +/* !!! This is code generated by Prisma. Do not edit directly. !!! */ +/* eslint-disable */ +// biome-ignore-all lint: generated file +// @ts-nocheck +/* + * This file exports the `CheckListItem` model and its related types. + * + * 🟢 You can import this file directly. + */ +import type * as runtime from "@prisma/client/runtime/client" +import type * as $Enums from "../enums.ts" +import type * as Prisma from "../internal/prismaNamespace.ts" + +/** + * Model CheckListItem + * + */ +export type CheckListItemModel = runtime.Types.Result.DefaultSelection + +export type AggregateCheckListItem = { + _count: CheckListItemCountAggregateOutputType | null + _avg: CheckListItemAvgAggregateOutputType | null + _sum: CheckListItemSumAggregateOutputType | null + _min: CheckListItemMinAggregateOutputType | null + _max: CheckListItemMaxAggregateOutputType | null +} + +export type CheckListItemAvgAggregateOutputType = { + id: number | null + listId: number | null + sortOrder: number | null +} + +export type CheckListItemSumAggregateOutputType = { + id: number | null + listId: number | null + sortOrder: number | null +} + +export type CheckListItemMinAggregateOutputType = { + id: number | null + listId: number | null + title: string | null + note: string | null + done: boolean | null + doneAt: Date | null + sortOrder: number | null + createdAt: Date | null + updatedAt: Date | null +} + +export type CheckListItemMaxAggregateOutputType = { + id: number | null + listId: number | null + title: string | null + note: string | null + done: boolean | null + doneAt: Date | null + sortOrder: number | null + createdAt: Date | null + updatedAt: Date | null +} + +export type CheckListItemCountAggregateOutputType = { + id: number + listId: number + title: number + note: number + done: number + doneAt: number + sortOrder: number + createdAt: number + updatedAt: number + _all: number +} + + +export type CheckListItemAvgAggregateInputType = { + id?: true + listId?: true + sortOrder?: true +} + +export type CheckListItemSumAggregateInputType = { + id?: true + listId?: true + sortOrder?: true +} + +export type CheckListItemMinAggregateInputType = { + id?: true + listId?: true + title?: true + note?: true + done?: true + doneAt?: true + sortOrder?: true + createdAt?: true + updatedAt?: true +} + +export type CheckListItemMaxAggregateInputType = { + id?: true + listId?: true + title?: true + note?: true + done?: true + doneAt?: true + sortOrder?: true + createdAt?: true + updatedAt?: true +} + +export type CheckListItemCountAggregateInputType = { + id?: true + listId?: true + title?: true + note?: true + done?: true + doneAt?: true + sortOrder?: true + createdAt?: true + updatedAt?: true + _all?: true +} + +export type CheckListItemAggregateArgs = { + /** + * Filter which CheckListItem to aggregate. + */ + where?: Prisma.CheckListItemWhereInput + /** + * {@link https://www.prisma.io/docs/concepts/components/prisma-client/sorting Sorting Docs} + * + * Determine the order of CheckListItems to fetch. + */ + orderBy?: Prisma.CheckListItemOrderByWithRelationInput | Prisma.CheckListItemOrderByWithRelationInput[] + /** + * {@link https://www.prisma.io/docs/concepts/components/prisma-client/pagination#cursor-based-pagination Cursor Docs} + * + * Sets the start position + */ + cursor?: Prisma.CheckListItemWhereUniqueInput + /** + * {@link https://www.prisma.io/docs/concepts/components/prisma-client/pagination Pagination Docs} + * + * Take `±n` CheckListItems from the position of the cursor. + */ + take?: number + /** + * {@link https://www.prisma.io/docs/concepts/components/prisma-client/pagination Pagination Docs} + * + * Skip the first `n` CheckListItems. + */ + skip?: number + /** + * {@link https://www.prisma.io/docs/concepts/components/prisma-client/aggregations Aggregation Docs} + * + * Count returned CheckListItems + **/ + _count?: true | CheckListItemCountAggregateInputType + /** + * {@link https://www.prisma.io/docs/concepts/components/prisma-client/aggregations Aggregation Docs} + * + * Select which fields to average + **/ + _avg?: CheckListItemAvgAggregateInputType + /** + * {@link https://www.prisma.io/docs/concepts/components/prisma-client/aggregations Aggregation Docs} + * + * Select which fields to sum + **/ + _sum?: CheckListItemSumAggregateInputType + /** + * {@link https://www.prisma.io/docs/concepts/components/prisma-client/aggregations Aggregation Docs} + * + * Select which fields to find the minimum value + **/ + _min?: CheckListItemMinAggregateInputType + /** + * {@link https://www.prisma.io/docs/concepts/components/prisma-client/aggregations Aggregation Docs} + * + * Select which fields to find the maximum value + **/ + _max?: CheckListItemMaxAggregateInputType +} + +export type GetCheckListItemAggregateType = { + [P in keyof T & keyof AggregateCheckListItem]: P extends '_count' | 'count' + ? T[P] extends true + ? number + : Prisma.GetScalarType + : Prisma.GetScalarType +} + + + + +export type CheckListItemGroupByArgs = { + where?: Prisma.CheckListItemWhereInput + orderBy?: Prisma.CheckListItemOrderByWithAggregationInput | Prisma.CheckListItemOrderByWithAggregationInput[] + by: Prisma.CheckListItemScalarFieldEnum[] | Prisma.CheckListItemScalarFieldEnum + having?: Prisma.CheckListItemScalarWhereWithAggregatesInput + take?: number + skip?: number + _count?: CheckListItemCountAggregateInputType | true + _avg?: CheckListItemAvgAggregateInputType + _sum?: CheckListItemSumAggregateInputType + _min?: CheckListItemMinAggregateInputType + _max?: CheckListItemMaxAggregateInputType +} + +export type CheckListItemGroupByOutputType = { + id: number + listId: number + title: string + note: string + done: boolean + doneAt: Date | null + sortOrder: number + createdAt: Date + updatedAt: Date + _count: CheckListItemCountAggregateOutputType | null + _avg: CheckListItemAvgAggregateOutputType | null + _sum: CheckListItemSumAggregateOutputType | null + _min: CheckListItemMinAggregateOutputType | null + _max: CheckListItemMaxAggregateOutputType | null +} + +export type GetCheckListItemGroupByPayload = Prisma.PrismaPromise< + Array< + Prisma.PickEnumerable & + { + [P in ((keyof T) & (keyof CheckListItemGroupByOutputType))]: P extends '_count' + ? T[P] extends boolean + ? number + : Prisma.GetScalarType + : Prisma.GetScalarType + } + > + > + + + +export type CheckListItemWhereInput = { + AND?: Prisma.CheckListItemWhereInput | Prisma.CheckListItemWhereInput[] + OR?: Prisma.CheckListItemWhereInput[] + NOT?: Prisma.CheckListItemWhereInput | Prisma.CheckListItemWhereInput[] + id?: Prisma.IntFilter<"CheckListItem"> | number + listId?: Prisma.IntFilter<"CheckListItem"> | number + title?: Prisma.StringFilter<"CheckListItem"> | string + note?: Prisma.StringFilter<"CheckListItem"> | string + done?: Prisma.BoolFilter<"CheckListItem"> | boolean + doneAt?: Prisma.DateTimeNullableFilter<"CheckListItem"> | Date | string | null + sortOrder?: Prisma.IntFilter<"CheckListItem"> | number + createdAt?: Prisma.DateTimeFilter<"CheckListItem"> | Date | string + updatedAt?: Prisma.DateTimeFilter<"CheckListItem"> | Date | string + list?: Prisma.XOR +} + +export type CheckListItemOrderByWithRelationInput = { + id?: Prisma.SortOrder + listId?: Prisma.SortOrder + title?: Prisma.SortOrder + note?: Prisma.SortOrder + done?: Prisma.SortOrder + doneAt?: Prisma.SortOrderInput | Prisma.SortOrder + sortOrder?: Prisma.SortOrder + createdAt?: Prisma.SortOrder + updatedAt?: Prisma.SortOrder + list?: Prisma.CheckListOrderByWithRelationInput + _relevance?: Prisma.CheckListItemOrderByRelevanceInput +} + +export type CheckListItemWhereUniqueInput = Prisma.AtLeast<{ + id?: number + AND?: Prisma.CheckListItemWhereInput | Prisma.CheckListItemWhereInput[] + OR?: Prisma.CheckListItemWhereInput[] + NOT?: Prisma.CheckListItemWhereInput | Prisma.CheckListItemWhereInput[] + listId?: Prisma.IntFilter<"CheckListItem"> | number + title?: Prisma.StringFilter<"CheckListItem"> | string + note?: Prisma.StringFilter<"CheckListItem"> | string + done?: Prisma.BoolFilter<"CheckListItem"> | boolean + doneAt?: Prisma.DateTimeNullableFilter<"CheckListItem"> | Date | string | null + sortOrder?: Prisma.IntFilter<"CheckListItem"> | number + createdAt?: Prisma.DateTimeFilter<"CheckListItem"> | Date | string + updatedAt?: Prisma.DateTimeFilter<"CheckListItem"> | Date | string + list?: Prisma.XOR +}, "id"> + +export type CheckListItemOrderByWithAggregationInput = { + id?: Prisma.SortOrder + listId?: Prisma.SortOrder + title?: Prisma.SortOrder + note?: Prisma.SortOrder + done?: Prisma.SortOrder + doneAt?: Prisma.SortOrderInput | Prisma.SortOrder + sortOrder?: Prisma.SortOrder + createdAt?: Prisma.SortOrder + updatedAt?: Prisma.SortOrder + _count?: Prisma.CheckListItemCountOrderByAggregateInput + _avg?: Prisma.CheckListItemAvgOrderByAggregateInput + _max?: Prisma.CheckListItemMaxOrderByAggregateInput + _min?: Prisma.CheckListItemMinOrderByAggregateInput + _sum?: Prisma.CheckListItemSumOrderByAggregateInput +} + +export type CheckListItemScalarWhereWithAggregatesInput = { + AND?: Prisma.CheckListItemScalarWhereWithAggregatesInput | Prisma.CheckListItemScalarWhereWithAggregatesInput[] + OR?: Prisma.CheckListItemScalarWhereWithAggregatesInput[] + NOT?: Prisma.CheckListItemScalarWhereWithAggregatesInput | Prisma.CheckListItemScalarWhereWithAggregatesInput[] + id?: Prisma.IntWithAggregatesFilter<"CheckListItem"> | number + listId?: Prisma.IntWithAggregatesFilter<"CheckListItem"> | number + title?: Prisma.StringWithAggregatesFilter<"CheckListItem"> | string + note?: Prisma.StringWithAggregatesFilter<"CheckListItem"> | string + done?: Prisma.BoolWithAggregatesFilter<"CheckListItem"> | boolean + doneAt?: Prisma.DateTimeNullableWithAggregatesFilter<"CheckListItem"> | Date | string | null + sortOrder?: Prisma.IntWithAggregatesFilter<"CheckListItem"> | number + createdAt?: Prisma.DateTimeWithAggregatesFilter<"CheckListItem"> | Date | string + updatedAt?: Prisma.DateTimeWithAggregatesFilter<"CheckListItem"> | Date | string +} + +export type CheckListItemCreateInput = { + title: string + note?: string + done?: boolean + doneAt?: Date | string | null + sortOrder?: number + createdAt?: Date | string + updatedAt?: Date | string + list: Prisma.CheckListCreateNestedOneWithoutItemsInput +} + +export type CheckListItemUncheckedCreateInput = { + id?: number + listId: number + title: string + note?: string + done?: boolean + doneAt?: Date | string | null + sortOrder?: number + createdAt?: Date | string + updatedAt?: Date | string +} + +export type CheckListItemUpdateInput = { + title?: Prisma.StringFieldUpdateOperationsInput | string + note?: Prisma.StringFieldUpdateOperationsInput | string + done?: Prisma.BoolFieldUpdateOperationsInput | boolean + doneAt?: Prisma.NullableDateTimeFieldUpdateOperationsInput | Date | string | null + sortOrder?: Prisma.IntFieldUpdateOperationsInput | number + createdAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string + updatedAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string + list?: Prisma.CheckListUpdateOneRequiredWithoutItemsNestedInput +} + +export type CheckListItemUncheckedUpdateInput = { + id?: Prisma.IntFieldUpdateOperationsInput | number + listId?: Prisma.IntFieldUpdateOperationsInput | number + title?: Prisma.StringFieldUpdateOperationsInput | string + note?: Prisma.StringFieldUpdateOperationsInput | string + done?: Prisma.BoolFieldUpdateOperationsInput | boolean + doneAt?: Prisma.NullableDateTimeFieldUpdateOperationsInput | Date | string | null + sortOrder?: Prisma.IntFieldUpdateOperationsInput | number + createdAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string + updatedAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string +} + +export type CheckListItemCreateManyInput = { + id?: number + listId: number + title: string + note?: string + done?: boolean + doneAt?: Date | string | null + sortOrder?: number + createdAt?: Date | string + updatedAt?: Date | string +} + +export type CheckListItemUpdateManyMutationInput = { + title?: Prisma.StringFieldUpdateOperationsInput | string + note?: Prisma.StringFieldUpdateOperationsInput | string + done?: Prisma.BoolFieldUpdateOperationsInput | boolean + doneAt?: Prisma.NullableDateTimeFieldUpdateOperationsInput | Date | string | null + sortOrder?: Prisma.IntFieldUpdateOperationsInput | number + createdAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string + updatedAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string +} + +export type CheckListItemUncheckedUpdateManyInput = { + id?: Prisma.IntFieldUpdateOperationsInput | number + listId?: Prisma.IntFieldUpdateOperationsInput | number + title?: Prisma.StringFieldUpdateOperationsInput | string + note?: Prisma.StringFieldUpdateOperationsInput | string + done?: Prisma.BoolFieldUpdateOperationsInput | boolean + doneAt?: Prisma.NullableDateTimeFieldUpdateOperationsInput | Date | string | null + sortOrder?: Prisma.IntFieldUpdateOperationsInput | number + createdAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string + updatedAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string +} + +export type CheckListItemListRelationFilter = { + every?: Prisma.CheckListItemWhereInput + some?: Prisma.CheckListItemWhereInput + none?: Prisma.CheckListItemWhereInput +} + +export type CheckListItemOrderByRelationAggregateInput = { + _count?: Prisma.SortOrder +} + +export type CheckListItemOrderByRelevanceInput = { + fields: Prisma.CheckListItemOrderByRelevanceFieldEnum | Prisma.CheckListItemOrderByRelevanceFieldEnum[] + sort: Prisma.SortOrder + search: string +} + +export type CheckListItemCountOrderByAggregateInput = { + id?: Prisma.SortOrder + listId?: Prisma.SortOrder + title?: Prisma.SortOrder + note?: Prisma.SortOrder + done?: Prisma.SortOrder + doneAt?: Prisma.SortOrder + sortOrder?: Prisma.SortOrder + createdAt?: Prisma.SortOrder + updatedAt?: Prisma.SortOrder +} + +export type CheckListItemAvgOrderByAggregateInput = { + id?: Prisma.SortOrder + listId?: Prisma.SortOrder + sortOrder?: Prisma.SortOrder +} + +export type CheckListItemMaxOrderByAggregateInput = { + id?: Prisma.SortOrder + listId?: Prisma.SortOrder + title?: Prisma.SortOrder + note?: Prisma.SortOrder + done?: Prisma.SortOrder + doneAt?: Prisma.SortOrder + sortOrder?: Prisma.SortOrder + createdAt?: Prisma.SortOrder + updatedAt?: Prisma.SortOrder +} + +export type CheckListItemMinOrderByAggregateInput = { + id?: Prisma.SortOrder + listId?: Prisma.SortOrder + title?: Prisma.SortOrder + note?: Prisma.SortOrder + done?: Prisma.SortOrder + doneAt?: Prisma.SortOrder + sortOrder?: Prisma.SortOrder + createdAt?: Prisma.SortOrder + updatedAt?: Prisma.SortOrder +} + +export type CheckListItemSumOrderByAggregateInput = { + id?: Prisma.SortOrder + listId?: Prisma.SortOrder + sortOrder?: Prisma.SortOrder +} + +export type CheckListItemCreateNestedManyWithoutListInput = { + create?: Prisma.XOR | Prisma.CheckListItemCreateWithoutListInput[] | Prisma.CheckListItemUncheckedCreateWithoutListInput[] + connectOrCreate?: Prisma.CheckListItemCreateOrConnectWithoutListInput | Prisma.CheckListItemCreateOrConnectWithoutListInput[] + createMany?: Prisma.CheckListItemCreateManyListInputEnvelope + connect?: Prisma.CheckListItemWhereUniqueInput | Prisma.CheckListItemWhereUniqueInput[] +} + +export type CheckListItemUncheckedCreateNestedManyWithoutListInput = { + create?: Prisma.XOR | Prisma.CheckListItemCreateWithoutListInput[] | Prisma.CheckListItemUncheckedCreateWithoutListInput[] + connectOrCreate?: Prisma.CheckListItemCreateOrConnectWithoutListInput | Prisma.CheckListItemCreateOrConnectWithoutListInput[] + createMany?: Prisma.CheckListItemCreateManyListInputEnvelope + connect?: Prisma.CheckListItemWhereUniqueInput | Prisma.CheckListItemWhereUniqueInput[] +} + +export type CheckListItemUpdateManyWithoutListNestedInput = { + create?: Prisma.XOR | Prisma.CheckListItemCreateWithoutListInput[] | Prisma.CheckListItemUncheckedCreateWithoutListInput[] + connectOrCreate?: Prisma.CheckListItemCreateOrConnectWithoutListInput | Prisma.CheckListItemCreateOrConnectWithoutListInput[] + upsert?: Prisma.CheckListItemUpsertWithWhereUniqueWithoutListInput | Prisma.CheckListItemUpsertWithWhereUniqueWithoutListInput[] + createMany?: Prisma.CheckListItemCreateManyListInputEnvelope + set?: Prisma.CheckListItemWhereUniqueInput | Prisma.CheckListItemWhereUniqueInput[] + disconnect?: Prisma.CheckListItemWhereUniqueInput | Prisma.CheckListItemWhereUniqueInput[] + delete?: Prisma.CheckListItemWhereUniqueInput | Prisma.CheckListItemWhereUniqueInput[] + connect?: Prisma.CheckListItemWhereUniqueInput | Prisma.CheckListItemWhereUniqueInput[] + update?: Prisma.CheckListItemUpdateWithWhereUniqueWithoutListInput | Prisma.CheckListItemUpdateWithWhereUniqueWithoutListInput[] + updateMany?: Prisma.CheckListItemUpdateManyWithWhereWithoutListInput | Prisma.CheckListItemUpdateManyWithWhereWithoutListInput[] + deleteMany?: Prisma.CheckListItemScalarWhereInput | Prisma.CheckListItemScalarWhereInput[] +} + +export type CheckListItemUncheckedUpdateManyWithoutListNestedInput = { + create?: Prisma.XOR | Prisma.CheckListItemCreateWithoutListInput[] | Prisma.CheckListItemUncheckedCreateWithoutListInput[] + connectOrCreate?: Prisma.CheckListItemCreateOrConnectWithoutListInput | Prisma.CheckListItemCreateOrConnectWithoutListInput[] + upsert?: Prisma.CheckListItemUpsertWithWhereUniqueWithoutListInput | Prisma.CheckListItemUpsertWithWhereUniqueWithoutListInput[] + createMany?: Prisma.CheckListItemCreateManyListInputEnvelope + set?: Prisma.CheckListItemWhereUniqueInput | Prisma.CheckListItemWhereUniqueInput[] + disconnect?: Prisma.CheckListItemWhereUniqueInput | Prisma.CheckListItemWhereUniqueInput[] + delete?: Prisma.CheckListItemWhereUniqueInput | Prisma.CheckListItemWhereUniqueInput[] + connect?: Prisma.CheckListItemWhereUniqueInput | Prisma.CheckListItemWhereUniqueInput[] + update?: Prisma.CheckListItemUpdateWithWhereUniqueWithoutListInput | Prisma.CheckListItemUpdateWithWhereUniqueWithoutListInput[] + updateMany?: Prisma.CheckListItemUpdateManyWithWhereWithoutListInput | Prisma.CheckListItemUpdateManyWithWhereWithoutListInput[] + deleteMany?: Prisma.CheckListItemScalarWhereInput | Prisma.CheckListItemScalarWhereInput[] +} + +export type CheckListItemCreateWithoutListInput = { + title: string + note?: string + done?: boolean + doneAt?: Date | string | null + sortOrder?: number + createdAt?: Date | string + updatedAt?: Date | string +} + +export type CheckListItemUncheckedCreateWithoutListInput = { + id?: number + title: string + note?: string + done?: boolean + doneAt?: Date | string | null + sortOrder?: number + createdAt?: Date | string + updatedAt?: Date | string +} + +export type CheckListItemCreateOrConnectWithoutListInput = { + where: Prisma.CheckListItemWhereUniqueInput + create: Prisma.XOR +} + +export type CheckListItemCreateManyListInputEnvelope = { + data: Prisma.CheckListItemCreateManyListInput | Prisma.CheckListItemCreateManyListInput[] + skipDuplicates?: boolean +} + +export type CheckListItemUpsertWithWhereUniqueWithoutListInput = { + where: Prisma.CheckListItemWhereUniqueInput + update: Prisma.XOR + create: Prisma.XOR +} + +export type CheckListItemUpdateWithWhereUniqueWithoutListInput = { + where: Prisma.CheckListItemWhereUniqueInput + data: Prisma.XOR +} + +export type CheckListItemUpdateManyWithWhereWithoutListInput = { + where: Prisma.CheckListItemScalarWhereInput + data: Prisma.XOR +} + +export type CheckListItemScalarWhereInput = { + AND?: Prisma.CheckListItemScalarWhereInput | Prisma.CheckListItemScalarWhereInput[] + OR?: Prisma.CheckListItemScalarWhereInput[] + NOT?: Prisma.CheckListItemScalarWhereInput | Prisma.CheckListItemScalarWhereInput[] + id?: Prisma.IntFilter<"CheckListItem"> | number + listId?: Prisma.IntFilter<"CheckListItem"> | number + title?: Prisma.StringFilter<"CheckListItem"> | string + note?: Prisma.StringFilter<"CheckListItem"> | string + done?: Prisma.BoolFilter<"CheckListItem"> | boolean + doneAt?: Prisma.DateTimeNullableFilter<"CheckListItem"> | Date | string | null + sortOrder?: Prisma.IntFilter<"CheckListItem"> | number + createdAt?: Prisma.DateTimeFilter<"CheckListItem"> | Date | string + updatedAt?: Prisma.DateTimeFilter<"CheckListItem"> | Date | string +} + +export type CheckListItemCreateManyListInput = { + id?: number + title: string + note?: string + done?: boolean + doneAt?: Date | string | null + sortOrder?: number + createdAt?: Date | string + updatedAt?: Date | string +} + +export type CheckListItemUpdateWithoutListInput = { + title?: Prisma.StringFieldUpdateOperationsInput | string + note?: Prisma.StringFieldUpdateOperationsInput | string + done?: Prisma.BoolFieldUpdateOperationsInput | boolean + doneAt?: Prisma.NullableDateTimeFieldUpdateOperationsInput | Date | string | null + sortOrder?: Prisma.IntFieldUpdateOperationsInput | number + createdAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string + updatedAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string +} + +export type CheckListItemUncheckedUpdateWithoutListInput = { + id?: Prisma.IntFieldUpdateOperationsInput | number + title?: Prisma.StringFieldUpdateOperationsInput | string + note?: Prisma.StringFieldUpdateOperationsInput | string + done?: Prisma.BoolFieldUpdateOperationsInput | boolean + doneAt?: Prisma.NullableDateTimeFieldUpdateOperationsInput | Date | string | null + sortOrder?: Prisma.IntFieldUpdateOperationsInput | number + createdAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string + updatedAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string +} + +export type CheckListItemUncheckedUpdateManyWithoutListInput = { + id?: Prisma.IntFieldUpdateOperationsInput | number + title?: Prisma.StringFieldUpdateOperationsInput | string + note?: Prisma.StringFieldUpdateOperationsInput | string + done?: Prisma.BoolFieldUpdateOperationsInput | boolean + doneAt?: Prisma.NullableDateTimeFieldUpdateOperationsInput | Date | string | null + sortOrder?: Prisma.IntFieldUpdateOperationsInput | number + createdAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string + updatedAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string +} + + + +export type CheckListItemSelect = runtime.Types.Extensions.GetSelect<{ + id?: boolean + listId?: boolean + title?: boolean + note?: boolean + done?: boolean + doneAt?: boolean + sortOrder?: boolean + createdAt?: boolean + updatedAt?: boolean + list?: boolean | Prisma.CheckListDefaultArgs +}, ExtArgs["result"]["checkListItem"]> + + + +export type CheckListItemSelectScalar = { + id?: boolean + listId?: boolean + title?: boolean + note?: boolean + done?: boolean + doneAt?: boolean + sortOrder?: boolean + createdAt?: boolean + updatedAt?: boolean +} + +export type CheckListItemOmit = runtime.Types.Extensions.GetOmit<"id" | "listId" | "title" | "note" | "done" | "doneAt" | "sortOrder" | "createdAt" | "updatedAt", ExtArgs["result"]["checkListItem"]> +export type CheckListItemInclude = { + list?: boolean | Prisma.CheckListDefaultArgs +} + +export type $CheckListItemPayload = { + name: "CheckListItem" + objects: { + list: Prisma.$CheckListPayload + } + scalars: runtime.Types.Extensions.GetPayloadResult<{ + id: number + listId: number + title: string + note: string + done: boolean + doneAt: Date | null + sortOrder: number + createdAt: Date + updatedAt: Date + }, ExtArgs["result"]["checkListItem"]> + composites: {} +} + +export type CheckListItemGetPayload = runtime.Types.Result.GetResult + +export type CheckListItemCountArgs = + Omit & { + select?: CheckListItemCountAggregateInputType | true + } + +export interface CheckListItemDelegate { + [K: symbol]: { types: Prisma.TypeMap['model']['CheckListItem'], meta: { name: 'CheckListItem' } } + /** + * Find zero or one CheckListItem that matches the filter. + * @param {CheckListItemFindUniqueArgs} args - Arguments to find a CheckListItem + * @example + * // Get one CheckListItem + * const checkListItem = await prisma.checkListItem.findUnique({ + * where: { + * // ... provide filter here + * } + * }) + */ + findUnique(args: Prisma.SelectSubset>): Prisma.Prisma__CheckListItemClient, T, "findUnique", GlobalOmitOptions> | null, null, ExtArgs, GlobalOmitOptions> + + /** + * Find one CheckListItem that matches the filter or throw an error with `error.code='P2025'` + * if no matches were found. + * @param {CheckListItemFindUniqueOrThrowArgs} args - Arguments to find a CheckListItem + * @example + * // Get one CheckListItem + * const checkListItem = await prisma.checkListItem.findUniqueOrThrow({ + * where: { + * // ... provide filter here + * } + * }) + */ + findUniqueOrThrow(args: Prisma.SelectSubset>): Prisma.Prisma__CheckListItemClient, T, "findUniqueOrThrow", GlobalOmitOptions>, never, ExtArgs, GlobalOmitOptions> + + /** + * Find the first CheckListItem that matches the filter. + * Note, that providing `undefined` is treated as the value not being there. + * Read more here: https://pris.ly/d/null-undefined + * @param {CheckListItemFindFirstArgs} args - Arguments to find a CheckListItem + * @example + * // Get one CheckListItem + * const checkListItem = await prisma.checkListItem.findFirst({ + * where: { + * // ... provide filter here + * } + * }) + */ + findFirst(args?: Prisma.SelectSubset>): Prisma.Prisma__CheckListItemClient, T, "findFirst", GlobalOmitOptions> | null, null, ExtArgs, GlobalOmitOptions> + + /** + * Find the first CheckListItem that matches the filter or + * throw `PrismaKnownClientError` with `P2025` code if no matches were found. + * Note, that providing `undefined` is treated as the value not being there. + * Read more here: https://pris.ly/d/null-undefined + * @param {CheckListItemFindFirstOrThrowArgs} args - Arguments to find a CheckListItem + * @example + * // Get one CheckListItem + * const checkListItem = await prisma.checkListItem.findFirstOrThrow({ + * where: { + * // ... provide filter here + * } + * }) + */ + findFirstOrThrow(args?: Prisma.SelectSubset>): Prisma.Prisma__CheckListItemClient, T, "findFirstOrThrow", GlobalOmitOptions>, never, ExtArgs, GlobalOmitOptions> + + /** + * Find zero or more CheckListItems that matches the filter. + * Note, that providing `undefined` is treated as the value not being there. + * Read more here: https://pris.ly/d/null-undefined + * @param {CheckListItemFindManyArgs} args - Arguments to filter and select certain fields only. + * @example + * // Get all CheckListItems + * const checkListItems = await prisma.checkListItem.findMany() + * + * // Get first 10 CheckListItems + * const checkListItems = await prisma.checkListItem.findMany({ take: 10 }) + * + * // Only select the `id` + * const checkListItemWithIdOnly = await prisma.checkListItem.findMany({ select: { id: true } }) + * + */ + findMany(args?: Prisma.SelectSubset>): Prisma.PrismaPromise, T, "findMany", GlobalOmitOptions>> + + /** + * Create a CheckListItem. + * @param {CheckListItemCreateArgs} args - Arguments to create a CheckListItem. + * @example + * // Create one CheckListItem + * const CheckListItem = await prisma.checkListItem.create({ + * data: { + * // ... data to create a CheckListItem + * } + * }) + * + */ + create(args: Prisma.SelectSubset>): Prisma.Prisma__CheckListItemClient, T, "create", GlobalOmitOptions>, never, ExtArgs, GlobalOmitOptions> + + /** + * Create many CheckListItems. + * @param {CheckListItemCreateManyArgs} args - Arguments to create many CheckListItems. + * @example + * // Create many CheckListItems + * const checkListItem = await prisma.checkListItem.createMany({ + * data: [ + * // ... provide data here + * ] + * }) + * + */ + createMany(args?: Prisma.SelectSubset>): Prisma.PrismaPromise + + /** + * Delete a CheckListItem. + * @param {CheckListItemDeleteArgs} args - Arguments to delete one CheckListItem. + * @example + * // Delete one CheckListItem + * const CheckListItem = await prisma.checkListItem.delete({ + * where: { + * // ... filter to delete one CheckListItem + * } + * }) + * + */ + delete(args: Prisma.SelectSubset>): Prisma.Prisma__CheckListItemClient, T, "delete", GlobalOmitOptions>, never, ExtArgs, GlobalOmitOptions> + + /** + * Update one CheckListItem. + * @param {CheckListItemUpdateArgs} args - Arguments to update one CheckListItem. + * @example + * // Update one CheckListItem + * const checkListItem = await prisma.checkListItem.update({ + * where: { + * // ... provide filter here + * }, + * data: { + * // ... provide data here + * } + * }) + * + */ + update(args: Prisma.SelectSubset>): Prisma.Prisma__CheckListItemClient, T, "update", GlobalOmitOptions>, never, ExtArgs, GlobalOmitOptions> + + /** + * Delete zero or more CheckListItems. + * @param {CheckListItemDeleteManyArgs} args - Arguments to filter CheckListItems to delete. + * @example + * // Delete a few CheckListItems + * const { count } = await prisma.checkListItem.deleteMany({ + * where: { + * // ... provide filter here + * } + * }) + * + */ + deleteMany(args?: Prisma.SelectSubset>): Prisma.PrismaPromise + + /** + * Update zero or more CheckListItems. + * Note, that providing `undefined` is treated as the value not being there. + * Read more here: https://pris.ly/d/null-undefined + * @param {CheckListItemUpdateManyArgs} args - Arguments to update one or more rows. + * @example + * // Update many CheckListItems + * const checkListItem = await prisma.checkListItem.updateMany({ + * where: { + * // ... provide filter here + * }, + * data: { + * // ... provide data here + * } + * }) + * + */ + updateMany(args: Prisma.SelectSubset>): Prisma.PrismaPromise + + /** + * Create or update one CheckListItem. + * @param {CheckListItemUpsertArgs} args - Arguments to update or create a CheckListItem. + * @example + * // Update or create a CheckListItem + * const checkListItem = await prisma.checkListItem.upsert({ + * create: { + * // ... data to create a CheckListItem + * }, + * update: { + * // ... in case it already exists, update + * }, + * where: { + * // ... the filter for the CheckListItem we want to update + * } + * }) + */ + upsert(args: Prisma.SelectSubset>): Prisma.Prisma__CheckListItemClient, T, "upsert", GlobalOmitOptions>, never, ExtArgs, GlobalOmitOptions> + + + /** + * Count the number of CheckListItems. + * Note, that providing `undefined` is treated as the value not being there. + * Read more here: https://pris.ly/d/null-undefined + * @param {CheckListItemCountArgs} args - Arguments to filter CheckListItems to count. + * @example + * // Count the number of CheckListItems + * const count = await prisma.checkListItem.count({ + * where: { + * // ... the filter for the CheckListItems we want to count + * } + * }) + **/ + count( + args?: Prisma.Subset, + ): Prisma.PrismaPromise< + T extends runtime.Types.Utils.Record<'select', any> + ? T['select'] extends true + ? number + : Prisma.GetScalarType + : number + > + + /** + * Allows you to perform aggregations operations on a CheckListItem. + * Note, that providing `undefined` is treated as the value not being there. + * Read more here: https://pris.ly/d/null-undefined + * @param {CheckListItemAggregateArgs} args - Select which aggregations you would like to apply and on what fields. + * @example + * // Ordered by age ascending + * // Where email contains prisma.io + * // Limited to the 10 users + * const aggregations = await prisma.user.aggregate({ + * _avg: { + * age: true, + * }, + * where: { + * email: { + * contains: "prisma.io", + * }, + * }, + * orderBy: { + * age: "asc", + * }, + * take: 10, + * }) + **/ + aggregate(args: Prisma.Subset): Prisma.PrismaPromise> + + /** + * Group by CheckListItem. + * Note, that providing `undefined` is treated as the value not being there. + * Read more here: https://pris.ly/d/null-undefined + * @param {CheckListItemGroupByArgs} args - Group by arguments. + * @example + * // Group by city, order by createdAt, get count + * const result = await prisma.user.groupBy({ + * by: ['city', 'createdAt'], + * orderBy: { + * createdAt: true + * }, + * _count: { + * _all: true + * }, + * }) + * + **/ + groupBy< + T extends CheckListItemGroupByArgs, + HasSelectOrTake extends Prisma.Or< + Prisma.Extends<'skip', Prisma.Keys>, + Prisma.Extends<'take', Prisma.Keys> + >, + OrderByArg extends Prisma.True extends HasSelectOrTake + ? { orderBy: CheckListItemGroupByArgs['orderBy'] } + : { orderBy?: CheckListItemGroupByArgs['orderBy'] }, + OrderFields extends Prisma.ExcludeUnderscoreKeys>>, + ByFields extends Prisma.MaybeTupleToUnion, + ByValid extends Prisma.Has, + HavingFields extends Prisma.GetHavingFields, + HavingValid extends Prisma.Has, + ByEmpty extends T['by'] extends never[] ? Prisma.True : Prisma.False, + InputErrors extends ByEmpty extends Prisma.True + ? `Error: "by" must not be empty.` + : HavingValid extends Prisma.False + ? { + [P in HavingFields]: P extends ByFields + ? never + : P extends string + ? `Error: Field "${P}" used in "having" needs to be provided in "by".` + : [ + Error, + 'Field ', + P, + ` in "having" needs to be provided in "by"`, + ] + }[HavingFields] + : 'take' extends Prisma.Keys + ? 'orderBy' extends Prisma.Keys + ? ByValid extends Prisma.True + ? {} + : { + [P in OrderFields]: P extends ByFields + ? never + : `Error: Field "${P}" in "orderBy" needs to be provided in "by"` + }[OrderFields] + : 'Error: If you provide "take", you also need to provide "orderBy"' + : 'skip' extends Prisma.Keys + ? 'orderBy' extends Prisma.Keys + ? ByValid extends Prisma.True + ? {} + : { + [P in OrderFields]: P extends ByFields + ? never + : `Error: Field "${P}" in "orderBy" needs to be provided in "by"` + }[OrderFields] + : 'Error: If you provide "skip", you also need to provide "orderBy"' + : ByValid extends Prisma.True + ? {} + : { + [P in OrderFields]: P extends ByFields + ? never + : `Error: Field "${P}" in "orderBy" needs to be provided in "by"` + }[OrderFields] + >(args: Prisma.SubsetIntersection & InputErrors): {} extends InputErrors ? GetCheckListItemGroupByPayload : Prisma.PrismaPromise +/** + * Fields of the CheckListItem model + */ +readonly fields: CheckListItemFieldRefs; +} + +/** + * The delegate class that acts as a "Promise-like" for CheckListItem. + * Why is this prefixed with `Prisma__`? + * Because we want to prevent naming conflicts as mentioned in + * https://github.com/prisma/prisma-client-js/issues/707 + */ +export interface Prisma__CheckListItemClient extends Prisma.PrismaPromise { + readonly [Symbol.toStringTag]: "PrismaPromise" + list = {}>(args?: Prisma.Subset>): Prisma.Prisma__CheckListClient, T, "findUniqueOrThrow", GlobalOmitOptions> | Null, Null, ExtArgs, GlobalOmitOptions> + /** + * Attaches callbacks for the resolution and/or rejection of the Promise. + * @param onfulfilled The callback to execute when the Promise is resolved. + * @param onrejected The callback to execute when the Promise is rejected. + * @returns A Promise for the completion of which ever callback is executed. + */ + then(onfulfilled?: ((value: T) => TResult1 | PromiseLike) | undefined | null, onrejected?: ((reason: any) => TResult2 | PromiseLike) | undefined | null): runtime.Types.Utils.JsPromise + /** + * Attaches a callback for only the rejection of the Promise. + * @param onrejected The callback to execute when the Promise is rejected. + * @returns A Promise for the completion of the callback. + */ + catch(onrejected?: ((reason: any) => TResult | PromiseLike) | undefined | null): runtime.Types.Utils.JsPromise + /** + * Attaches a callback that is invoked when the Promise is settled (fulfilled or rejected). The + * resolved value cannot be modified from the callback. + * @param onfinally The callback to execute when the Promise is settled (fulfilled or rejected). + * @returns A Promise for the completion of the callback. + */ + finally(onfinally?: (() => void) | undefined | null): runtime.Types.Utils.JsPromise +} + + + + +/** + * Fields of the CheckListItem model + */ +export interface CheckListItemFieldRefs { + readonly id: Prisma.FieldRef<"CheckListItem", 'Int'> + readonly listId: Prisma.FieldRef<"CheckListItem", 'Int'> + readonly title: Prisma.FieldRef<"CheckListItem", 'String'> + readonly note: Prisma.FieldRef<"CheckListItem", 'String'> + readonly done: Prisma.FieldRef<"CheckListItem", 'Boolean'> + readonly doneAt: Prisma.FieldRef<"CheckListItem", 'DateTime'> + readonly sortOrder: Prisma.FieldRef<"CheckListItem", 'Int'> + readonly createdAt: Prisma.FieldRef<"CheckListItem", 'DateTime'> + readonly updatedAt: Prisma.FieldRef<"CheckListItem", 'DateTime'> +} + + +// Custom InputTypes +/** + * CheckListItem findUnique + */ +export type CheckListItemFindUniqueArgs = { + /** + * Select specific fields to fetch from the CheckListItem + */ + select?: Prisma.CheckListItemSelect | null + /** + * Omit specific fields from the CheckListItem + */ + omit?: Prisma.CheckListItemOmit | null + /** + * Choose, which related nodes to fetch as well + */ + include?: Prisma.CheckListItemInclude | null + /** + * Filter, which CheckListItem to fetch. + */ + where: Prisma.CheckListItemWhereUniqueInput +} + +/** + * CheckListItem findUniqueOrThrow + */ +export type CheckListItemFindUniqueOrThrowArgs = { + /** + * Select specific fields to fetch from the CheckListItem + */ + select?: Prisma.CheckListItemSelect | null + /** + * Omit specific fields from the CheckListItem + */ + omit?: Prisma.CheckListItemOmit | null + /** + * Choose, which related nodes to fetch as well + */ + include?: Prisma.CheckListItemInclude | null + /** + * Filter, which CheckListItem to fetch. + */ + where: Prisma.CheckListItemWhereUniqueInput +} + +/** + * CheckListItem findFirst + */ +export type CheckListItemFindFirstArgs = { + /** + * Select specific fields to fetch from the CheckListItem + */ + select?: Prisma.CheckListItemSelect | null + /** + * Omit specific fields from the CheckListItem + */ + omit?: Prisma.CheckListItemOmit | null + /** + * Choose, which related nodes to fetch as well + */ + include?: Prisma.CheckListItemInclude | null + /** + * Filter, which CheckListItem to fetch. + */ + where?: Prisma.CheckListItemWhereInput + /** + * {@link https://www.prisma.io/docs/concepts/components/prisma-client/sorting Sorting Docs} + * + * Determine the order of CheckListItems to fetch. + */ + orderBy?: Prisma.CheckListItemOrderByWithRelationInput | Prisma.CheckListItemOrderByWithRelationInput[] + /** + * {@link https://www.prisma.io/docs/concepts/components/prisma-client/pagination#cursor-based-pagination Cursor Docs} + * + * Sets the position for searching for CheckListItems. + */ + cursor?: Prisma.CheckListItemWhereUniqueInput + /** + * {@link https://www.prisma.io/docs/concepts/components/prisma-client/pagination Pagination Docs} + * + * Take `±n` CheckListItems from the position of the cursor. + */ + take?: number + /** + * {@link https://www.prisma.io/docs/concepts/components/prisma-client/pagination Pagination Docs} + * + * Skip the first `n` CheckListItems. + */ + skip?: number + /** + * {@link https://www.prisma.io/docs/concepts/components/prisma-client/distinct Distinct Docs} + * + * Filter by unique combinations of CheckListItems. + */ + distinct?: Prisma.CheckListItemScalarFieldEnum | Prisma.CheckListItemScalarFieldEnum[] +} + +/** + * CheckListItem findFirstOrThrow + */ +export type CheckListItemFindFirstOrThrowArgs = { + /** + * Select specific fields to fetch from the CheckListItem + */ + select?: Prisma.CheckListItemSelect | null + /** + * Omit specific fields from the CheckListItem + */ + omit?: Prisma.CheckListItemOmit | null + /** + * Choose, which related nodes to fetch as well + */ + include?: Prisma.CheckListItemInclude | null + /** + * Filter, which CheckListItem to fetch. + */ + where?: Prisma.CheckListItemWhereInput + /** + * {@link https://www.prisma.io/docs/concepts/components/prisma-client/sorting Sorting Docs} + * + * Determine the order of CheckListItems to fetch. + */ + orderBy?: Prisma.CheckListItemOrderByWithRelationInput | Prisma.CheckListItemOrderByWithRelationInput[] + /** + * {@link https://www.prisma.io/docs/concepts/components/prisma-client/pagination#cursor-based-pagination Cursor Docs} + * + * Sets the position for searching for CheckListItems. + */ + cursor?: Prisma.CheckListItemWhereUniqueInput + /** + * {@link https://www.prisma.io/docs/concepts/components/prisma-client/pagination Pagination Docs} + * + * Take `±n` CheckListItems from the position of the cursor. + */ + take?: number + /** + * {@link https://www.prisma.io/docs/concepts/components/prisma-client/pagination Pagination Docs} + * + * Skip the first `n` CheckListItems. + */ + skip?: number + /** + * {@link https://www.prisma.io/docs/concepts/components/prisma-client/distinct Distinct Docs} + * + * Filter by unique combinations of CheckListItems. + */ + distinct?: Prisma.CheckListItemScalarFieldEnum | Prisma.CheckListItemScalarFieldEnum[] +} + +/** + * CheckListItem findMany + */ +export type CheckListItemFindManyArgs = { + /** + * Select specific fields to fetch from the CheckListItem + */ + select?: Prisma.CheckListItemSelect | null + /** + * Omit specific fields from the CheckListItem + */ + omit?: Prisma.CheckListItemOmit | null + /** + * Choose, which related nodes to fetch as well + */ + include?: Prisma.CheckListItemInclude | null + /** + * Filter, which CheckListItems to fetch. + */ + where?: Prisma.CheckListItemWhereInput + /** + * {@link https://www.prisma.io/docs/concepts/components/prisma-client/sorting Sorting Docs} + * + * Determine the order of CheckListItems to fetch. + */ + orderBy?: Prisma.CheckListItemOrderByWithRelationInput | Prisma.CheckListItemOrderByWithRelationInput[] + /** + * {@link https://www.prisma.io/docs/concepts/components/prisma-client/pagination#cursor-based-pagination Cursor Docs} + * + * Sets the position for listing CheckListItems. + */ + cursor?: Prisma.CheckListItemWhereUniqueInput + /** + * {@link https://www.prisma.io/docs/concepts/components/prisma-client/pagination Pagination Docs} + * + * Take `±n` CheckListItems from the position of the cursor. + */ + take?: number + /** + * {@link https://www.prisma.io/docs/concepts/components/prisma-client/pagination Pagination Docs} + * + * Skip the first `n` CheckListItems. + */ + skip?: number + /** + * {@link https://www.prisma.io/docs/concepts/components/prisma-client/distinct Distinct Docs} + * + * Filter by unique combinations of CheckListItems. + */ + distinct?: Prisma.CheckListItemScalarFieldEnum | Prisma.CheckListItemScalarFieldEnum[] +} + +/** + * CheckListItem create + */ +export type CheckListItemCreateArgs = { + /** + * Select specific fields to fetch from the CheckListItem + */ + select?: Prisma.CheckListItemSelect | null + /** + * Omit specific fields from the CheckListItem + */ + omit?: Prisma.CheckListItemOmit | null + /** + * Choose, which related nodes to fetch as well + */ + include?: Prisma.CheckListItemInclude | null + /** + * The data needed to create a CheckListItem. + */ + data: Prisma.XOR +} + +/** + * CheckListItem createMany + */ +export type CheckListItemCreateManyArgs = { + /** + * The data used to create many CheckListItems. + */ + data: Prisma.CheckListItemCreateManyInput | Prisma.CheckListItemCreateManyInput[] + skipDuplicates?: boolean +} + +/** + * CheckListItem update + */ +export type CheckListItemUpdateArgs = { + /** + * Select specific fields to fetch from the CheckListItem + */ + select?: Prisma.CheckListItemSelect | null + /** + * Omit specific fields from the CheckListItem + */ + omit?: Prisma.CheckListItemOmit | null + /** + * Choose, which related nodes to fetch as well + */ + include?: Prisma.CheckListItemInclude | null + /** + * The data needed to update a CheckListItem. + */ + data: Prisma.XOR + /** + * Choose, which CheckListItem to update. + */ + where: Prisma.CheckListItemWhereUniqueInput +} + +/** + * CheckListItem updateMany + */ +export type CheckListItemUpdateManyArgs = { + /** + * The data used to update CheckListItems. + */ + data: Prisma.XOR + /** + * Filter which CheckListItems to update + */ + where?: Prisma.CheckListItemWhereInput + /** + * Limit how many CheckListItems to update. + */ + limit?: number +} + +/** + * CheckListItem upsert + */ +export type CheckListItemUpsertArgs = { + /** + * Select specific fields to fetch from the CheckListItem + */ + select?: Prisma.CheckListItemSelect | null + /** + * Omit specific fields from the CheckListItem + */ + omit?: Prisma.CheckListItemOmit | null + /** + * Choose, which related nodes to fetch as well + */ + include?: Prisma.CheckListItemInclude | null + /** + * The filter to search for the CheckListItem to update in case it exists. + */ + where: Prisma.CheckListItemWhereUniqueInput + /** + * In case the CheckListItem found by the `where` argument doesn't exist, create a new CheckListItem with this data. + */ + create: Prisma.XOR + /** + * In case the CheckListItem was found with the provided `where` argument, update it with this data. + */ + update: Prisma.XOR +} + +/** + * CheckListItem delete + */ +export type CheckListItemDeleteArgs = { + /** + * Select specific fields to fetch from the CheckListItem + */ + select?: Prisma.CheckListItemSelect | null + /** + * Omit specific fields from the CheckListItem + */ + omit?: Prisma.CheckListItemOmit | null + /** + * Choose, which related nodes to fetch as well + */ + include?: Prisma.CheckListItemInclude | null + /** + * Filter which CheckListItem to delete. + */ + where: Prisma.CheckListItemWhereUniqueInput +} + +/** + * CheckListItem deleteMany + */ +export type CheckListItemDeleteManyArgs = { + /** + * Filter which CheckListItems to delete + */ + where?: Prisma.CheckListItemWhereInput + /** + * Limit how many CheckListItems to delete. + */ + limit?: number +} + +/** + * CheckListItem without action + */ +export type CheckListItemDefaultArgs = { + /** + * Select specific fields to fetch from the CheckListItem + */ + select?: Prisma.CheckListItemSelect | null + /** + * Omit specific fields from the CheckListItem + */ + omit?: Prisma.CheckListItemOmit | null + /** + * Choose, which related nodes to fetch as well + */ + include?: Prisma.CheckListItemInclude | null +} diff --git a/generated/prisma/models/CheckListTemplate.ts b/generated/prisma/models/CheckListTemplate.ts new file mode 100644 index 0000000..5f9debe --- /dev/null +++ b/generated/prisma/models/CheckListTemplate.ts @@ -0,0 +1,1380 @@ + +/* !!! This is code generated by Prisma. Do not edit directly. !!! */ +/* eslint-disable */ +// biome-ignore-all lint: generated file +// @ts-nocheck +/* + * This file exports the `CheckListTemplate` model and its related types. + * + * 🟢 You can import this file directly. + */ +import type * as runtime from "@prisma/client/runtime/client" +import type * as $Enums from "../enums.ts" +import type * as Prisma from "../internal/prismaNamespace.ts" + +/** + * Model CheckListTemplate + * + */ +export type CheckListTemplateModel = runtime.Types.Result.DefaultSelection + +export type AggregateCheckListTemplate = { + _count: CheckListTemplateCountAggregateOutputType | null + _avg: CheckListTemplateAvgAggregateOutputType | null + _sum: CheckListTemplateSumAggregateOutputType | null + _min: CheckListTemplateMinAggregateOutputType | null + _max: CheckListTemplateMaxAggregateOutputType | null +} + +export type CheckListTemplateAvgAggregateOutputType = { + id: number | null + userId: number | null +} + +export type CheckListTemplateSumAggregateOutputType = { + id: number | null + userId: number | null +} + +export type CheckListTemplateMinAggregateOutputType = { + id: number | null + userId: number | null + name: string | null + scene: string | null + builtin: boolean | null + createdAt: Date | null + updatedAt: Date | null +} + +export type CheckListTemplateMaxAggregateOutputType = { + id: number | null + userId: number | null + name: string | null + scene: string | null + builtin: boolean | null + createdAt: Date | null + updatedAt: Date | null +} + +export type CheckListTemplateCountAggregateOutputType = { + id: number + userId: number + name: number + scene: number + items: number + builtin: number + createdAt: number + updatedAt: number + _all: number +} + + +export type CheckListTemplateAvgAggregateInputType = { + id?: true + userId?: true +} + +export type CheckListTemplateSumAggregateInputType = { + id?: true + userId?: true +} + +export type CheckListTemplateMinAggregateInputType = { + id?: true + userId?: true + name?: true + scene?: true + builtin?: true + createdAt?: true + updatedAt?: true +} + +export type CheckListTemplateMaxAggregateInputType = { + id?: true + userId?: true + name?: true + scene?: true + builtin?: true + createdAt?: true + updatedAt?: true +} + +export type CheckListTemplateCountAggregateInputType = { + id?: true + userId?: true + name?: true + scene?: true + items?: true + builtin?: true + createdAt?: true + updatedAt?: true + _all?: true +} + +export type CheckListTemplateAggregateArgs = { + /** + * Filter which CheckListTemplate to aggregate. + */ + where?: Prisma.CheckListTemplateWhereInput + /** + * {@link https://www.prisma.io/docs/concepts/components/prisma-client/sorting Sorting Docs} + * + * Determine the order of CheckListTemplates to fetch. + */ + orderBy?: Prisma.CheckListTemplateOrderByWithRelationInput | Prisma.CheckListTemplateOrderByWithRelationInput[] + /** + * {@link https://www.prisma.io/docs/concepts/components/prisma-client/pagination#cursor-based-pagination Cursor Docs} + * + * Sets the start position + */ + cursor?: Prisma.CheckListTemplateWhereUniqueInput + /** + * {@link https://www.prisma.io/docs/concepts/components/prisma-client/pagination Pagination Docs} + * + * Take `±n` CheckListTemplates from the position of the cursor. + */ + take?: number + /** + * {@link https://www.prisma.io/docs/concepts/components/prisma-client/pagination Pagination Docs} + * + * Skip the first `n` CheckListTemplates. + */ + skip?: number + /** + * {@link https://www.prisma.io/docs/concepts/components/prisma-client/aggregations Aggregation Docs} + * + * Count returned CheckListTemplates + **/ + _count?: true | CheckListTemplateCountAggregateInputType + /** + * {@link https://www.prisma.io/docs/concepts/components/prisma-client/aggregations Aggregation Docs} + * + * Select which fields to average + **/ + _avg?: CheckListTemplateAvgAggregateInputType + /** + * {@link https://www.prisma.io/docs/concepts/components/prisma-client/aggregations Aggregation Docs} + * + * Select which fields to sum + **/ + _sum?: CheckListTemplateSumAggregateInputType + /** + * {@link https://www.prisma.io/docs/concepts/components/prisma-client/aggregations Aggregation Docs} + * + * Select which fields to find the minimum value + **/ + _min?: CheckListTemplateMinAggregateInputType + /** + * {@link https://www.prisma.io/docs/concepts/components/prisma-client/aggregations Aggregation Docs} + * + * Select which fields to find the maximum value + **/ + _max?: CheckListTemplateMaxAggregateInputType +} + +export type GetCheckListTemplateAggregateType = { + [P in keyof T & keyof AggregateCheckListTemplate]: P extends '_count' | 'count' + ? T[P] extends true + ? number + : Prisma.GetScalarType + : Prisma.GetScalarType +} + + + + +export type CheckListTemplateGroupByArgs = { + where?: Prisma.CheckListTemplateWhereInput + orderBy?: Prisma.CheckListTemplateOrderByWithAggregationInput | Prisma.CheckListTemplateOrderByWithAggregationInput[] + by: Prisma.CheckListTemplateScalarFieldEnum[] | Prisma.CheckListTemplateScalarFieldEnum + having?: Prisma.CheckListTemplateScalarWhereWithAggregatesInput + take?: number + skip?: number + _count?: CheckListTemplateCountAggregateInputType | true + _avg?: CheckListTemplateAvgAggregateInputType + _sum?: CheckListTemplateSumAggregateInputType + _min?: CheckListTemplateMinAggregateInputType + _max?: CheckListTemplateMaxAggregateInputType +} + +export type CheckListTemplateGroupByOutputType = { + id: number + userId: number | null + name: string + scene: string + items: runtime.JsonValue + builtin: boolean + createdAt: Date + updatedAt: Date + _count: CheckListTemplateCountAggregateOutputType | null + _avg: CheckListTemplateAvgAggregateOutputType | null + _sum: CheckListTemplateSumAggregateOutputType | null + _min: CheckListTemplateMinAggregateOutputType | null + _max: CheckListTemplateMaxAggregateOutputType | null +} + +export type GetCheckListTemplateGroupByPayload = Prisma.PrismaPromise< + Array< + Prisma.PickEnumerable & + { + [P in ((keyof T) & (keyof CheckListTemplateGroupByOutputType))]: P extends '_count' + ? T[P] extends boolean + ? number + : Prisma.GetScalarType + : Prisma.GetScalarType + } + > + > + + + +export type CheckListTemplateWhereInput = { + AND?: Prisma.CheckListTemplateWhereInput | Prisma.CheckListTemplateWhereInput[] + OR?: Prisma.CheckListTemplateWhereInput[] + NOT?: Prisma.CheckListTemplateWhereInput | Prisma.CheckListTemplateWhereInput[] + id?: Prisma.IntFilter<"CheckListTemplate"> | number + userId?: Prisma.IntNullableFilter<"CheckListTemplate"> | number | null + name?: Prisma.StringFilter<"CheckListTemplate"> | string + scene?: Prisma.StringFilter<"CheckListTemplate"> | string + items?: Prisma.JsonFilter<"CheckListTemplate"> + builtin?: Prisma.BoolFilter<"CheckListTemplate"> | boolean + createdAt?: Prisma.DateTimeFilter<"CheckListTemplate"> | Date | string + updatedAt?: Prisma.DateTimeFilter<"CheckListTemplate"> | Date | string + user?: Prisma.XOR | null +} + +export type CheckListTemplateOrderByWithRelationInput = { + id?: Prisma.SortOrder + userId?: Prisma.SortOrderInput | Prisma.SortOrder + name?: Prisma.SortOrder + scene?: Prisma.SortOrder + items?: Prisma.SortOrder + builtin?: Prisma.SortOrder + createdAt?: Prisma.SortOrder + updatedAt?: Prisma.SortOrder + user?: Prisma.UserOrderByWithRelationInput + _relevance?: Prisma.CheckListTemplateOrderByRelevanceInput +} + +export type CheckListTemplateWhereUniqueInput = Prisma.AtLeast<{ + id?: number + AND?: Prisma.CheckListTemplateWhereInput | Prisma.CheckListTemplateWhereInput[] + OR?: Prisma.CheckListTemplateWhereInput[] + NOT?: Prisma.CheckListTemplateWhereInput | Prisma.CheckListTemplateWhereInput[] + userId?: Prisma.IntNullableFilter<"CheckListTemplate"> | number | null + name?: Prisma.StringFilter<"CheckListTemplate"> | string + scene?: Prisma.StringFilter<"CheckListTemplate"> | string + items?: Prisma.JsonFilter<"CheckListTemplate"> + builtin?: Prisma.BoolFilter<"CheckListTemplate"> | boolean + createdAt?: Prisma.DateTimeFilter<"CheckListTemplate"> | Date | string + updatedAt?: Prisma.DateTimeFilter<"CheckListTemplate"> | Date | string + user?: Prisma.XOR | null +}, "id"> + +export type CheckListTemplateOrderByWithAggregationInput = { + id?: Prisma.SortOrder + userId?: Prisma.SortOrderInput | Prisma.SortOrder + name?: Prisma.SortOrder + scene?: Prisma.SortOrder + items?: Prisma.SortOrder + builtin?: Prisma.SortOrder + createdAt?: Prisma.SortOrder + updatedAt?: Prisma.SortOrder + _count?: Prisma.CheckListTemplateCountOrderByAggregateInput + _avg?: Prisma.CheckListTemplateAvgOrderByAggregateInput + _max?: Prisma.CheckListTemplateMaxOrderByAggregateInput + _min?: Prisma.CheckListTemplateMinOrderByAggregateInput + _sum?: Prisma.CheckListTemplateSumOrderByAggregateInput +} + +export type CheckListTemplateScalarWhereWithAggregatesInput = { + AND?: Prisma.CheckListTemplateScalarWhereWithAggregatesInput | Prisma.CheckListTemplateScalarWhereWithAggregatesInput[] + OR?: Prisma.CheckListTemplateScalarWhereWithAggregatesInput[] + NOT?: Prisma.CheckListTemplateScalarWhereWithAggregatesInput | Prisma.CheckListTemplateScalarWhereWithAggregatesInput[] + id?: Prisma.IntWithAggregatesFilter<"CheckListTemplate"> | number + userId?: Prisma.IntNullableWithAggregatesFilter<"CheckListTemplate"> | number | null + name?: Prisma.StringWithAggregatesFilter<"CheckListTemplate"> | string + scene?: Prisma.StringWithAggregatesFilter<"CheckListTemplate"> | string + items?: Prisma.JsonWithAggregatesFilter<"CheckListTemplate"> + builtin?: Prisma.BoolWithAggregatesFilter<"CheckListTemplate"> | boolean + createdAt?: Prisma.DateTimeWithAggregatesFilter<"CheckListTemplate"> | Date | string + updatedAt?: Prisma.DateTimeWithAggregatesFilter<"CheckListTemplate"> | Date | string +} + +export type CheckListTemplateCreateInput = { + name: string + scene?: string + items: Prisma.JsonNullValueInput | runtime.InputJsonValue + builtin?: boolean + createdAt?: Date | string + updatedAt?: Date | string + user?: Prisma.UserCreateNestedOneWithoutTemplatesInput +} + +export type CheckListTemplateUncheckedCreateInput = { + id?: number + userId?: number | null + name: string + scene?: string + items: Prisma.JsonNullValueInput | runtime.InputJsonValue + builtin?: boolean + createdAt?: Date | string + updatedAt?: Date | string +} + +export type CheckListTemplateUpdateInput = { + name?: Prisma.StringFieldUpdateOperationsInput | string + scene?: Prisma.StringFieldUpdateOperationsInput | string + items?: Prisma.JsonNullValueInput | runtime.InputJsonValue + builtin?: Prisma.BoolFieldUpdateOperationsInput | boolean + createdAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string + updatedAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string + user?: Prisma.UserUpdateOneWithoutTemplatesNestedInput +} + +export type CheckListTemplateUncheckedUpdateInput = { + id?: Prisma.IntFieldUpdateOperationsInput | number + userId?: Prisma.NullableIntFieldUpdateOperationsInput | number | null + name?: Prisma.StringFieldUpdateOperationsInput | string + scene?: Prisma.StringFieldUpdateOperationsInput | string + items?: Prisma.JsonNullValueInput | runtime.InputJsonValue + builtin?: Prisma.BoolFieldUpdateOperationsInput | boolean + createdAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string + updatedAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string +} + +export type CheckListTemplateCreateManyInput = { + id?: number + userId?: number | null + name: string + scene?: string + items: Prisma.JsonNullValueInput | runtime.InputJsonValue + builtin?: boolean + createdAt?: Date | string + updatedAt?: Date | string +} + +export type CheckListTemplateUpdateManyMutationInput = { + name?: Prisma.StringFieldUpdateOperationsInput | string + scene?: Prisma.StringFieldUpdateOperationsInput | string + items?: Prisma.JsonNullValueInput | runtime.InputJsonValue + builtin?: Prisma.BoolFieldUpdateOperationsInput | boolean + createdAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string + updatedAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string +} + +export type CheckListTemplateUncheckedUpdateManyInput = { + id?: Prisma.IntFieldUpdateOperationsInput | number + userId?: Prisma.NullableIntFieldUpdateOperationsInput | number | null + name?: Prisma.StringFieldUpdateOperationsInput | string + scene?: Prisma.StringFieldUpdateOperationsInput | string + items?: Prisma.JsonNullValueInput | runtime.InputJsonValue + builtin?: Prisma.BoolFieldUpdateOperationsInput | boolean + createdAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string + updatedAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string +} + +export type CheckListTemplateListRelationFilter = { + every?: Prisma.CheckListTemplateWhereInput + some?: Prisma.CheckListTemplateWhereInput + none?: Prisma.CheckListTemplateWhereInput +} + +export type CheckListTemplateOrderByRelationAggregateInput = { + _count?: Prisma.SortOrder +} + +export type CheckListTemplateOrderByRelevanceInput = { + fields: Prisma.CheckListTemplateOrderByRelevanceFieldEnum | Prisma.CheckListTemplateOrderByRelevanceFieldEnum[] + sort: Prisma.SortOrder + search: string +} + +export type CheckListTemplateCountOrderByAggregateInput = { + id?: Prisma.SortOrder + userId?: Prisma.SortOrder + name?: Prisma.SortOrder + scene?: Prisma.SortOrder + items?: Prisma.SortOrder + builtin?: Prisma.SortOrder + createdAt?: Prisma.SortOrder + updatedAt?: Prisma.SortOrder +} + +export type CheckListTemplateAvgOrderByAggregateInput = { + id?: Prisma.SortOrder + userId?: Prisma.SortOrder +} + +export type CheckListTemplateMaxOrderByAggregateInput = { + id?: Prisma.SortOrder + userId?: Prisma.SortOrder + name?: Prisma.SortOrder + scene?: Prisma.SortOrder + builtin?: Prisma.SortOrder + createdAt?: Prisma.SortOrder + updatedAt?: Prisma.SortOrder +} + +export type CheckListTemplateMinOrderByAggregateInput = { + id?: Prisma.SortOrder + userId?: Prisma.SortOrder + name?: Prisma.SortOrder + scene?: Prisma.SortOrder + builtin?: Prisma.SortOrder + createdAt?: Prisma.SortOrder + updatedAt?: Prisma.SortOrder +} + +export type CheckListTemplateSumOrderByAggregateInput = { + id?: Prisma.SortOrder + userId?: Prisma.SortOrder +} + +export type CheckListTemplateCreateNestedManyWithoutUserInput = { + create?: Prisma.XOR | Prisma.CheckListTemplateCreateWithoutUserInput[] | Prisma.CheckListTemplateUncheckedCreateWithoutUserInput[] + connectOrCreate?: Prisma.CheckListTemplateCreateOrConnectWithoutUserInput | Prisma.CheckListTemplateCreateOrConnectWithoutUserInput[] + createMany?: Prisma.CheckListTemplateCreateManyUserInputEnvelope + connect?: Prisma.CheckListTemplateWhereUniqueInput | Prisma.CheckListTemplateWhereUniqueInput[] +} + +export type CheckListTemplateUncheckedCreateNestedManyWithoutUserInput = { + create?: Prisma.XOR | Prisma.CheckListTemplateCreateWithoutUserInput[] | Prisma.CheckListTemplateUncheckedCreateWithoutUserInput[] + connectOrCreate?: Prisma.CheckListTemplateCreateOrConnectWithoutUserInput | Prisma.CheckListTemplateCreateOrConnectWithoutUserInput[] + createMany?: Prisma.CheckListTemplateCreateManyUserInputEnvelope + connect?: Prisma.CheckListTemplateWhereUniqueInput | Prisma.CheckListTemplateWhereUniqueInput[] +} + +export type CheckListTemplateUpdateManyWithoutUserNestedInput = { + create?: Prisma.XOR | Prisma.CheckListTemplateCreateWithoutUserInput[] | Prisma.CheckListTemplateUncheckedCreateWithoutUserInput[] + connectOrCreate?: Prisma.CheckListTemplateCreateOrConnectWithoutUserInput | Prisma.CheckListTemplateCreateOrConnectWithoutUserInput[] + upsert?: Prisma.CheckListTemplateUpsertWithWhereUniqueWithoutUserInput | Prisma.CheckListTemplateUpsertWithWhereUniqueWithoutUserInput[] + createMany?: Prisma.CheckListTemplateCreateManyUserInputEnvelope + set?: Prisma.CheckListTemplateWhereUniqueInput | Prisma.CheckListTemplateWhereUniqueInput[] + disconnect?: Prisma.CheckListTemplateWhereUniqueInput | Prisma.CheckListTemplateWhereUniqueInput[] + delete?: Prisma.CheckListTemplateWhereUniqueInput | Prisma.CheckListTemplateWhereUniqueInput[] + connect?: Prisma.CheckListTemplateWhereUniqueInput | Prisma.CheckListTemplateWhereUniqueInput[] + update?: Prisma.CheckListTemplateUpdateWithWhereUniqueWithoutUserInput | Prisma.CheckListTemplateUpdateWithWhereUniqueWithoutUserInput[] + updateMany?: Prisma.CheckListTemplateUpdateManyWithWhereWithoutUserInput | Prisma.CheckListTemplateUpdateManyWithWhereWithoutUserInput[] + deleteMany?: Prisma.CheckListTemplateScalarWhereInput | Prisma.CheckListTemplateScalarWhereInput[] +} + +export type CheckListTemplateUncheckedUpdateManyWithoutUserNestedInput = { + create?: Prisma.XOR | Prisma.CheckListTemplateCreateWithoutUserInput[] | Prisma.CheckListTemplateUncheckedCreateWithoutUserInput[] + connectOrCreate?: Prisma.CheckListTemplateCreateOrConnectWithoutUserInput | Prisma.CheckListTemplateCreateOrConnectWithoutUserInput[] + upsert?: Prisma.CheckListTemplateUpsertWithWhereUniqueWithoutUserInput | Prisma.CheckListTemplateUpsertWithWhereUniqueWithoutUserInput[] + createMany?: Prisma.CheckListTemplateCreateManyUserInputEnvelope + set?: Prisma.CheckListTemplateWhereUniqueInput | Prisma.CheckListTemplateWhereUniqueInput[] + disconnect?: Prisma.CheckListTemplateWhereUniqueInput | Prisma.CheckListTemplateWhereUniqueInput[] + delete?: Prisma.CheckListTemplateWhereUniqueInput | Prisma.CheckListTemplateWhereUniqueInput[] + connect?: Prisma.CheckListTemplateWhereUniqueInput | Prisma.CheckListTemplateWhereUniqueInput[] + update?: Prisma.CheckListTemplateUpdateWithWhereUniqueWithoutUserInput | Prisma.CheckListTemplateUpdateWithWhereUniqueWithoutUserInput[] + updateMany?: Prisma.CheckListTemplateUpdateManyWithWhereWithoutUserInput | Prisma.CheckListTemplateUpdateManyWithWhereWithoutUserInput[] + deleteMany?: Prisma.CheckListTemplateScalarWhereInput | Prisma.CheckListTemplateScalarWhereInput[] +} + +export type CheckListTemplateCreateWithoutUserInput = { + name: string + scene?: string + items: Prisma.JsonNullValueInput | runtime.InputJsonValue + builtin?: boolean + createdAt?: Date | string + updatedAt?: Date | string +} + +export type CheckListTemplateUncheckedCreateWithoutUserInput = { + id?: number + name: string + scene?: string + items: Prisma.JsonNullValueInput | runtime.InputJsonValue + builtin?: boolean + createdAt?: Date | string + updatedAt?: Date | string +} + +export type CheckListTemplateCreateOrConnectWithoutUserInput = { + where: Prisma.CheckListTemplateWhereUniqueInput + create: Prisma.XOR +} + +export type CheckListTemplateCreateManyUserInputEnvelope = { + data: Prisma.CheckListTemplateCreateManyUserInput | Prisma.CheckListTemplateCreateManyUserInput[] + skipDuplicates?: boolean +} + +export type CheckListTemplateUpsertWithWhereUniqueWithoutUserInput = { + where: Prisma.CheckListTemplateWhereUniqueInput + update: Prisma.XOR + create: Prisma.XOR +} + +export type CheckListTemplateUpdateWithWhereUniqueWithoutUserInput = { + where: Prisma.CheckListTemplateWhereUniqueInput + data: Prisma.XOR +} + +export type CheckListTemplateUpdateManyWithWhereWithoutUserInput = { + where: Prisma.CheckListTemplateScalarWhereInput + data: Prisma.XOR +} + +export type CheckListTemplateScalarWhereInput = { + AND?: Prisma.CheckListTemplateScalarWhereInput | Prisma.CheckListTemplateScalarWhereInput[] + OR?: Prisma.CheckListTemplateScalarWhereInput[] + NOT?: Prisma.CheckListTemplateScalarWhereInput | Prisma.CheckListTemplateScalarWhereInput[] + id?: Prisma.IntFilter<"CheckListTemplate"> | number + userId?: Prisma.IntNullableFilter<"CheckListTemplate"> | number | null + name?: Prisma.StringFilter<"CheckListTemplate"> | string + scene?: Prisma.StringFilter<"CheckListTemplate"> | string + items?: Prisma.JsonFilter<"CheckListTemplate"> + builtin?: Prisma.BoolFilter<"CheckListTemplate"> | boolean + createdAt?: Prisma.DateTimeFilter<"CheckListTemplate"> | Date | string + updatedAt?: Prisma.DateTimeFilter<"CheckListTemplate"> | Date | string +} + +export type CheckListTemplateCreateManyUserInput = { + id?: number + name: string + scene?: string + items: Prisma.JsonNullValueInput | runtime.InputJsonValue + builtin?: boolean + createdAt?: Date | string + updatedAt?: Date | string +} + +export type CheckListTemplateUpdateWithoutUserInput = { + name?: Prisma.StringFieldUpdateOperationsInput | string + scene?: Prisma.StringFieldUpdateOperationsInput | string + items?: Prisma.JsonNullValueInput | runtime.InputJsonValue + builtin?: Prisma.BoolFieldUpdateOperationsInput | boolean + createdAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string + updatedAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string +} + +export type CheckListTemplateUncheckedUpdateWithoutUserInput = { + id?: Prisma.IntFieldUpdateOperationsInput | number + name?: Prisma.StringFieldUpdateOperationsInput | string + scene?: Prisma.StringFieldUpdateOperationsInput | string + items?: Prisma.JsonNullValueInput | runtime.InputJsonValue + builtin?: Prisma.BoolFieldUpdateOperationsInput | boolean + createdAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string + updatedAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string +} + +export type CheckListTemplateUncheckedUpdateManyWithoutUserInput = { + id?: Prisma.IntFieldUpdateOperationsInput | number + name?: Prisma.StringFieldUpdateOperationsInput | string + scene?: Prisma.StringFieldUpdateOperationsInput | string + items?: Prisma.JsonNullValueInput | runtime.InputJsonValue + builtin?: Prisma.BoolFieldUpdateOperationsInput | boolean + createdAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string + updatedAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string +} + + + +export type CheckListTemplateSelect = runtime.Types.Extensions.GetSelect<{ + id?: boolean + userId?: boolean + name?: boolean + scene?: boolean + items?: boolean + builtin?: boolean + createdAt?: boolean + updatedAt?: boolean + user?: boolean | Prisma.CheckListTemplate$userArgs +}, ExtArgs["result"]["checkListTemplate"]> + + + +export type CheckListTemplateSelectScalar = { + id?: boolean + userId?: boolean + name?: boolean + scene?: boolean + items?: boolean + builtin?: boolean + createdAt?: boolean + updatedAt?: boolean +} + +export type CheckListTemplateOmit = runtime.Types.Extensions.GetOmit<"id" | "userId" | "name" | "scene" | "items" | "builtin" | "createdAt" | "updatedAt", ExtArgs["result"]["checkListTemplate"]> +export type CheckListTemplateInclude = { + user?: boolean | Prisma.CheckListTemplate$userArgs +} + +export type $CheckListTemplatePayload = { + name: "CheckListTemplate" + objects: { + user: Prisma.$UserPayload | null + } + scalars: runtime.Types.Extensions.GetPayloadResult<{ + id: number + userId: number | null + name: string + scene: string + items: runtime.JsonValue + builtin: boolean + createdAt: Date + updatedAt: Date + }, ExtArgs["result"]["checkListTemplate"]> + composites: {} +} + +export type CheckListTemplateGetPayload = runtime.Types.Result.GetResult + +export type CheckListTemplateCountArgs = + Omit & { + select?: CheckListTemplateCountAggregateInputType | true + } + +export interface CheckListTemplateDelegate { + [K: symbol]: { types: Prisma.TypeMap['model']['CheckListTemplate'], meta: { name: 'CheckListTemplate' } } + /** + * Find zero or one CheckListTemplate that matches the filter. + * @param {CheckListTemplateFindUniqueArgs} args - Arguments to find a CheckListTemplate + * @example + * // Get one CheckListTemplate + * const checkListTemplate = await prisma.checkListTemplate.findUnique({ + * where: { + * // ... provide filter here + * } + * }) + */ + findUnique(args: Prisma.SelectSubset>): Prisma.Prisma__CheckListTemplateClient, T, "findUnique", GlobalOmitOptions> | null, null, ExtArgs, GlobalOmitOptions> + + /** + * Find one CheckListTemplate that matches the filter or throw an error with `error.code='P2025'` + * if no matches were found. + * @param {CheckListTemplateFindUniqueOrThrowArgs} args - Arguments to find a CheckListTemplate + * @example + * // Get one CheckListTemplate + * const checkListTemplate = await prisma.checkListTemplate.findUniqueOrThrow({ + * where: { + * // ... provide filter here + * } + * }) + */ + findUniqueOrThrow(args: Prisma.SelectSubset>): Prisma.Prisma__CheckListTemplateClient, T, "findUniqueOrThrow", GlobalOmitOptions>, never, ExtArgs, GlobalOmitOptions> + + /** + * Find the first CheckListTemplate that matches the filter. + * Note, that providing `undefined` is treated as the value not being there. + * Read more here: https://pris.ly/d/null-undefined + * @param {CheckListTemplateFindFirstArgs} args - Arguments to find a CheckListTemplate + * @example + * // Get one CheckListTemplate + * const checkListTemplate = await prisma.checkListTemplate.findFirst({ + * where: { + * // ... provide filter here + * } + * }) + */ + findFirst(args?: Prisma.SelectSubset>): Prisma.Prisma__CheckListTemplateClient, T, "findFirst", GlobalOmitOptions> | null, null, ExtArgs, GlobalOmitOptions> + + /** + * Find the first CheckListTemplate that matches the filter or + * throw `PrismaKnownClientError` with `P2025` code if no matches were found. + * Note, that providing `undefined` is treated as the value not being there. + * Read more here: https://pris.ly/d/null-undefined + * @param {CheckListTemplateFindFirstOrThrowArgs} args - Arguments to find a CheckListTemplate + * @example + * // Get one CheckListTemplate + * const checkListTemplate = await prisma.checkListTemplate.findFirstOrThrow({ + * where: { + * // ... provide filter here + * } + * }) + */ + findFirstOrThrow(args?: Prisma.SelectSubset>): Prisma.Prisma__CheckListTemplateClient, T, "findFirstOrThrow", GlobalOmitOptions>, never, ExtArgs, GlobalOmitOptions> + + /** + * Find zero or more CheckListTemplates that matches the filter. + * Note, that providing `undefined` is treated as the value not being there. + * Read more here: https://pris.ly/d/null-undefined + * @param {CheckListTemplateFindManyArgs} args - Arguments to filter and select certain fields only. + * @example + * // Get all CheckListTemplates + * const checkListTemplates = await prisma.checkListTemplate.findMany() + * + * // Get first 10 CheckListTemplates + * const checkListTemplates = await prisma.checkListTemplate.findMany({ take: 10 }) + * + * // Only select the `id` + * const checkListTemplateWithIdOnly = await prisma.checkListTemplate.findMany({ select: { id: true } }) + * + */ + findMany(args?: Prisma.SelectSubset>): Prisma.PrismaPromise, T, "findMany", GlobalOmitOptions>> + + /** + * Create a CheckListTemplate. + * @param {CheckListTemplateCreateArgs} args - Arguments to create a CheckListTemplate. + * @example + * // Create one CheckListTemplate + * const CheckListTemplate = await prisma.checkListTemplate.create({ + * data: { + * // ... data to create a CheckListTemplate + * } + * }) + * + */ + create(args: Prisma.SelectSubset>): Prisma.Prisma__CheckListTemplateClient, T, "create", GlobalOmitOptions>, never, ExtArgs, GlobalOmitOptions> + + /** + * Create many CheckListTemplates. + * @param {CheckListTemplateCreateManyArgs} args - Arguments to create many CheckListTemplates. + * @example + * // Create many CheckListTemplates + * const checkListTemplate = await prisma.checkListTemplate.createMany({ + * data: [ + * // ... provide data here + * ] + * }) + * + */ + createMany(args?: Prisma.SelectSubset>): Prisma.PrismaPromise + + /** + * Delete a CheckListTemplate. + * @param {CheckListTemplateDeleteArgs} args - Arguments to delete one CheckListTemplate. + * @example + * // Delete one CheckListTemplate + * const CheckListTemplate = await prisma.checkListTemplate.delete({ + * where: { + * // ... filter to delete one CheckListTemplate + * } + * }) + * + */ + delete(args: Prisma.SelectSubset>): Prisma.Prisma__CheckListTemplateClient, T, "delete", GlobalOmitOptions>, never, ExtArgs, GlobalOmitOptions> + + /** + * Update one CheckListTemplate. + * @param {CheckListTemplateUpdateArgs} args - Arguments to update one CheckListTemplate. + * @example + * // Update one CheckListTemplate + * const checkListTemplate = await prisma.checkListTemplate.update({ + * where: { + * // ... provide filter here + * }, + * data: { + * // ... provide data here + * } + * }) + * + */ + update(args: Prisma.SelectSubset>): Prisma.Prisma__CheckListTemplateClient, T, "update", GlobalOmitOptions>, never, ExtArgs, GlobalOmitOptions> + + /** + * Delete zero or more CheckListTemplates. + * @param {CheckListTemplateDeleteManyArgs} args - Arguments to filter CheckListTemplates to delete. + * @example + * // Delete a few CheckListTemplates + * const { count } = await prisma.checkListTemplate.deleteMany({ + * where: { + * // ... provide filter here + * } + * }) + * + */ + deleteMany(args?: Prisma.SelectSubset>): Prisma.PrismaPromise + + /** + * Update zero or more CheckListTemplates. + * Note, that providing `undefined` is treated as the value not being there. + * Read more here: https://pris.ly/d/null-undefined + * @param {CheckListTemplateUpdateManyArgs} args - Arguments to update one or more rows. + * @example + * // Update many CheckListTemplates + * const checkListTemplate = await prisma.checkListTemplate.updateMany({ + * where: { + * // ... provide filter here + * }, + * data: { + * // ... provide data here + * } + * }) + * + */ + updateMany(args: Prisma.SelectSubset>): Prisma.PrismaPromise + + /** + * Create or update one CheckListTemplate. + * @param {CheckListTemplateUpsertArgs} args - Arguments to update or create a CheckListTemplate. + * @example + * // Update or create a CheckListTemplate + * const checkListTemplate = await prisma.checkListTemplate.upsert({ + * create: { + * // ... data to create a CheckListTemplate + * }, + * update: { + * // ... in case it already exists, update + * }, + * where: { + * // ... the filter for the CheckListTemplate we want to update + * } + * }) + */ + upsert(args: Prisma.SelectSubset>): Prisma.Prisma__CheckListTemplateClient, T, "upsert", GlobalOmitOptions>, never, ExtArgs, GlobalOmitOptions> + + + /** + * Count the number of CheckListTemplates. + * Note, that providing `undefined` is treated as the value not being there. + * Read more here: https://pris.ly/d/null-undefined + * @param {CheckListTemplateCountArgs} args - Arguments to filter CheckListTemplates to count. + * @example + * // Count the number of CheckListTemplates + * const count = await prisma.checkListTemplate.count({ + * where: { + * // ... the filter for the CheckListTemplates we want to count + * } + * }) + **/ + count( + args?: Prisma.Subset, + ): Prisma.PrismaPromise< + T extends runtime.Types.Utils.Record<'select', any> + ? T['select'] extends true + ? number + : Prisma.GetScalarType + : number + > + + /** + * Allows you to perform aggregations operations on a CheckListTemplate. + * Note, that providing `undefined` is treated as the value not being there. + * Read more here: https://pris.ly/d/null-undefined + * @param {CheckListTemplateAggregateArgs} args - Select which aggregations you would like to apply and on what fields. + * @example + * // Ordered by age ascending + * // Where email contains prisma.io + * // Limited to the 10 users + * const aggregations = await prisma.user.aggregate({ + * _avg: { + * age: true, + * }, + * where: { + * email: { + * contains: "prisma.io", + * }, + * }, + * orderBy: { + * age: "asc", + * }, + * take: 10, + * }) + **/ + aggregate(args: Prisma.Subset): Prisma.PrismaPromise> + + /** + * Group by CheckListTemplate. + * Note, that providing `undefined` is treated as the value not being there. + * Read more here: https://pris.ly/d/null-undefined + * @param {CheckListTemplateGroupByArgs} args - Group by arguments. + * @example + * // Group by city, order by createdAt, get count + * const result = await prisma.user.groupBy({ + * by: ['city', 'createdAt'], + * orderBy: { + * createdAt: true + * }, + * _count: { + * _all: true + * }, + * }) + * + **/ + groupBy< + T extends CheckListTemplateGroupByArgs, + HasSelectOrTake extends Prisma.Or< + Prisma.Extends<'skip', Prisma.Keys>, + Prisma.Extends<'take', Prisma.Keys> + >, + OrderByArg extends Prisma.True extends HasSelectOrTake + ? { orderBy: CheckListTemplateGroupByArgs['orderBy'] } + : { orderBy?: CheckListTemplateGroupByArgs['orderBy'] }, + OrderFields extends Prisma.ExcludeUnderscoreKeys>>, + ByFields extends Prisma.MaybeTupleToUnion, + ByValid extends Prisma.Has, + HavingFields extends Prisma.GetHavingFields, + HavingValid extends Prisma.Has, + ByEmpty extends T['by'] extends never[] ? Prisma.True : Prisma.False, + InputErrors extends ByEmpty extends Prisma.True + ? `Error: "by" must not be empty.` + : HavingValid extends Prisma.False + ? { + [P in HavingFields]: P extends ByFields + ? never + : P extends string + ? `Error: Field "${P}" used in "having" needs to be provided in "by".` + : [ + Error, + 'Field ', + P, + ` in "having" needs to be provided in "by"`, + ] + }[HavingFields] + : 'take' extends Prisma.Keys + ? 'orderBy' extends Prisma.Keys + ? ByValid extends Prisma.True + ? {} + : { + [P in OrderFields]: P extends ByFields + ? never + : `Error: Field "${P}" in "orderBy" needs to be provided in "by"` + }[OrderFields] + : 'Error: If you provide "take", you also need to provide "orderBy"' + : 'skip' extends Prisma.Keys + ? 'orderBy' extends Prisma.Keys + ? ByValid extends Prisma.True + ? {} + : { + [P in OrderFields]: P extends ByFields + ? never + : `Error: Field "${P}" in "orderBy" needs to be provided in "by"` + }[OrderFields] + : 'Error: If you provide "skip", you also need to provide "orderBy"' + : ByValid extends Prisma.True + ? {} + : { + [P in OrderFields]: P extends ByFields + ? never + : `Error: Field "${P}" in "orderBy" needs to be provided in "by"` + }[OrderFields] + >(args: Prisma.SubsetIntersection & InputErrors): {} extends InputErrors ? GetCheckListTemplateGroupByPayload : Prisma.PrismaPromise +/** + * Fields of the CheckListTemplate model + */ +readonly fields: CheckListTemplateFieldRefs; +} + +/** + * The delegate class that acts as a "Promise-like" for CheckListTemplate. + * Why is this prefixed with `Prisma__`? + * Because we want to prevent naming conflicts as mentioned in + * https://github.com/prisma/prisma-client-js/issues/707 + */ +export interface Prisma__CheckListTemplateClient extends Prisma.PrismaPromise { + readonly [Symbol.toStringTag]: "PrismaPromise" + user = {}>(args?: Prisma.Subset>): Prisma.Prisma__UserClient, T, "findUniqueOrThrow", GlobalOmitOptions> | null, null, ExtArgs, GlobalOmitOptions> + /** + * Attaches callbacks for the resolution and/or rejection of the Promise. + * @param onfulfilled The callback to execute when the Promise is resolved. + * @param onrejected The callback to execute when the Promise is rejected. + * @returns A Promise for the completion of which ever callback is executed. + */ + then(onfulfilled?: ((value: T) => TResult1 | PromiseLike) | undefined | null, onrejected?: ((reason: any) => TResult2 | PromiseLike) | undefined | null): runtime.Types.Utils.JsPromise + /** + * Attaches a callback for only the rejection of the Promise. + * @param onrejected The callback to execute when the Promise is rejected. + * @returns A Promise for the completion of the callback. + */ + catch(onrejected?: ((reason: any) => TResult | PromiseLike) | undefined | null): runtime.Types.Utils.JsPromise + /** + * Attaches a callback that is invoked when the Promise is settled (fulfilled or rejected). The + * resolved value cannot be modified from the callback. + * @param onfinally The callback to execute when the Promise is settled (fulfilled or rejected). + * @returns A Promise for the completion of the callback. + */ + finally(onfinally?: (() => void) | undefined | null): runtime.Types.Utils.JsPromise +} + + + + +/** + * Fields of the CheckListTemplate model + */ +export interface CheckListTemplateFieldRefs { + readonly id: Prisma.FieldRef<"CheckListTemplate", 'Int'> + readonly userId: Prisma.FieldRef<"CheckListTemplate", 'Int'> + readonly name: Prisma.FieldRef<"CheckListTemplate", 'String'> + readonly scene: Prisma.FieldRef<"CheckListTemplate", 'String'> + readonly items: Prisma.FieldRef<"CheckListTemplate", 'Json'> + readonly builtin: Prisma.FieldRef<"CheckListTemplate", 'Boolean'> + readonly createdAt: Prisma.FieldRef<"CheckListTemplate", 'DateTime'> + readonly updatedAt: Prisma.FieldRef<"CheckListTemplate", 'DateTime'> +} + + +// Custom InputTypes +/** + * CheckListTemplate findUnique + */ +export type CheckListTemplateFindUniqueArgs = { + /** + * Select specific fields to fetch from the CheckListTemplate + */ + select?: Prisma.CheckListTemplateSelect | null + /** + * Omit specific fields from the CheckListTemplate + */ + omit?: Prisma.CheckListTemplateOmit | null + /** + * Choose, which related nodes to fetch as well + */ + include?: Prisma.CheckListTemplateInclude | null + /** + * Filter, which CheckListTemplate to fetch. + */ + where: Prisma.CheckListTemplateWhereUniqueInput +} + +/** + * CheckListTemplate findUniqueOrThrow + */ +export type CheckListTemplateFindUniqueOrThrowArgs = { + /** + * Select specific fields to fetch from the CheckListTemplate + */ + select?: Prisma.CheckListTemplateSelect | null + /** + * Omit specific fields from the CheckListTemplate + */ + omit?: Prisma.CheckListTemplateOmit | null + /** + * Choose, which related nodes to fetch as well + */ + include?: Prisma.CheckListTemplateInclude | null + /** + * Filter, which CheckListTemplate to fetch. + */ + where: Prisma.CheckListTemplateWhereUniqueInput +} + +/** + * CheckListTemplate findFirst + */ +export type CheckListTemplateFindFirstArgs = { + /** + * Select specific fields to fetch from the CheckListTemplate + */ + select?: Prisma.CheckListTemplateSelect | null + /** + * Omit specific fields from the CheckListTemplate + */ + omit?: Prisma.CheckListTemplateOmit | null + /** + * Choose, which related nodes to fetch as well + */ + include?: Prisma.CheckListTemplateInclude | null + /** + * Filter, which CheckListTemplate to fetch. + */ + where?: Prisma.CheckListTemplateWhereInput + /** + * {@link https://www.prisma.io/docs/concepts/components/prisma-client/sorting Sorting Docs} + * + * Determine the order of CheckListTemplates to fetch. + */ + orderBy?: Prisma.CheckListTemplateOrderByWithRelationInput | Prisma.CheckListTemplateOrderByWithRelationInput[] + /** + * {@link https://www.prisma.io/docs/concepts/components/prisma-client/pagination#cursor-based-pagination Cursor Docs} + * + * Sets the position for searching for CheckListTemplates. + */ + cursor?: Prisma.CheckListTemplateWhereUniqueInput + /** + * {@link https://www.prisma.io/docs/concepts/components/prisma-client/pagination Pagination Docs} + * + * Take `±n` CheckListTemplates from the position of the cursor. + */ + take?: number + /** + * {@link https://www.prisma.io/docs/concepts/components/prisma-client/pagination Pagination Docs} + * + * Skip the first `n` CheckListTemplates. + */ + skip?: number + /** + * {@link https://www.prisma.io/docs/concepts/components/prisma-client/distinct Distinct Docs} + * + * Filter by unique combinations of CheckListTemplates. + */ + distinct?: Prisma.CheckListTemplateScalarFieldEnum | Prisma.CheckListTemplateScalarFieldEnum[] +} + +/** + * CheckListTemplate findFirstOrThrow + */ +export type CheckListTemplateFindFirstOrThrowArgs = { + /** + * Select specific fields to fetch from the CheckListTemplate + */ + select?: Prisma.CheckListTemplateSelect | null + /** + * Omit specific fields from the CheckListTemplate + */ + omit?: Prisma.CheckListTemplateOmit | null + /** + * Choose, which related nodes to fetch as well + */ + include?: Prisma.CheckListTemplateInclude | null + /** + * Filter, which CheckListTemplate to fetch. + */ + where?: Prisma.CheckListTemplateWhereInput + /** + * {@link https://www.prisma.io/docs/concepts/components/prisma-client/sorting Sorting Docs} + * + * Determine the order of CheckListTemplates to fetch. + */ + orderBy?: Prisma.CheckListTemplateOrderByWithRelationInput | Prisma.CheckListTemplateOrderByWithRelationInput[] + /** + * {@link https://www.prisma.io/docs/concepts/components/prisma-client/pagination#cursor-based-pagination Cursor Docs} + * + * Sets the position for searching for CheckListTemplates. + */ + cursor?: Prisma.CheckListTemplateWhereUniqueInput + /** + * {@link https://www.prisma.io/docs/concepts/components/prisma-client/pagination Pagination Docs} + * + * Take `±n` CheckListTemplates from the position of the cursor. + */ + take?: number + /** + * {@link https://www.prisma.io/docs/concepts/components/prisma-client/pagination Pagination Docs} + * + * Skip the first `n` CheckListTemplates. + */ + skip?: number + /** + * {@link https://www.prisma.io/docs/concepts/components/prisma-client/distinct Distinct Docs} + * + * Filter by unique combinations of CheckListTemplates. + */ + distinct?: Prisma.CheckListTemplateScalarFieldEnum | Prisma.CheckListTemplateScalarFieldEnum[] +} + +/** + * CheckListTemplate findMany + */ +export type CheckListTemplateFindManyArgs = { + /** + * Select specific fields to fetch from the CheckListTemplate + */ + select?: Prisma.CheckListTemplateSelect | null + /** + * Omit specific fields from the CheckListTemplate + */ + omit?: Prisma.CheckListTemplateOmit | null + /** + * Choose, which related nodes to fetch as well + */ + include?: Prisma.CheckListTemplateInclude | null + /** + * Filter, which CheckListTemplates to fetch. + */ + where?: Prisma.CheckListTemplateWhereInput + /** + * {@link https://www.prisma.io/docs/concepts/components/prisma-client/sorting Sorting Docs} + * + * Determine the order of CheckListTemplates to fetch. + */ + orderBy?: Prisma.CheckListTemplateOrderByWithRelationInput | Prisma.CheckListTemplateOrderByWithRelationInput[] + /** + * {@link https://www.prisma.io/docs/concepts/components/prisma-client/pagination#cursor-based-pagination Cursor Docs} + * + * Sets the position for listing CheckListTemplates. + */ + cursor?: Prisma.CheckListTemplateWhereUniqueInput + /** + * {@link https://www.prisma.io/docs/concepts/components/prisma-client/pagination Pagination Docs} + * + * Take `±n` CheckListTemplates from the position of the cursor. + */ + take?: number + /** + * {@link https://www.prisma.io/docs/concepts/components/prisma-client/pagination Pagination Docs} + * + * Skip the first `n` CheckListTemplates. + */ + skip?: number + /** + * {@link https://www.prisma.io/docs/concepts/components/prisma-client/distinct Distinct Docs} + * + * Filter by unique combinations of CheckListTemplates. + */ + distinct?: Prisma.CheckListTemplateScalarFieldEnum | Prisma.CheckListTemplateScalarFieldEnum[] +} + +/** + * CheckListTemplate create + */ +export type CheckListTemplateCreateArgs = { + /** + * Select specific fields to fetch from the CheckListTemplate + */ + select?: Prisma.CheckListTemplateSelect | null + /** + * Omit specific fields from the CheckListTemplate + */ + omit?: Prisma.CheckListTemplateOmit | null + /** + * Choose, which related nodes to fetch as well + */ + include?: Prisma.CheckListTemplateInclude | null + /** + * The data needed to create a CheckListTemplate. + */ + data: Prisma.XOR +} + +/** + * CheckListTemplate createMany + */ +export type CheckListTemplateCreateManyArgs = { + /** + * The data used to create many CheckListTemplates. + */ + data: Prisma.CheckListTemplateCreateManyInput | Prisma.CheckListTemplateCreateManyInput[] + skipDuplicates?: boolean +} + +/** + * CheckListTemplate update + */ +export type CheckListTemplateUpdateArgs = { + /** + * Select specific fields to fetch from the CheckListTemplate + */ + select?: Prisma.CheckListTemplateSelect | null + /** + * Omit specific fields from the CheckListTemplate + */ + omit?: Prisma.CheckListTemplateOmit | null + /** + * Choose, which related nodes to fetch as well + */ + include?: Prisma.CheckListTemplateInclude | null + /** + * The data needed to update a CheckListTemplate. + */ + data: Prisma.XOR + /** + * Choose, which CheckListTemplate to update. + */ + where: Prisma.CheckListTemplateWhereUniqueInput +} + +/** + * CheckListTemplate updateMany + */ +export type CheckListTemplateUpdateManyArgs = { + /** + * The data used to update CheckListTemplates. + */ + data: Prisma.XOR + /** + * Filter which CheckListTemplates to update + */ + where?: Prisma.CheckListTemplateWhereInput + /** + * Limit how many CheckListTemplates to update. + */ + limit?: number +} + +/** + * CheckListTemplate upsert + */ +export type CheckListTemplateUpsertArgs = { + /** + * Select specific fields to fetch from the CheckListTemplate + */ + select?: Prisma.CheckListTemplateSelect | null + /** + * Omit specific fields from the CheckListTemplate + */ + omit?: Prisma.CheckListTemplateOmit | null + /** + * Choose, which related nodes to fetch as well + */ + include?: Prisma.CheckListTemplateInclude | null + /** + * The filter to search for the CheckListTemplate to update in case it exists. + */ + where: Prisma.CheckListTemplateWhereUniqueInput + /** + * In case the CheckListTemplate found by the `where` argument doesn't exist, create a new CheckListTemplate with this data. + */ + create: Prisma.XOR + /** + * In case the CheckListTemplate was found with the provided `where` argument, update it with this data. + */ + update: Prisma.XOR +} + +/** + * CheckListTemplate delete + */ +export type CheckListTemplateDeleteArgs = { + /** + * Select specific fields to fetch from the CheckListTemplate + */ + select?: Prisma.CheckListTemplateSelect | null + /** + * Omit specific fields from the CheckListTemplate + */ + omit?: Prisma.CheckListTemplateOmit | null + /** + * Choose, which related nodes to fetch as well + */ + include?: Prisma.CheckListTemplateInclude | null + /** + * Filter which CheckListTemplate to delete. + */ + where: Prisma.CheckListTemplateWhereUniqueInput +} + +/** + * CheckListTemplate deleteMany + */ +export type CheckListTemplateDeleteManyArgs = { + /** + * Filter which CheckListTemplates to delete + */ + where?: Prisma.CheckListTemplateWhereInput + /** + * Limit how many CheckListTemplates to delete. + */ + limit?: number +} + +/** + * CheckListTemplate.user + */ +export type CheckListTemplate$userArgs = { + /** + * Select specific fields to fetch from the User + */ + select?: Prisma.UserSelect | null + /** + * Omit specific fields from the User + */ + omit?: Prisma.UserOmit | null + /** + * Choose, which related nodes to fetch as well + */ + include?: Prisma.UserInclude | null + where?: Prisma.UserWhereInput +} + +/** + * CheckListTemplate without action + */ +export type CheckListTemplateDefaultArgs = { + /** + * Select specific fields to fetch from the CheckListTemplate + */ + select?: Prisma.CheckListTemplateSelect | null + /** + * Omit specific fields from the CheckListTemplate + */ + omit?: Prisma.CheckListTemplateOmit | null + /** + * Choose, which related nodes to fetch as well + */ + include?: Prisma.CheckListTemplateInclude | null +} diff --git a/generated/prisma/models/Habit.ts b/generated/prisma/models/Habit.ts new file mode 100644 index 0000000..22795ad --- /dev/null +++ b/generated/prisma/models/Habit.ts @@ -0,0 +1,1674 @@ + +/* !!! This is code generated by Prisma. Do not edit directly. !!! */ +/* eslint-disable */ +// biome-ignore-all lint: generated file +// @ts-nocheck +/* + * This file exports the `Habit` model and its related types. + * + * 🟢 You can import this file directly. + */ +import type * as runtime from "@prisma/client/runtime/client" +import type * as $Enums from "../enums.ts" +import type * as Prisma from "../internal/prismaNamespace.ts" + +/** + * Model Habit + * + */ +export type HabitModel = runtime.Types.Result.DefaultSelection + +export type AggregateHabit = { + _count: HabitCountAggregateOutputType | null + _avg: HabitAvgAggregateOutputType | null + _sum: HabitSumAggregateOutputType | null + _min: HabitMinAggregateOutputType | null + _max: HabitMaxAggregateOutputType | null +} + +export type HabitAvgAggregateOutputType = { + id: number | null + userId: number | null + target: number | null + sortOrder: number | null +} + +export type HabitSumAggregateOutputType = { + id: number | null + userId: number | null + target: number | null + sortOrder: number | null +} + +export type HabitMinAggregateOutputType = { + id: number | null + userId: number | null + name: string | null + period: string | null + target: number | null + color: string | null + icon: string | null + note: string | null + archived: boolean | null + sortOrder: number | null + createdAt: Date | null + updatedAt: Date | null +} + +export type HabitMaxAggregateOutputType = { + id: number | null + userId: number | null + name: string | null + period: string | null + target: number | null + color: string | null + icon: string | null + note: string | null + archived: boolean | null + sortOrder: number | null + createdAt: Date | null + updatedAt: Date | null +} + +export type HabitCountAggregateOutputType = { + id: number + userId: number + name: number + period: number + target: number + color: number + icon: number + note: number + archived: number + sortOrder: number + createdAt: number + updatedAt: number + _all: number +} + + +export type HabitAvgAggregateInputType = { + id?: true + userId?: true + target?: true + sortOrder?: true +} + +export type HabitSumAggregateInputType = { + id?: true + userId?: true + target?: true + sortOrder?: true +} + +export type HabitMinAggregateInputType = { + id?: true + userId?: true + name?: true + period?: true + target?: true + color?: true + icon?: true + note?: true + archived?: true + sortOrder?: true + createdAt?: true + updatedAt?: true +} + +export type HabitMaxAggregateInputType = { + id?: true + userId?: true + name?: true + period?: true + target?: true + color?: true + icon?: true + note?: true + archived?: true + sortOrder?: true + createdAt?: true + updatedAt?: true +} + +export type HabitCountAggregateInputType = { + id?: true + userId?: true + name?: true + period?: true + target?: true + color?: true + icon?: true + note?: true + archived?: true + sortOrder?: true + createdAt?: true + updatedAt?: true + _all?: true +} + +export type HabitAggregateArgs = { + /** + * Filter which Habit to aggregate. + */ + where?: Prisma.HabitWhereInput + /** + * {@link https://www.prisma.io/docs/concepts/components/prisma-client/sorting Sorting Docs} + * + * Determine the order of Habits to fetch. + */ + orderBy?: Prisma.HabitOrderByWithRelationInput | Prisma.HabitOrderByWithRelationInput[] + /** + * {@link https://www.prisma.io/docs/concepts/components/prisma-client/pagination#cursor-based-pagination Cursor Docs} + * + * Sets the start position + */ + cursor?: Prisma.HabitWhereUniqueInput + /** + * {@link https://www.prisma.io/docs/concepts/components/prisma-client/pagination Pagination Docs} + * + * Take `±n` Habits from the position of the cursor. + */ + take?: number + /** + * {@link https://www.prisma.io/docs/concepts/components/prisma-client/pagination Pagination Docs} + * + * Skip the first `n` Habits. + */ + skip?: number + /** + * {@link https://www.prisma.io/docs/concepts/components/prisma-client/aggregations Aggregation Docs} + * + * Count returned Habits + **/ + _count?: true | HabitCountAggregateInputType + /** + * {@link https://www.prisma.io/docs/concepts/components/prisma-client/aggregations Aggregation Docs} + * + * Select which fields to average + **/ + _avg?: HabitAvgAggregateInputType + /** + * {@link https://www.prisma.io/docs/concepts/components/prisma-client/aggregations Aggregation Docs} + * + * Select which fields to sum + **/ + _sum?: HabitSumAggregateInputType + /** + * {@link https://www.prisma.io/docs/concepts/components/prisma-client/aggregations Aggregation Docs} + * + * Select which fields to find the minimum value + **/ + _min?: HabitMinAggregateInputType + /** + * {@link https://www.prisma.io/docs/concepts/components/prisma-client/aggregations Aggregation Docs} + * + * Select which fields to find the maximum value + **/ + _max?: HabitMaxAggregateInputType +} + +export type GetHabitAggregateType = { + [P in keyof T & keyof AggregateHabit]: P extends '_count' | 'count' + ? T[P] extends true + ? number + : Prisma.GetScalarType + : Prisma.GetScalarType +} + + + + +export type HabitGroupByArgs = { + where?: Prisma.HabitWhereInput + orderBy?: Prisma.HabitOrderByWithAggregationInput | Prisma.HabitOrderByWithAggregationInput[] + by: Prisma.HabitScalarFieldEnum[] | Prisma.HabitScalarFieldEnum + having?: Prisma.HabitScalarWhereWithAggregatesInput + take?: number + skip?: number + _count?: HabitCountAggregateInputType | true + _avg?: HabitAvgAggregateInputType + _sum?: HabitSumAggregateInputType + _min?: HabitMinAggregateInputType + _max?: HabitMaxAggregateInputType +} + +export type HabitGroupByOutputType = { + id: number + userId: number + name: string + period: string + target: number + color: string + icon: string + note: string + archived: boolean + sortOrder: number + createdAt: Date + updatedAt: Date + _count: HabitCountAggregateOutputType | null + _avg: HabitAvgAggregateOutputType | null + _sum: HabitSumAggregateOutputType | null + _min: HabitMinAggregateOutputType | null + _max: HabitMaxAggregateOutputType | null +} + +export type GetHabitGroupByPayload = Prisma.PrismaPromise< + Array< + Prisma.PickEnumerable & + { + [P in ((keyof T) & (keyof HabitGroupByOutputType))]: P extends '_count' + ? T[P] extends boolean + ? number + : Prisma.GetScalarType + : Prisma.GetScalarType + } + > + > + + + +export type HabitWhereInput = { + AND?: Prisma.HabitWhereInput | Prisma.HabitWhereInput[] + OR?: Prisma.HabitWhereInput[] + NOT?: Prisma.HabitWhereInput | Prisma.HabitWhereInput[] + id?: Prisma.IntFilter<"Habit"> | number + userId?: Prisma.IntFilter<"Habit"> | number + name?: Prisma.StringFilter<"Habit"> | string + period?: Prisma.StringFilter<"Habit"> | string + target?: Prisma.IntFilter<"Habit"> | number + color?: Prisma.StringFilter<"Habit"> | string + icon?: Prisma.StringFilter<"Habit"> | string + note?: Prisma.StringFilter<"Habit"> | string + archived?: Prisma.BoolFilter<"Habit"> | boolean + sortOrder?: Prisma.IntFilter<"Habit"> | number + createdAt?: Prisma.DateTimeFilter<"Habit"> | Date | string + updatedAt?: Prisma.DateTimeFilter<"Habit"> | Date | string + user?: Prisma.XOR + records?: Prisma.CheckInListRelationFilter +} + +export type HabitOrderByWithRelationInput = { + id?: Prisma.SortOrder + userId?: Prisma.SortOrder + name?: Prisma.SortOrder + period?: Prisma.SortOrder + target?: Prisma.SortOrder + color?: Prisma.SortOrder + icon?: Prisma.SortOrder + note?: Prisma.SortOrder + archived?: Prisma.SortOrder + sortOrder?: Prisma.SortOrder + createdAt?: Prisma.SortOrder + updatedAt?: Prisma.SortOrder + user?: Prisma.UserOrderByWithRelationInput + records?: Prisma.CheckInOrderByRelationAggregateInput + _relevance?: Prisma.HabitOrderByRelevanceInput +} + +export type HabitWhereUniqueInput = Prisma.AtLeast<{ + id?: number + AND?: Prisma.HabitWhereInput | Prisma.HabitWhereInput[] + OR?: Prisma.HabitWhereInput[] + NOT?: Prisma.HabitWhereInput | Prisma.HabitWhereInput[] + userId?: Prisma.IntFilter<"Habit"> | number + name?: Prisma.StringFilter<"Habit"> | string + period?: Prisma.StringFilter<"Habit"> | string + target?: Prisma.IntFilter<"Habit"> | number + color?: Prisma.StringFilter<"Habit"> | string + icon?: Prisma.StringFilter<"Habit"> | string + note?: Prisma.StringFilter<"Habit"> | string + archived?: Prisma.BoolFilter<"Habit"> | boolean + sortOrder?: Prisma.IntFilter<"Habit"> | number + createdAt?: Prisma.DateTimeFilter<"Habit"> | Date | string + updatedAt?: Prisma.DateTimeFilter<"Habit"> | Date | string + user?: Prisma.XOR + records?: Prisma.CheckInListRelationFilter +}, "id"> + +export type HabitOrderByWithAggregationInput = { + id?: Prisma.SortOrder + userId?: Prisma.SortOrder + name?: Prisma.SortOrder + period?: Prisma.SortOrder + target?: Prisma.SortOrder + color?: Prisma.SortOrder + icon?: Prisma.SortOrder + note?: Prisma.SortOrder + archived?: Prisma.SortOrder + sortOrder?: Prisma.SortOrder + createdAt?: Prisma.SortOrder + updatedAt?: Prisma.SortOrder + _count?: Prisma.HabitCountOrderByAggregateInput + _avg?: Prisma.HabitAvgOrderByAggregateInput + _max?: Prisma.HabitMaxOrderByAggregateInput + _min?: Prisma.HabitMinOrderByAggregateInput + _sum?: Prisma.HabitSumOrderByAggregateInput +} + +export type HabitScalarWhereWithAggregatesInput = { + AND?: Prisma.HabitScalarWhereWithAggregatesInput | Prisma.HabitScalarWhereWithAggregatesInput[] + OR?: Prisma.HabitScalarWhereWithAggregatesInput[] + NOT?: Prisma.HabitScalarWhereWithAggregatesInput | Prisma.HabitScalarWhereWithAggregatesInput[] + id?: Prisma.IntWithAggregatesFilter<"Habit"> | number + userId?: Prisma.IntWithAggregatesFilter<"Habit"> | number + name?: Prisma.StringWithAggregatesFilter<"Habit"> | string + period?: Prisma.StringWithAggregatesFilter<"Habit"> | string + target?: Prisma.IntWithAggregatesFilter<"Habit"> | number + color?: Prisma.StringWithAggregatesFilter<"Habit"> | string + icon?: Prisma.StringWithAggregatesFilter<"Habit"> | string + note?: Prisma.StringWithAggregatesFilter<"Habit"> | string + archived?: Prisma.BoolWithAggregatesFilter<"Habit"> | boolean + sortOrder?: Prisma.IntWithAggregatesFilter<"Habit"> | number + createdAt?: Prisma.DateTimeWithAggregatesFilter<"Habit"> | Date | string + updatedAt?: Prisma.DateTimeWithAggregatesFilter<"Habit"> | Date | string +} + +export type HabitCreateInput = { + name: string + period?: string + target?: number + color?: string + icon?: string + note?: string + archived?: boolean + sortOrder?: number + createdAt?: Date | string + updatedAt?: Date | string + user: Prisma.UserCreateNestedOneWithoutHabitsInput + records?: Prisma.CheckInCreateNestedManyWithoutHabitInput +} + +export type HabitUncheckedCreateInput = { + id?: number + userId: number + name: string + period?: string + target?: number + color?: string + icon?: string + note?: string + archived?: boolean + sortOrder?: number + createdAt?: Date | string + updatedAt?: Date | string + records?: Prisma.CheckInUncheckedCreateNestedManyWithoutHabitInput +} + +export type HabitUpdateInput = { + name?: Prisma.StringFieldUpdateOperationsInput | string + period?: Prisma.StringFieldUpdateOperationsInput | string + target?: Prisma.IntFieldUpdateOperationsInput | number + color?: Prisma.StringFieldUpdateOperationsInput | string + icon?: Prisma.StringFieldUpdateOperationsInput | string + note?: Prisma.StringFieldUpdateOperationsInput | string + archived?: Prisma.BoolFieldUpdateOperationsInput | boolean + sortOrder?: Prisma.IntFieldUpdateOperationsInput | number + createdAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string + updatedAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string + user?: Prisma.UserUpdateOneRequiredWithoutHabitsNestedInput + records?: Prisma.CheckInUpdateManyWithoutHabitNestedInput +} + +export type HabitUncheckedUpdateInput = { + id?: Prisma.IntFieldUpdateOperationsInput | number + userId?: Prisma.IntFieldUpdateOperationsInput | number + name?: Prisma.StringFieldUpdateOperationsInput | string + period?: Prisma.StringFieldUpdateOperationsInput | string + target?: Prisma.IntFieldUpdateOperationsInput | number + color?: Prisma.StringFieldUpdateOperationsInput | string + icon?: Prisma.StringFieldUpdateOperationsInput | string + note?: Prisma.StringFieldUpdateOperationsInput | string + archived?: Prisma.BoolFieldUpdateOperationsInput | boolean + sortOrder?: Prisma.IntFieldUpdateOperationsInput | number + createdAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string + updatedAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string + records?: Prisma.CheckInUncheckedUpdateManyWithoutHabitNestedInput +} + +export type HabitCreateManyInput = { + id?: number + userId: number + name: string + period?: string + target?: number + color?: string + icon?: string + note?: string + archived?: boolean + sortOrder?: number + createdAt?: Date | string + updatedAt?: Date | string +} + +export type HabitUpdateManyMutationInput = { + name?: Prisma.StringFieldUpdateOperationsInput | string + period?: Prisma.StringFieldUpdateOperationsInput | string + target?: Prisma.IntFieldUpdateOperationsInput | number + color?: Prisma.StringFieldUpdateOperationsInput | string + icon?: Prisma.StringFieldUpdateOperationsInput | string + note?: Prisma.StringFieldUpdateOperationsInput | string + archived?: Prisma.BoolFieldUpdateOperationsInput | boolean + sortOrder?: Prisma.IntFieldUpdateOperationsInput | number + createdAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string + updatedAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string +} + +export type HabitUncheckedUpdateManyInput = { + id?: Prisma.IntFieldUpdateOperationsInput | number + userId?: Prisma.IntFieldUpdateOperationsInput | number + name?: Prisma.StringFieldUpdateOperationsInput | string + period?: Prisma.StringFieldUpdateOperationsInput | string + target?: Prisma.IntFieldUpdateOperationsInput | number + color?: Prisma.StringFieldUpdateOperationsInput | string + icon?: Prisma.StringFieldUpdateOperationsInput | string + note?: Prisma.StringFieldUpdateOperationsInput | string + archived?: Prisma.BoolFieldUpdateOperationsInput | boolean + sortOrder?: Prisma.IntFieldUpdateOperationsInput | number + createdAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string + updatedAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string +} + +export type HabitListRelationFilter = { + every?: Prisma.HabitWhereInput + some?: Prisma.HabitWhereInput + none?: Prisma.HabitWhereInput +} + +export type HabitOrderByRelationAggregateInput = { + _count?: Prisma.SortOrder +} + +export type HabitOrderByRelevanceInput = { + fields: Prisma.HabitOrderByRelevanceFieldEnum | Prisma.HabitOrderByRelevanceFieldEnum[] + sort: Prisma.SortOrder + search: string +} + +export type HabitCountOrderByAggregateInput = { + id?: Prisma.SortOrder + userId?: Prisma.SortOrder + name?: Prisma.SortOrder + period?: Prisma.SortOrder + target?: Prisma.SortOrder + color?: Prisma.SortOrder + icon?: Prisma.SortOrder + note?: Prisma.SortOrder + archived?: Prisma.SortOrder + sortOrder?: Prisma.SortOrder + createdAt?: Prisma.SortOrder + updatedAt?: Prisma.SortOrder +} + +export type HabitAvgOrderByAggregateInput = { + id?: Prisma.SortOrder + userId?: Prisma.SortOrder + target?: Prisma.SortOrder + sortOrder?: Prisma.SortOrder +} + +export type HabitMaxOrderByAggregateInput = { + id?: Prisma.SortOrder + userId?: Prisma.SortOrder + name?: Prisma.SortOrder + period?: Prisma.SortOrder + target?: Prisma.SortOrder + color?: Prisma.SortOrder + icon?: Prisma.SortOrder + note?: Prisma.SortOrder + archived?: Prisma.SortOrder + sortOrder?: Prisma.SortOrder + createdAt?: Prisma.SortOrder + updatedAt?: Prisma.SortOrder +} + +export type HabitMinOrderByAggregateInput = { + id?: Prisma.SortOrder + userId?: Prisma.SortOrder + name?: Prisma.SortOrder + period?: Prisma.SortOrder + target?: Prisma.SortOrder + color?: Prisma.SortOrder + icon?: Prisma.SortOrder + note?: Prisma.SortOrder + archived?: Prisma.SortOrder + sortOrder?: Prisma.SortOrder + createdAt?: Prisma.SortOrder + updatedAt?: Prisma.SortOrder +} + +export type HabitSumOrderByAggregateInput = { + id?: Prisma.SortOrder + userId?: Prisma.SortOrder + target?: Prisma.SortOrder + sortOrder?: Prisma.SortOrder +} + +export type HabitScalarRelationFilter = { + is?: Prisma.HabitWhereInput + isNot?: Prisma.HabitWhereInput +} + +export type HabitCreateNestedManyWithoutUserInput = { + create?: Prisma.XOR | Prisma.HabitCreateWithoutUserInput[] | Prisma.HabitUncheckedCreateWithoutUserInput[] + connectOrCreate?: Prisma.HabitCreateOrConnectWithoutUserInput | Prisma.HabitCreateOrConnectWithoutUserInput[] + createMany?: Prisma.HabitCreateManyUserInputEnvelope + connect?: Prisma.HabitWhereUniqueInput | Prisma.HabitWhereUniqueInput[] +} + +export type HabitUncheckedCreateNestedManyWithoutUserInput = { + create?: Prisma.XOR | Prisma.HabitCreateWithoutUserInput[] | Prisma.HabitUncheckedCreateWithoutUserInput[] + connectOrCreate?: Prisma.HabitCreateOrConnectWithoutUserInput | Prisma.HabitCreateOrConnectWithoutUserInput[] + createMany?: Prisma.HabitCreateManyUserInputEnvelope + connect?: Prisma.HabitWhereUniqueInput | Prisma.HabitWhereUniqueInput[] +} + +export type HabitUpdateManyWithoutUserNestedInput = { + create?: Prisma.XOR | Prisma.HabitCreateWithoutUserInput[] | Prisma.HabitUncheckedCreateWithoutUserInput[] + connectOrCreate?: Prisma.HabitCreateOrConnectWithoutUserInput | Prisma.HabitCreateOrConnectWithoutUserInput[] + upsert?: Prisma.HabitUpsertWithWhereUniqueWithoutUserInput | Prisma.HabitUpsertWithWhereUniqueWithoutUserInput[] + createMany?: Prisma.HabitCreateManyUserInputEnvelope + set?: Prisma.HabitWhereUniqueInput | Prisma.HabitWhereUniqueInput[] + disconnect?: Prisma.HabitWhereUniqueInput | Prisma.HabitWhereUniqueInput[] + delete?: Prisma.HabitWhereUniqueInput | Prisma.HabitWhereUniqueInput[] + connect?: Prisma.HabitWhereUniqueInput | Prisma.HabitWhereUniqueInput[] + update?: Prisma.HabitUpdateWithWhereUniqueWithoutUserInput | Prisma.HabitUpdateWithWhereUniqueWithoutUserInput[] + updateMany?: Prisma.HabitUpdateManyWithWhereWithoutUserInput | Prisma.HabitUpdateManyWithWhereWithoutUserInput[] + deleteMany?: Prisma.HabitScalarWhereInput | Prisma.HabitScalarWhereInput[] +} + +export type HabitUncheckedUpdateManyWithoutUserNestedInput = { + create?: Prisma.XOR | Prisma.HabitCreateWithoutUserInput[] | Prisma.HabitUncheckedCreateWithoutUserInput[] + connectOrCreate?: Prisma.HabitCreateOrConnectWithoutUserInput | Prisma.HabitCreateOrConnectWithoutUserInput[] + upsert?: Prisma.HabitUpsertWithWhereUniqueWithoutUserInput | Prisma.HabitUpsertWithWhereUniqueWithoutUserInput[] + createMany?: Prisma.HabitCreateManyUserInputEnvelope + set?: Prisma.HabitWhereUniqueInput | Prisma.HabitWhereUniqueInput[] + disconnect?: Prisma.HabitWhereUniqueInput | Prisma.HabitWhereUniqueInput[] + delete?: Prisma.HabitWhereUniqueInput | Prisma.HabitWhereUniqueInput[] + connect?: Prisma.HabitWhereUniqueInput | Prisma.HabitWhereUniqueInput[] + update?: Prisma.HabitUpdateWithWhereUniqueWithoutUserInput | Prisma.HabitUpdateWithWhereUniqueWithoutUserInput[] + updateMany?: Prisma.HabitUpdateManyWithWhereWithoutUserInput | Prisma.HabitUpdateManyWithWhereWithoutUserInput[] + deleteMany?: Prisma.HabitScalarWhereInput | Prisma.HabitScalarWhereInput[] +} + +export type HabitCreateNestedOneWithoutRecordsInput = { + create?: Prisma.XOR + connectOrCreate?: Prisma.HabitCreateOrConnectWithoutRecordsInput + connect?: Prisma.HabitWhereUniqueInput +} + +export type HabitUpdateOneRequiredWithoutRecordsNestedInput = { + create?: Prisma.XOR + connectOrCreate?: Prisma.HabitCreateOrConnectWithoutRecordsInput + upsert?: Prisma.HabitUpsertWithoutRecordsInput + connect?: Prisma.HabitWhereUniqueInput + update?: Prisma.XOR, Prisma.HabitUncheckedUpdateWithoutRecordsInput> +} + +export type HabitCreateWithoutUserInput = { + name: string + period?: string + target?: number + color?: string + icon?: string + note?: string + archived?: boolean + sortOrder?: number + createdAt?: Date | string + updatedAt?: Date | string + records?: Prisma.CheckInCreateNestedManyWithoutHabitInput +} + +export type HabitUncheckedCreateWithoutUserInput = { + id?: number + name: string + period?: string + target?: number + color?: string + icon?: string + note?: string + archived?: boolean + sortOrder?: number + createdAt?: Date | string + updatedAt?: Date | string + records?: Prisma.CheckInUncheckedCreateNestedManyWithoutHabitInput +} + +export type HabitCreateOrConnectWithoutUserInput = { + where: Prisma.HabitWhereUniqueInput + create: Prisma.XOR +} + +export type HabitCreateManyUserInputEnvelope = { + data: Prisma.HabitCreateManyUserInput | Prisma.HabitCreateManyUserInput[] + skipDuplicates?: boolean +} + +export type HabitUpsertWithWhereUniqueWithoutUserInput = { + where: Prisma.HabitWhereUniqueInput + update: Prisma.XOR + create: Prisma.XOR +} + +export type HabitUpdateWithWhereUniqueWithoutUserInput = { + where: Prisma.HabitWhereUniqueInput + data: Prisma.XOR +} + +export type HabitUpdateManyWithWhereWithoutUserInput = { + where: Prisma.HabitScalarWhereInput + data: Prisma.XOR +} + +export type HabitScalarWhereInput = { + AND?: Prisma.HabitScalarWhereInput | Prisma.HabitScalarWhereInput[] + OR?: Prisma.HabitScalarWhereInput[] + NOT?: Prisma.HabitScalarWhereInput | Prisma.HabitScalarWhereInput[] + id?: Prisma.IntFilter<"Habit"> | number + userId?: Prisma.IntFilter<"Habit"> | number + name?: Prisma.StringFilter<"Habit"> | string + period?: Prisma.StringFilter<"Habit"> | string + target?: Prisma.IntFilter<"Habit"> | number + color?: Prisma.StringFilter<"Habit"> | string + icon?: Prisma.StringFilter<"Habit"> | string + note?: Prisma.StringFilter<"Habit"> | string + archived?: Prisma.BoolFilter<"Habit"> | boolean + sortOrder?: Prisma.IntFilter<"Habit"> | number + createdAt?: Prisma.DateTimeFilter<"Habit"> | Date | string + updatedAt?: Prisma.DateTimeFilter<"Habit"> | Date | string +} + +export type HabitCreateWithoutRecordsInput = { + name: string + period?: string + target?: number + color?: string + icon?: string + note?: string + archived?: boolean + sortOrder?: number + createdAt?: Date | string + updatedAt?: Date | string + user: Prisma.UserCreateNestedOneWithoutHabitsInput +} + +export type HabitUncheckedCreateWithoutRecordsInput = { + id?: number + userId: number + name: string + period?: string + target?: number + color?: string + icon?: string + note?: string + archived?: boolean + sortOrder?: number + createdAt?: Date | string + updatedAt?: Date | string +} + +export type HabitCreateOrConnectWithoutRecordsInput = { + where: Prisma.HabitWhereUniqueInput + create: Prisma.XOR +} + +export type HabitUpsertWithoutRecordsInput = { + update: Prisma.XOR + create: Prisma.XOR + where?: Prisma.HabitWhereInput +} + +export type HabitUpdateToOneWithWhereWithoutRecordsInput = { + where?: Prisma.HabitWhereInput + data: Prisma.XOR +} + +export type HabitUpdateWithoutRecordsInput = { + name?: Prisma.StringFieldUpdateOperationsInput | string + period?: Prisma.StringFieldUpdateOperationsInput | string + target?: Prisma.IntFieldUpdateOperationsInput | number + color?: Prisma.StringFieldUpdateOperationsInput | string + icon?: Prisma.StringFieldUpdateOperationsInput | string + note?: Prisma.StringFieldUpdateOperationsInput | string + archived?: Prisma.BoolFieldUpdateOperationsInput | boolean + sortOrder?: Prisma.IntFieldUpdateOperationsInput | number + createdAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string + updatedAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string + user?: Prisma.UserUpdateOneRequiredWithoutHabitsNestedInput +} + +export type HabitUncheckedUpdateWithoutRecordsInput = { + id?: Prisma.IntFieldUpdateOperationsInput | number + userId?: Prisma.IntFieldUpdateOperationsInput | number + name?: Prisma.StringFieldUpdateOperationsInput | string + period?: Prisma.StringFieldUpdateOperationsInput | string + target?: Prisma.IntFieldUpdateOperationsInput | number + color?: Prisma.StringFieldUpdateOperationsInput | string + icon?: Prisma.StringFieldUpdateOperationsInput | string + note?: Prisma.StringFieldUpdateOperationsInput | string + archived?: Prisma.BoolFieldUpdateOperationsInput | boolean + sortOrder?: Prisma.IntFieldUpdateOperationsInput | number + createdAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string + updatedAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string +} + +export type HabitCreateManyUserInput = { + id?: number + name: string + period?: string + target?: number + color?: string + icon?: string + note?: string + archived?: boolean + sortOrder?: number + createdAt?: Date | string + updatedAt?: Date | string +} + +export type HabitUpdateWithoutUserInput = { + name?: Prisma.StringFieldUpdateOperationsInput | string + period?: Prisma.StringFieldUpdateOperationsInput | string + target?: Prisma.IntFieldUpdateOperationsInput | number + color?: Prisma.StringFieldUpdateOperationsInput | string + icon?: Prisma.StringFieldUpdateOperationsInput | string + note?: Prisma.StringFieldUpdateOperationsInput | string + archived?: Prisma.BoolFieldUpdateOperationsInput | boolean + sortOrder?: Prisma.IntFieldUpdateOperationsInput | number + createdAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string + updatedAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string + records?: Prisma.CheckInUpdateManyWithoutHabitNestedInput +} + +export type HabitUncheckedUpdateWithoutUserInput = { + id?: Prisma.IntFieldUpdateOperationsInput | number + name?: Prisma.StringFieldUpdateOperationsInput | string + period?: Prisma.StringFieldUpdateOperationsInput | string + target?: Prisma.IntFieldUpdateOperationsInput | number + color?: Prisma.StringFieldUpdateOperationsInput | string + icon?: Prisma.StringFieldUpdateOperationsInput | string + note?: Prisma.StringFieldUpdateOperationsInput | string + archived?: Prisma.BoolFieldUpdateOperationsInput | boolean + sortOrder?: Prisma.IntFieldUpdateOperationsInput | number + createdAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string + updatedAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string + records?: Prisma.CheckInUncheckedUpdateManyWithoutHabitNestedInput +} + +export type HabitUncheckedUpdateManyWithoutUserInput = { + id?: Prisma.IntFieldUpdateOperationsInput | number + name?: Prisma.StringFieldUpdateOperationsInput | string + period?: Prisma.StringFieldUpdateOperationsInput | string + target?: Prisma.IntFieldUpdateOperationsInput | number + color?: Prisma.StringFieldUpdateOperationsInput | string + icon?: Prisma.StringFieldUpdateOperationsInput | string + note?: Prisma.StringFieldUpdateOperationsInput | string + archived?: Prisma.BoolFieldUpdateOperationsInput | boolean + sortOrder?: Prisma.IntFieldUpdateOperationsInput | number + createdAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string + updatedAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string +} + + +/** + * Count Type HabitCountOutputType + */ + +export type HabitCountOutputType = { + records: number +} + +export type HabitCountOutputTypeSelect = { + records?: boolean | HabitCountOutputTypeCountRecordsArgs +} + +/** + * HabitCountOutputType without action + */ +export type HabitCountOutputTypeDefaultArgs = { + /** + * Select specific fields to fetch from the HabitCountOutputType + */ + select?: Prisma.HabitCountOutputTypeSelect | null +} + +/** + * HabitCountOutputType without action + */ +export type HabitCountOutputTypeCountRecordsArgs = { + where?: Prisma.CheckInWhereInput +} + + +export type HabitSelect = runtime.Types.Extensions.GetSelect<{ + id?: boolean + userId?: boolean + name?: boolean + period?: boolean + target?: boolean + color?: boolean + icon?: boolean + note?: boolean + archived?: boolean + sortOrder?: boolean + createdAt?: boolean + updatedAt?: boolean + user?: boolean | Prisma.UserDefaultArgs + records?: boolean | Prisma.Habit$recordsArgs + _count?: boolean | Prisma.HabitCountOutputTypeDefaultArgs +}, ExtArgs["result"]["habit"]> + + + +export type HabitSelectScalar = { + id?: boolean + userId?: boolean + name?: boolean + period?: boolean + target?: boolean + color?: boolean + icon?: boolean + note?: boolean + archived?: boolean + sortOrder?: boolean + createdAt?: boolean + updatedAt?: boolean +} + +export type HabitOmit = runtime.Types.Extensions.GetOmit<"id" | "userId" | "name" | "period" | "target" | "color" | "icon" | "note" | "archived" | "sortOrder" | "createdAt" | "updatedAt", ExtArgs["result"]["habit"]> +export type HabitInclude = { + user?: boolean | Prisma.UserDefaultArgs + records?: boolean | Prisma.Habit$recordsArgs + _count?: boolean | Prisma.HabitCountOutputTypeDefaultArgs +} + +export type $HabitPayload = { + name: "Habit" + objects: { + user: Prisma.$UserPayload + records: Prisma.$CheckInPayload[] + } + scalars: runtime.Types.Extensions.GetPayloadResult<{ + id: number + userId: number + name: string + period: string + target: number + color: string + icon: string + note: string + archived: boolean + sortOrder: number + createdAt: Date + updatedAt: Date + }, ExtArgs["result"]["habit"]> + composites: {} +} + +export type HabitGetPayload = runtime.Types.Result.GetResult + +export type HabitCountArgs = + Omit & { + select?: HabitCountAggregateInputType | true + } + +export interface HabitDelegate { + [K: symbol]: { types: Prisma.TypeMap['model']['Habit'], meta: { name: 'Habit' } } + /** + * Find zero or one Habit that matches the filter. + * @param {HabitFindUniqueArgs} args - Arguments to find a Habit + * @example + * // Get one Habit + * const habit = await prisma.habit.findUnique({ + * where: { + * // ... provide filter here + * } + * }) + */ + findUnique(args: Prisma.SelectSubset>): Prisma.Prisma__HabitClient, T, "findUnique", GlobalOmitOptions> | null, null, ExtArgs, GlobalOmitOptions> + + /** + * Find one Habit that matches the filter or throw an error with `error.code='P2025'` + * if no matches were found. + * @param {HabitFindUniqueOrThrowArgs} args - Arguments to find a Habit + * @example + * // Get one Habit + * const habit = await prisma.habit.findUniqueOrThrow({ + * where: { + * // ... provide filter here + * } + * }) + */ + findUniqueOrThrow(args: Prisma.SelectSubset>): Prisma.Prisma__HabitClient, T, "findUniqueOrThrow", GlobalOmitOptions>, never, ExtArgs, GlobalOmitOptions> + + /** + * Find the first Habit that matches the filter. + * Note, that providing `undefined` is treated as the value not being there. + * Read more here: https://pris.ly/d/null-undefined + * @param {HabitFindFirstArgs} args - Arguments to find a Habit + * @example + * // Get one Habit + * const habit = await prisma.habit.findFirst({ + * where: { + * // ... provide filter here + * } + * }) + */ + findFirst(args?: Prisma.SelectSubset>): Prisma.Prisma__HabitClient, T, "findFirst", GlobalOmitOptions> | null, null, ExtArgs, GlobalOmitOptions> + + /** + * Find the first Habit that matches the filter or + * throw `PrismaKnownClientError` with `P2025` code if no matches were found. + * Note, that providing `undefined` is treated as the value not being there. + * Read more here: https://pris.ly/d/null-undefined + * @param {HabitFindFirstOrThrowArgs} args - Arguments to find a Habit + * @example + * // Get one Habit + * const habit = await prisma.habit.findFirstOrThrow({ + * where: { + * // ... provide filter here + * } + * }) + */ + findFirstOrThrow(args?: Prisma.SelectSubset>): Prisma.Prisma__HabitClient, T, "findFirstOrThrow", GlobalOmitOptions>, never, ExtArgs, GlobalOmitOptions> + + /** + * Find zero or more Habits that matches the filter. + * Note, that providing `undefined` is treated as the value not being there. + * Read more here: https://pris.ly/d/null-undefined + * @param {HabitFindManyArgs} args - Arguments to filter and select certain fields only. + * @example + * // Get all Habits + * const habits = await prisma.habit.findMany() + * + * // Get first 10 Habits + * const habits = await prisma.habit.findMany({ take: 10 }) + * + * // Only select the `id` + * const habitWithIdOnly = await prisma.habit.findMany({ select: { id: true } }) + * + */ + findMany(args?: Prisma.SelectSubset>): Prisma.PrismaPromise, T, "findMany", GlobalOmitOptions>> + + /** + * Create a Habit. + * @param {HabitCreateArgs} args - Arguments to create a Habit. + * @example + * // Create one Habit + * const Habit = await prisma.habit.create({ + * data: { + * // ... data to create a Habit + * } + * }) + * + */ + create(args: Prisma.SelectSubset>): Prisma.Prisma__HabitClient, T, "create", GlobalOmitOptions>, never, ExtArgs, GlobalOmitOptions> + + /** + * Create many Habits. + * @param {HabitCreateManyArgs} args - Arguments to create many Habits. + * @example + * // Create many Habits + * const habit = await prisma.habit.createMany({ + * data: [ + * // ... provide data here + * ] + * }) + * + */ + createMany(args?: Prisma.SelectSubset>): Prisma.PrismaPromise + + /** + * Delete a Habit. + * @param {HabitDeleteArgs} args - Arguments to delete one Habit. + * @example + * // Delete one Habit + * const Habit = await prisma.habit.delete({ + * where: { + * // ... filter to delete one Habit + * } + * }) + * + */ + delete(args: Prisma.SelectSubset>): Prisma.Prisma__HabitClient, T, "delete", GlobalOmitOptions>, never, ExtArgs, GlobalOmitOptions> + + /** + * Update one Habit. + * @param {HabitUpdateArgs} args - Arguments to update one Habit. + * @example + * // Update one Habit + * const habit = await prisma.habit.update({ + * where: { + * // ... provide filter here + * }, + * data: { + * // ... provide data here + * } + * }) + * + */ + update(args: Prisma.SelectSubset>): Prisma.Prisma__HabitClient, T, "update", GlobalOmitOptions>, never, ExtArgs, GlobalOmitOptions> + + /** + * Delete zero or more Habits. + * @param {HabitDeleteManyArgs} args - Arguments to filter Habits to delete. + * @example + * // Delete a few Habits + * const { count } = await prisma.habit.deleteMany({ + * where: { + * // ... provide filter here + * } + * }) + * + */ + deleteMany(args?: Prisma.SelectSubset>): Prisma.PrismaPromise + + /** + * Update zero or more Habits. + * Note, that providing `undefined` is treated as the value not being there. + * Read more here: https://pris.ly/d/null-undefined + * @param {HabitUpdateManyArgs} args - Arguments to update one or more rows. + * @example + * // Update many Habits + * const habit = await prisma.habit.updateMany({ + * where: { + * // ... provide filter here + * }, + * data: { + * // ... provide data here + * } + * }) + * + */ + updateMany(args: Prisma.SelectSubset>): Prisma.PrismaPromise + + /** + * Create or update one Habit. + * @param {HabitUpsertArgs} args - Arguments to update or create a Habit. + * @example + * // Update or create a Habit + * const habit = await prisma.habit.upsert({ + * create: { + * // ... data to create a Habit + * }, + * update: { + * // ... in case it already exists, update + * }, + * where: { + * // ... the filter for the Habit we want to update + * } + * }) + */ + upsert(args: Prisma.SelectSubset>): Prisma.Prisma__HabitClient, T, "upsert", GlobalOmitOptions>, never, ExtArgs, GlobalOmitOptions> + + + /** + * Count the number of Habits. + * Note, that providing `undefined` is treated as the value not being there. + * Read more here: https://pris.ly/d/null-undefined + * @param {HabitCountArgs} args - Arguments to filter Habits to count. + * @example + * // Count the number of Habits + * const count = await prisma.habit.count({ + * where: { + * // ... the filter for the Habits we want to count + * } + * }) + **/ + count( + args?: Prisma.Subset, + ): Prisma.PrismaPromise< + T extends runtime.Types.Utils.Record<'select', any> + ? T['select'] extends true + ? number + : Prisma.GetScalarType + : number + > + + /** + * Allows you to perform aggregations operations on a Habit. + * Note, that providing `undefined` is treated as the value not being there. + * Read more here: https://pris.ly/d/null-undefined + * @param {HabitAggregateArgs} args - Select which aggregations you would like to apply and on what fields. + * @example + * // Ordered by age ascending + * // Where email contains prisma.io + * // Limited to the 10 users + * const aggregations = await prisma.user.aggregate({ + * _avg: { + * age: true, + * }, + * where: { + * email: { + * contains: "prisma.io", + * }, + * }, + * orderBy: { + * age: "asc", + * }, + * take: 10, + * }) + **/ + aggregate(args: Prisma.Subset): Prisma.PrismaPromise> + + /** + * Group by Habit. + * Note, that providing `undefined` is treated as the value not being there. + * Read more here: https://pris.ly/d/null-undefined + * @param {HabitGroupByArgs} args - Group by arguments. + * @example + * // Group by city, order by createdAt, get count + * const result = await prisma.user.groupBy({ + * by: ['city', 'createdAt'], + * orderBy: { + * createdAt: true + * }, + * _count: { + * _all: true + * }, + * }) + * + **/ + groupBy< + T extends HabitGroupByArgs, + HasSelectOrTake extends Prisma.Or< + Prisma.Extends<'skip', Prisma.Keys>, + Prisma.Extends<'take', Prisma.Keys> + >, + OrderByArg extends Prisma.True extends HasSelectOrTake + ? { orderBy: HabitGroupByArgs['orderBy'] } + : { orderBy?: HabitGroupByArgs['orderBy'] }, + OrderFields extends Prisma.ExcludeUnderscoreKeys>>, + ByFields extends Prisma.MaybeTupleToUnion, + ByValid extends Prisma.Has, + HavingFields extends Prisma.GetHavingFields, + HavingValid extends Prisma.Has, + ByEmpty extends T['by'] extends never[] ? Prisma.True : Prisma.False, + InputErrors extends ByEmpty extends Prisma.True + ? `Error: "by" must not be empty.` + : HavingValid extends Prisma.False + ? { + [P in HavingFields]: P extends ByFields + ? never + : P extends string + ? `Error: Field "${P}" used in "having" needs to be provided in "by".` + : [ + Error, + 'Field ', + P, + ` in "having" needs to be provided in "by"`, + ] + }[HavingFields] + : 'take' extends Prisma.Keys + ? 'orderBy' extends Prisma.Keys + ? ByValid extends Prisma.True + ? {} + : { + [P in OrderFields]: P extends ByFields + ? never + : `Error: Field "${P}" in "orderBy" needs to be provided in "by"` + }[OrderFields] + : 'Error: If you provide "take", you also need to provide "orderBy"' + : 'skip' extends Prisma.Keys + ? 'orderBy' extends Prisma.Keys + ? ByValid extends Prisma.True + ? {} + : { + [P in OrderFields]: P extends ByFields + ? never + : `Error: Field "${P}" in "orderBy" needs to be provided in "by"` + }[OrderFields] + : 'Error: If you provide "skip", you also need to provide "orderBy"' + : ByValid extends Prisma.True + ? {} + : { + [P in OrderFields]: P extends ByFields + ? never + : `Error: Field "${P}" in "orderBy" needs to be provided in "by"` + }[OrderFields] + >(args: Prisma.SubsetIntersection & InputErrors): {} extends InputErrors ? GetHabitGroupByPayload : Prisma.PrismaPromise +/** + * Fields of the Habit model + */ +readonly fields: HabitFieldRefs; +} + +/** + * The delegate class that acts as a "Promise-like" for Habit. + * Why is this prefixed with `Prisma__`? + * Because we want to prevent naming conflicts as mentioned in + * https://github.com/prisma/prisma-client-js/issues/707 + */ +export interface Prisma__HabitClient extends Prisma.PrismaPromise { + readonly [Symbol.toStringTag]: "PrismaPromise" + user = {}>(args?: Prisma.Subset>): Prisma.Prisma__UserClient, T, "findUniqueOrThrow", GlobalOmitOptions> | Null, Null, ExtArgs, GlobalOmitOptions> + records = {}>(args?: Prisma.Subset>): Prisma.PrismaPromise, T, "findMany", GlobalOmitOptions> | Null> + /** + * Attaches callbacks for the resolution and/or rejection of the Promise. + * @param onfulfilled The callback to execute when the Promise is resolved. + * @param onrejected The callback to execute when the Promise is rejected. + * @returns A Promise for the completion of which ever callback is executed. + */ + then(onfulfilled?: ((value: T) => TResult1 | PromiseLike) | undefined | null, onrejected?: ((reason: any) => TResult2 | PromiseLike) | undefined | null): runtime.Types.Utils.JsPromise + /** + * Attaches a callback for only the rejection of the Promise. + * @param onrejected The callback to execute when the Promise is rejected. + * @returns A Promise for the completion of the callback. + */ + catch(onrejected?: ((reason: any) => TResult | PromiseLike) | undefined | null): runtime.Types.Utils.JsPromise + /** + * Attaches a callback that is invoked when the Promise is settled (fulfilled or rejected). The + * resolved value cannot be modified from the callback. + * @param onfinally The callback to execute when the Promise is settled (fulfilled or rejected). + * @returns A Promise for the completion of the callback. + */ + finally(onfinally?: (() => void) | undefined | null): runtime.Types.Utils.JsPromise +} + + + + +/** + * Fields of the Habit model + */ +export interface HabitFieldRefs { + readonly id: Prisma.FieldRef<"Habit", 'Int'> + readonly userId: Prisma.FieldRef<"Habit", 'Int'> + readonly name: Prisma.FieldRef<"Habit", 'String'> + readonly period: Prisma.FieldRef<"Habit", 'String'> + readonly target: Prisma.FieldRef<"Habit", 'Int'> + readonly color: Prisma.FieldRef<"Habit", 'String'> + readonly icon: Prisma.FieldRef<"Habit", 'String'> + readonly note: Prisma.FieldRef<"Habit", 'String'> + readonly archived: Prisma.FieldRef<"Habit", 'Boolean'> + readonly sortOrder: Prisma.FieldRef<"Habit", 'Int'> + readonly createdAt: Prisma.FieldRef<"Habit", 'DateTime'> + readonly updatedAt: Prisma.FieldRef<"Habit", 'DateTime'> +} + + +// Custom InputTypes +/** + * Habit findUnique + */ +export type HabitFindUniqueArgs = { + /** + * Select specific fields to fetch from the Habit + */ + select?: Prisma.HabitSelect | null + /** + * Omit specific fields from the Habit + */ + omit?: Prisma.HabitOmit | null + /** + * Choose, which related nodes to fetch as well + */ + include?: Prisma.HabitInclude | null + /** + * Filter, which Habit to fetch. + */ + where: Prisma.HabitWhereUniqueInput +} + +/** + * Habit findUniqueOrThrow + */ +export type HabitFindUniqueOrThrowArgs = { + /** + * Select specific fields to fetch from the Habit + */ + select?: Prisma.HabitSelect | null + /** + * Omit specific fields from the Habit + */ + omit?: Prisma.HabitOmit | null + /** + * Choose, which related nodes to fetch as well + */ + include?: Prisma.HabitInclude | null + /** + * Filter, which Habit to fetch. + */ + where: Prisma.HabitWhereUniqueInput +} + +/** + * Habit findFirst + */ +export type HabitFindFirstArgs = { + /** + * Select specific fields to fetch from the Habit + */ + select?: Prisma.HabitSelect | null + /** + * Omit specific fields from the Habit + */ + omit?: Prisma.HabitOmit | null + /** + * Choose, which related nodes to fetch as well + */ + include?: Prisma.HabitInclude | null + /** + * Filter, which Habit to fetch. + */ + where?: Prisma.HabitWhereInput + /** + * {@link https://www.prisma.io/docs/concepts/components/prisma-client/sorting Sorting Docs} + * + * Determine the order of Habits to fetch. + */ + orderBy?: Prisma.HabitOrderByWithRelationInput | Prisma.HabitOrderByWithRelationInput[] + /** + * {@link https://www.prisma.io/docs/concepts/components/prisma-client/pagination#cursor-based-pagination Cursor Docs} + * + * Sets the position for searching for Habits. + */ + cursor?: Prisma.HabitWhereUniqueInput + /** + * {@link https://www.prisma.io/docs/concepts/components/prisma-client/pagination Pagination Docs} + * + * Take `±n` Habits from the position of the cursor. + */ + take?: number + /** + * {@link https://www.prisma.io/docs/concepts/components/prisma-client/pagination Pagination Docs} + * + * Skip the first `n` Habits. + */ + skip?: number + /** + * {@link https://www.prisma.io/docs/concepts/components/prisma-client/distinct Distinct Docs} + * + * Filter by unique combinations of Habits. + */ + distinct?: Prisma.HabitScalarFieldEnum | Prisma.HabitScalarFieldEnum[] +} + +/** + * Habit findFirstOrThrow + */ +export type HabitFindFirstOrThrowArgs = { + /** + * Select specific fields to fetch from the Habit + */ + select?: Prisma.HabitSelect | null + /** + * Omit specific fields from the Habit + */ + omit?: Prisma.HabitOmit | null + /** + * Choose, which related nodes to fetch as well + */ + include?: Prisma.HabitInclude | null + /** + * Filter, which Habit to fetch. + */ + where?: Prisma.HabitWhereInput + /** + * {@link https://www.prisma.io/docs/concepts/components/prisma-client/sorting Sorting Docs} + * + * Determine the order of Habits to fetch. + */ + orderBy?: Prisma.HabitOrderByWithRelationInput | Prisma.HabitOrderByWithRelationInput[] + /** + * {@link https://www.prisma.io/docs/concepts/components/prisma-client/pagination#cursor-based-pagination Cursor Docs} + * + * Sets the position for searching for Habits. + */ + cursor?: Prisma.HabitWhereUniqueInput + /** + * {@link https://www.prisma.io/docs/concepts/components/prisma-client/pagination Pagination Docs} + * + * Take `±n` Habits from the position of the cursor. + */ + take?: number + /** + * {@link https://www.prisma.io/docs/concepts/components/prisma-client/pagination Pagination Docs} + * + * Skip the first `n` Habits. + */ + skip?: number + /** + * {@link https://www.prisma.io/docs/concepts/components/prisma-client/distinct Distinct Docs} + * + * Filter by unique combinations of Habits. + */ + distinct?: Prisma.HabitScalarFieldEnum | Prisma.HabitScalarFieldEnum[] +} + +/** + * Habit findMany + */ +export type HabitFindManyArgs = { + /** + * Select specific fields to fetch from the Habit + */ + select?: Prisma.HabitSelect | null + /** + * Omit specific fields from the Habit + */ + omit?: Prisma.HabitOmit | null + /** + * Choose, which related nodes to fetch as well + */ + include?: Prisma.HabitInclude | null + /** + * Filter, which Habits to fetch. + */ + where?: Prisma.HabitWhereInput + /** + * {@link https://www.prisma.io/docs/concepts/components/prisma-client/sorting Sorting Docs} + * + * Determine the order of Habits to fetch. + */ + orderBy?: Prisma.HabitOrderByWithRelationInput | Prisma.HabitOrderByWithRelationInput[] + /** + * {@link https://www.prisma.io/docs/concepts/components/prisma-client/pagination#cursor-based-pagination Cursor Docs} + * + * Sets the position for listing Habits. + */ + cursor?: Prisma.HabitWhereUniqueInput + /** + * {@link https://www.prisma.io/docs/concepts/components/prisma-client/pagination Pagination Docs} + * + * Take `±n` Habits from the position of the cursor. + */ + take?: number + /** + * {@link https://www.prisma.io/docs/concepts/components/prisma-client/pagination Pagination Docs} + * + * Skip the first `n` Habits. + */ + skip?: number + /** + * {@link https://www.prisma.io/docs/concepts/components/prisma-client/distinct Distinct Docs} + * + * Filter by unique combinations of Habits. + */ + distinct?: Prisma.HabitScalarFieldEnum | Prisma.HabitScalarFieldEnum[] +} + +/** + * Habit create + */ +export type HabitCreateArgs = { + /** + * Select specific fields to fetch from the Habit + */ + select?: Prisma.HabitSelect | null + /** + * Omit specific fields from the Habit + */ + omit?: Prisma.HabitOmit | null + /** + * Choose, which related nodes to fetch as well + */ + include?: Prisma.HabitInclude | null + /** + * The data needed to create a Habit. + */ + data: Prisma.XOR +} + +/** + * Habit createMany + */ +export type HabitCreateManyArgs = { + /** + * The data used to create many Habits. + */ + data: Prisma.HabitCreateManyInput | Prisma.HabitCreateManyInput[] + skipDuplicates?: boolean +} + +/** + * Habit update + */ +export type HabitUpdateArgs = { + /** + * Select specific fields to fetch from the Habit + */ + select?: Prisma.HabitSelect | null + /** + * Omit specific fields from the Habit + */ + omit?: Prisma.HabitOmit | null + /** + * Choose, which related nodes to fetch as well + */ + include?: Prisma.HabitInclude | null + /** + * The data needed to update a Habit. + */ + data: Prisma.XOR + /** + * Choose, which Habit to update. + */ + where: Prisma.HabitWhereUniqueInput +} + +/** + * Habit updateMany + */ +export type HabitUpdateManyArgs = { + /** + * The data used to update Habits. + */ + data: Prisma.XOR + /** + * Filter which Habits to update + */ + where?: Prisma.HabitWhereInput + /** + * Limit how many Habits to update. + */ + limit?: number +} + +/** + * Habit upsert + */ +export type HabitUpsertArgs = { + /** + * Select specific fields to fetch from the Habit + */ + select?: Prisma.HabitSelect | null + /** + * Omit specific fields from the Habit + */ + omit?: Prisma.HabitOmit | null + /** + * Choose, which related nodes to fetch as well + */ + include?: Prisma.HabitInclude | null + /** + * The filter to search for the Habit to update in case it exists. + */ + where: Prisma.HabitWhereUniqueInput + /** + * In case the Habit found by the `where` argument doesn't exist, create a new Habit with this data. + */ + create: Prisma.XOR + /** + * In case the Habit was found with the provided `where` argument, update it with this data. + */ + update: Prisma.XOR +} + +/** + * Habit delete + */ +export type HabitDeleteArgs = { + /** + * Select specific fields to fetch from the Habit + */ + select?: Prisma.HabitSelect | null + /** + * Omit specific fields from the Habit + */ + omit?: Prisma.HabitOmit | null + /** + * Choose, which related nodes to fetch as well + */ + include?: Prisma.HabitInclude | null + /** + * Filter which Habit to delete. + */ + where: Prisma.HabitWhereUniqueInput +} + +/** + * Habit deleteMany + */ +export type HabitDeleteManyArgs = { + /** + * Filter which Habits to delete + */ + where?: Prisma.HabitWhereInput + /** + * Limit how many Habits to delete. + */ + limit?: number +} + +/** + * Habit.records + */ +export type Habit$recordsArgs = { + /** + * Select specific fields to fetch from the CheckIn + */ + select?: Prisma.CheckInSelect | null + /** + * Omit specific fields from the CheckIn + */ + omit?: Prisma.CheckInOmit | null + /** + * Choose, which related nodes to fetch as well + */ + include?: Prisma.CheckInInclude | null + where?: Prisma.CheckInWhereInput + orderBy?: Prisma.CheckInOrderByWithRelationInput | Prisma.CheckInOrderByWithRelationInput[] + cursor?: Prisma.CheckInWhereUniqueInput + take?: number + skip?: number + distinct?: Prisma.CheckInScalarFieldEnum | Prisma.CheckInScalarFieldEnum[] +} + +/** + * Habit without action + */ +export type HabitDefaultArgs = { + /** + * Select specific fields to fetch from the Habit + */ + select?: Prisma.HabitSelect | null + /** + * Omit specific fields from the Habit + */ + omit?: Prisma.HabitOmit | null + /** + * Choose, which related nodes to fetch as well + */ + include?: Prisma.HabitInclude | null +} diff --git a/generated/prisma/models/User.ts b/generated/prisma/models/User.ts index de9031e..3f166ca 100644 --- a/generated/prisma/models/User.ts +++ b/generated/prisma/models/User.ts @@ -224,6 +224,10 @@ export type UserWhereInput = { password?: Prisma.StringFilter<"User"> | string createdAt?: Prisma.DateTimeFilter<"User"> | Date | string updatedAt?: Prisma.DateTimeFilter<"User"> | Date | string + habits?: Prisma.HabitListRelationFilter + checkIns?: Prisma.CheckInListRelationFilter + checkLists?: Prisma.CheckListListRelationFilter + templates?: Prisma.CheckListTemplateListRelationFilter } export type UserOrderByWithRelationInput = { @@ -233,6 +237,10 @@ export type UserOrderByWithRelationInput = { password?: Prisma.SortOrder createdAt?: Prisma.SortOrder updatedAt?: Prisma.SortOrder + habits?: Prisma.HabitOrderByRelationAggregateInput + checkIns?: Prisma.CheckInOrderByRelationAggregateInput + checkLists?: Prisma.CheckListOrderByRelationAggregateInput + templates?: Prisma.CheckListTemplateOrderByRelationAggregateInput _relevance?: Prisma.UserOrderByRelevanceInput } @@ -246,6 +254,10 @@ export type UserWhereUniqueInput = Prisma.AtLeast<{ password?: Prisma.StringFilter<"User"> | string createdAt?: Prisma.DateTimeFilter<"User"> | Date | string updatedAt?: Prisma.DateTimeFilter<"User"> | Date | string + habits?: Prisma.HabitListRelationFilter + checkIns?: Prisma.CheckInListRelationFilter + checkLists?: Prisma.CheckListListRelationFilter + templates?: Prisma.CheckListTemplateListRelationFilter }, "id" | "email"> export type UserOrderByWithAggregationInput = { @@ -280,6 +292,10 @@ export type UserCreateInput = { password: string createdAt?: Date | string updatedAt?: Date | string + habits?: Prisma.HabitCreateNestedManyWithoutUserInput + checkIns?: Prisma.CheckInCreateNestedManyWithoutUserInput + checkLists?: Prisma.CheckListCreateNestedManyWithoutUserInput + templates?: Prisma.CheckListTemplateCreateNestedManyWithoutUserInput } export type UserUncheckedCreateInput = { @@ -289,6 +305,10 @@ export type UserUncheckedCreateInput = { password: string createdAt?: Date | string updatedAt?: Date | string + habits?: Prisma.HabitUncheckedCreateNestedManyWithoutUserInput + checkIns?: Prisma.CheckInUncheckedCreateNestedManyWithoutUserInput + checkLists?: Prisma.CheckListUncheckedCreateNestedManyWithoutUserInput + templates?: Prisma.CheckListTemplateUncheckedCreateNestedManyWithoutUserInput } export type UserUpdateInput = { @@ -297,6 +317,10 @@ export type UserUpdateInput = { password?: Prisma.StringFieldUpdateOperationsInput | string createdAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string updatedAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string + habits?: Prisma.HabitUpdateManyWithoutUserNestedInput + checkIns?: Prisma.CheckInUpdateManyWithoutUserNestedInput + checkLists?: Prisma.CheckListUpdateManyWithoutUserNestedInput + templates?: Prisma.CheckListTemplateUpdateManyWithoutUserNestedInput } export type UserUncheckedUpdateInput = { @@ -306,6 +330,10 @@ export type UserUncheckedUpdateInput = { password?: Prisma.StringFieldUpdateOperationsInput | string createdAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string updatedAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string + habits?: Prisma.HabitUncheckedUpdateManyWithoutUserNestedInput + checkIns?: Prisma.CheckInUncheckedUpdateManyWithoutUserNestedInput + checkLists?: Prisma.CheckListUncheckedUpdateManyWithoutUserNestedInput + templates?: Prisma.CheckListTemplateUncheckedUpdateManyWithoutUserNestedInput } export type UserCreateManyInput = { @@ -375,6 +403,16 @@ export type UserSumOrderByAggregateInput = { id?: Prisma.SortOrder } +export type UserScalarRelationFilter = { + is?: Prisma.UserWhereInput + isNot?: Prisma.UserWhereInput +} + +export type UserNullableScalarRelationFilter = { + is?: Prisma.UserWhereInput | null + isNot?: Prisma.UserWhereInput | null +} + export type StringFieldUpdateOperationsInput = { set?: string } @@ -391,6 +429,368 @@ export type IntFieldUpdateOperationsInput = { divide?: number } +export type UserCreateNestedOneWithoutHabitsInput = { + create?: Prisma.XOR + connectOrCreate?: Prisma.UserCreateOrConnectWithoutHabitsInput + connect?: Prisma.UserWhereUniqueInput +} + +export type UserUpdateOneRequiredWithoutHabitsNestedInput = { + create?: Prisma.XOR + connectOrCreate?: Prisma.UserCreateOrConnectWithoutHabitsInput + upsert?: Prisma.UserUpsertWithoutHabitsInput + connect?: Prisma.UserWhereUniqueInput + update?: Prisma.XOR, Prisma.UserUncheckedUpdateWithoutHabitsInput> +} + +export type UserCreateNestedOneWithoutCheckInsInput = { + create?: Prisma.XOR + connectOrCreate?: Prisma.UserCreateOrConnectWithoutCheckInsInput + connect?: Prisma.UserWhereUniqueInput +} + +export type UserUpdateOneRequiredWithoutCheckInsNestedInput = { + create?: Prisma.XOR + connectOrCreate?: Prisma.UserCreateOrConnectWithoutCheckInsInput + upsert?: Prisma.UserUpsertWithoutCheckInsInput + connect?: Prisma.UserWhereUniqueInput + update?: Prisma.XOR, Prisma.UserUncheckedUpdateWithoutCheckInsInput> +} + +export type UserCreateNestedOneWithoutCheckListsInput = { + create?: Prisma.XOR + connectOrCreate?: Prisma.UserCreateOrConnectWithoutCheckListsInput + connect?: Prisma.UserWhereUniqueInput +} + +export type UserUpdateOneRequiredWithoutCheckListsNestedInput = { + create?: Prisma.XOR + connectOrCreate?: Prisma.UserCreateOrConnectWithoutCheckListsInput + upsert?: Prisma.UserUpsertWithoutCheckListsInput + connect?: Prisma.UserWhereUniqueInput + update?: Prisma.XOR, Prisma.UserUncheckedUpdateWithoutCheckListsInput> +} + +export type UserCreateNestedOneWithoutTemplatesInput = { + create?: Prisma.XOR + connectOrCreate?: Prisma.UserCreateOrConnectWithoutTemplatesInput + connect?: Prisma.UserWhereUniqueInput +} + +export type UserUpdateOneWithoutTemplatesNestedInput = { + create?: Prisma.XOR + connectOrCreate?: Prisma.UserCreateOrConnectWithoutTemplatesInput + upsert?: Prisma.UserUpsertWithoutTemplatesInput + disconnect?: Prisma.UserWhereInput | boolean + delete?: Prisma.UserWhereInput | boolean + connect?: Prisma.UserWhereUniqueInput + update?: Prisma.XOR, Prisma.UserUncheckedUpdateWithoutTemplatesInput> +} + +export type UserCreateWithoutHabitsInput = { + name: string + email: string + password: string + createdAt?: Date | string + updatedAt?: Date | string + checkIns?: Prisma.CheckInCreateNestedManyWithoutUserInput + checkLists?: Prisma.CheckListCreateNestedManyWithoutUserInput + templates?: Prisma.CheckListTemplateCreateNestedManyWithoutUserInput +} + +export type UserUncheckedCreateWithoutHabitsInput = { + id?: number + name: string + email: string + password: string + createdAt?: Date | string + updatedAt?: Date | string + checkIns?: Prisma.CheckInUncheckedCreateNestedManyWithoutUserInput + checkLists?: Prisma.CheckListUncheckedCreateNestedManyWithoutUserInput + templates?: Prisma.CheckListTemplateUncheckedCreateNestedManyWithoutUserInput +} + +export type UserCreateOrConnectWithoutHabitsInput = { + where: Prisma.UserWhereUniqueInput + create: Prisma.XOR +} + +export type UserUpsertWithoutHabitsInput = { + update: Prisma.XOR + create: Prisma.XOR + where?: Prisma.UserWhereInput +} + +export type UserUpdateToOneWithWhereWithoutHabitsInput = { + where?: Prisma.UserWhereInput + data: Prisma.XOR +} + +export type UserUpdateWithoutHabitsInput = { + name?: Prisma.StringFieldUpdateOperationsInput | string + email?: Prisma.StringFieldUpdateOperationsInput | string + password?: Prisma.StringFieldUpdateOperationsInput | string + createdAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string + updatedAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string + checkIns?: Prisma.CheckInUpdateManyWithoutUserNestedInput + checkLists?: Prisma.CheckListUpdateManyWithoutUserNestedInput + templates?: Prisma.CheckListTemplateUpdateManyWithoutUserNestedInput +} + +export type UserUncheckedUpdateWithoutHabitsInput = { + id?: Prisma.IntFieldUpdateOperationsInput | number + name?: Prisma.StringFieldUpdateOperationsInput | string + email?: Prisma.StringFieldUpdateOperationsInput | string + password?: Prisma.StringFieldUpdateOperationsInput | string + createdAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string + updatedAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string + checkIns?: Prisma.CheckInUncheckedUpdateManyWithoutUserNestedInput + checkLists?: Prisma.CheckListUncheckedUpdateManyWithoutUserNestedInput + templates?: Prisma.CheckListTemplateUncheckedUpdateManyWithoutUserNestedInput +} + +export type UserCreateWithoutCheckInsInput = { + name: string + email: string + password: string + createdAt?: Date | string + updatedAt?: Date | string + habits?: Prisma.HabitCreateNestedManyWithoutUserInput + checkLists?: Prisma.CheckListCreateNestedManyWithoutUserInput + templates?: Prisma.CheckListTemplateCreateNestedManyWithoutUserInput +} + +export type UserUncheckedCreateWithoutCheckInsInput = { + id?: number + name: string + email: string + password: string + createdAt?: Date | string + updatedAt?: Date | string + habits?: Prisma.HabitUncheckedCreateNestedManyWithoutUserInput + checkLists?: Prisma.CheckListUncheckedCreateNestedManyWithoutUserInput + templates?: Prisma.CheckListTemplateUncheckedCreateNestedManyWithoutUserInput +} + +export type UserCreateOrConnectWithoutCheckInsInput = { + where: Prisma.UserWhereUniqueInput + create: Prisma.XOR +} + +export type UserUpsertWithoutCheckInsInput = { + update: Prisma.XOR + create: Prisma.XOR + where?: Prisma.UserWhereInput +} + +export type UserUpdateToOneWithWhereWithoutCheckInsInput = { + where?: Prisma.UserWhereInput + data: Prisma.XOR +} + +export type UserUpdateWithoutCheckInsInput = { + name?: Prisma.StringFieldUpdateOperationsInput | string + email?: Prisma.StringFieldUpdateOperationsInput | string + password?: Prisma.StringFieldUpdateOperationsInput | string + createdAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string + updatedAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string + habits?: Prisma.HabitUpdateManyWithoutUserNestedInput + checkLists?: Prisma.CheckListUpdateManyWithoutUserNestedInput + templates?: Prisma.CheckListTemplateUpdateManyWithoutUserNestedInput +} + +export type UserUncheckedUpdateWithoutCheckInsInput = { + id?: Prisma.IntFieldUpdateOperationsInput | number + name?: Prisma.StringFieldUpdateOperationsInput | string + email?: Prisma.StringFieldUpdateOperationsInput | string + password?: Prisma.StringFieldUpdateOperationsInput | string + createdAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string + updatedAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string + habits?: Prisma.HabitUncheckedUpdateManyWithoutUserNestedInput + checkLists?: Prisma.CheckListUncheckedUpdateManyWithoutUserNestedInput + templates?: Prisma.CheckListTemplateUncheckedUpdateManyWithoutUserNestedInput +} + +export type UserCreateWithoutCheckListsInput = { + name: string + email: string + password: string + createdAt?: Date | string + updatedAt?: Date | string + habits?: Prisma.HabitCreateNestedManyWithoutUserInput + checkIns?: Prisma.CheckInCreateNestedManyWithoutUserInput + templates?: Prisma.CheckListTemplateCreateNestedManyWithoutUserInput +} + +export type UserUncheckedCreateWithoutCheckListsInput = { + id?: number + name: string + email: string + password: string + createdAt?: Date | string + updatedAt?: Date | string + habits?: Prisma.HabitUncheckedCreateNestedManyWithoutUserInput + checkIns?: Prisma.CheckInUncheckedCreateNestedManyWithoutUserInput + templates?: Prisma.CheckListTemplateUncheckedCreateNestedManyWithoutUserInput +} + +export type UserCreateOrConnectWithoutCheckListsInput = { + where: Prisma.UserWhereUniqueInput + create: Prisma.XOR +} + +export type UserUpsertWithoutCheckListsInput = { + update: Prisma.XOR + create: Prisma.XOR + where?: Prisma.UserWhereInput +} + +export type UserUpdateToOneWithWhereWithoutCheckListsInput = { + where?: Prisma.UserWhereInput + data: Prisma.XOR +} + +export type UserUpdateWithoutCheckListsInput = { + name?: Prisma.StringFieldUpdateOperationsInput | string + email?: Prisma.StringFieldUpdateOperationsInput | string + password?: Prisma.StringFieldUpdateOperationsInput | string + createdAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string + updatedAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string + habits?: Prisma.HabitUpdateManyWithoutUserNestedInput + checkIns?: Prisma.CheckInUpdateManyWithoutUserNestedInput + templates?: Prisma.CheckListTemplateUpdateManyWithoutUserNestedInput +} + +export type UserUncheckedUpdateWithoutCheckListsInput = { + id?: Prisma.IntFieldUpdateOperationsInput | number + name?: Prisma.StringFieldUpdateOperationsInput | string + email?: Prisma.StringFieldUpdateOperationsInput | string + password?: Prisma.StringFieldUpdateOperationsInput | string + createdAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string + updatedAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string + habits?: Prisma.HabitUncheckedUpdateManyWithoutUserNestedInput + checkIns?: Prisma.CheckInUncheckedUpdateManyWithoutUserNestedInput + templates?: Prisma.CheckListTemplateUncheckedUpdateManyWithoutUserNestedInput +} + +export type UserCreateWithoutTemplatesInput = { + name: string + email: string + password: string + createdAt?: Date | string + updatedAt?: Date | string + habits?: Prisma.HabitCreateNestedManyWithoutUserInput + checkIns?: Prisma.CheckInCreateNestedManyWithoutUserInput + checkLists?: Prisma.CheckListCreateNestedManyWithoutUserInput +} + +export type UserUncheckedCreateWithoutTemplatesInput = { + id?: number + name: string + email: string + password: string + createdAt?: Date | string + updatedAt?: Date | string + habits?: Prisma.HabitUncheckedCreateNestedManyWithoutUserInput + checkIns?: Prisma.CheckInUncheckedCreateNestedManyWithoutUserInput + checkLists?: Prisma.CheckListUncheckedCreateNestedManyWithoutUserInput +} + +export type UserCreateOrConnectWithoutTemplatesInput = { + where: Prisma.UserWhereUniqueInput + create: Prisma.XOR +} + +export type UserUpsertWithoutTemplatesInput = { + update: Prisma.XOR + create: Prisma.XOR + where?: Prisma.UserWhereInput +} + +export type UserUpdateToOneWithWhereWithoutTemplatesInput = { + where?: Prisma.UserWhereInput + data: Prisma.XOR +} + +export type UserUpdateWithoutTemplatesInput = { + name?: Prisma.StringFieldUpdateOperationsInput | string + email?: Prisma.StringFieldUpdateOperationsInput | string + password?: Prisma.StringFieldUpdateOperationsInput | string + createdAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string + updatedAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string + habits?: Prisma.HabitUpdateManyWithoutUserNestedInput + checkIns?: Prisma.CheckInUpdateManyWithoutUserNestedInput + checkLists?: Prisma.CheckListUpdateManyWithoutUserNestedInput +} + +export type UserUncheckedUpdateWithoutTemplatesInput = { + id?: Prisma.IntFieldUpdateOperationsInput | number + name?: Prisma.StringFieldUpdateOperationsInput | string + email?: Prisma.StringFieldUpdateOperationsInput | string + password?: Prisma.StringFieldUpdateOperationsInput | string + createdAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string + updatedAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string + habits?: Prisma.HabitUncheckedUpdateManyWithoutUserNestedInput + checkIns?: Prisma.CheckInUncheckedUpdateManyWithoutUserNestedInput + checkLists?: Prisma.CheckListUncheckedUpdateManyWithoutUserNestedInput +} + + +/** + * Count Type UserCountOutputType + */ + +export type UserCountOutputType = { + habits: number + checkIns: number + checkLists: number + templates: number +} + +export type UserCountOutputTypeSelect = { + habits?: boolean | UserCountOutputTypeCountHabitsArgs + checkIns?: boolean | UserCountOutputTypeCountCheckInsArgs + checkLists?: boolean | UserCountOutputTypeCountCheckListsArgs + templates?: boolean | UserCountOutputTypeCountTemplatesArgs +} + +/** + * UserCountOutputType without action + */ +export type UserCountOutputTypeDefaultArgs = { + /** + * Select specific fields to fetch from the UserCountOutputType + */ + select?: Prisma.UserCountOutputTypeSelect | null +} + +/** + * UserCountOutputType without action + */ +export type UserCountOutputTypeCountHabitsArgs = { + where?: Prisma.HabitWhereInput +} + +/** + * UserCountOutputType without action + */ +export type UserCountOutputTypeCountCheckInsArgs = { + where?: Prisma.CheckInWhereInput +} + +/** + * UserCountOutputType without action + */ +export type UserCountOutputTypeCountCheckListsArgs = { + where?: Prisma.CheckListWhereInput +} + +/** + * UserCountOutputType without action + */ +export type UserCountOutputTypeCountTemplatesArgs = { + where?: Prisma.CheckListTemplateWhereInput +} export type UserSelect = runtime.Types.Extensions.GetSelect<{ @@ -400,6 +800,11 @@ export type UserSelect + checkIns?: boolean | Prisma.User$checkInsArgs + checkLists?: boolean | Prisma.User$checkListsArgs + templates?: boolean | Prisma.User$templatesArgs + _count?: boolean | Prisma.UserCountOutputTypeDefaultArgs }, ExtArgs["result"]["user"]> @@ -414,10 +819,22 @@ export type UserSelectScalar = { } export type UserOmit = runtime.Types.Extensions.GetOmit<"id" | "name" | "email" | "password" | "createdAt" | "updatedAt", ExtArgs["result"]["user"]> +export type UserInclude = { + habits?: boolean | Prisma.User$habitsArgs + checkIns?: boolean | Prisma.User$checkInsArgs + checkLists?: boolean | Prisma.User$checkListsArgs + templates?: boolean | Prisma.User$templatesArgs + _count?: boolean | Prisma.UserCountOutputTypeDefaultArgs +} export type $UserPayload = { name: "User" - objects: {} + objects: { + habits: Prisma.$HabitPayload[] + checkIns: Prisma.$CheckInPayload[] + checkLists: Prisma.$CheckListPayload[] + templates: Prisma.$CheckListTemplatePayload[] + } scalars: runtime.Types.Extensions.GetPayloadResult<{ id: number name: string @@ -765,6 +1182,10 @@ readonly fields: UserFieldRefs; */ export interface Prisma__UserClient extends Prisma.PrismaPromise { readonly [Symbol.toStringTag]: "PrismaPromise" + habits = {}>(args?: Prisma.Subset>): Prisma.PrismaPromise, T, "findMany", GlobalOmitOptions> | Null> + checkIns = {}>(args?: Prisma.Subset>): Prisma.PrismaPromise, T, "findMany", GlobalOmitOptions> | Null> + checkLists = {}>(args?: Prisma.Subset>): Prisma.PrismaPromise, T, "findMany", GlobalOmitOptions> | Null> + templates = {}>(args?: Prisma.Subset>): Prisma.PrismaPromise, T, "findMany", GlobalOmitOptions> | Null> /** * Attaches callbacks for the resolution and/or rejection of the Promise. * @param onfulfilled The callback to execute when the Promise is resolved. @@ -816,6 +1237,10 @@ export type UserFindUniqueArgs | null + /** + * Choose, which related nodes to fetch as well + */ + include?: Prisma.UserInclude | null /** * Filter, which User to fetch. */ @@ -834,6 +1259,10 @@ export type UserFindUniqueOrThrowArgs | null + /** + * Choose, which related nodes to fetch as well + */ + include?: Prisma.UserInclude | null /** * Filter, which User to fetch. */ @@ -852,6 +1281,10 @@ export type UserFindFirstArgs | null + /** + * Choose, which related nodes to fetch as well + */ + include?: Prisma.UserInclude | null /** * Filter, which User to fetch. */ @@ -900,6 +1333,10 @@ export type UserFindFirstOrThrowArgs | null + /** + * Choose, which related nodes to fetch as well + */ + include?: Prisma.UserInclude | null /** * Filter, which User to fetch. */ @@ -948,6 +1385,10 @@ export type UserFindManyArgs | null + /** + * Choose, which related nodes to fetch as well + */ + include?: Prisma.UserInclude | null /** * Filter, which Users to fetch. */ @@ -996,6 +1437,10 @@ export type UserCreateArgs | null + /** + * Choose, which related nodes to fetch as well + */ + include?: Prisma.UserInclude | null /** * The data needed to create a User. */ @@ -1025,6 +1470,10 @@ export type UserUpdateArgs | null + /** + * Choose, which related nodes to fetch as well + */ + include?: Prisma.UserInclude | null /** * The data needed to update a User. */ @@ -1065,6 +1514,10 @@ export type UserUpsertArgs | null + /** + * Choose, which related nodes to fetch as well + */ + include?: Prisma.UserInclude | null /** * The filter to search for the User to update in case it exists. */ @@ -1091,6 +1544,10 @@ export type UserDeleteArgs | null + /** + * Choose, which related nodes to fetch as well + */ + include?: Prisma.UserInclude | null /** * Filter which User to delete. */ @@ -1111,6 +1568,102 @@ export type UserDeleteManyArgs = { + /** + * Select specific fields to fetch from the Habit + */ + select?: Prisma.HabitSelect | null + /** + * Omit specific fields from the Habit + */ + omit?: Prisma.HabitOmit | null + /** + * Choose, which related nodes to fetch as well + */ + include?: Prisma.HabitInclude | null + where?: Prisma.HabitWhereInput + orderBy?: Prisma.HabitOrderByWithRelationInput | Prisma.HabitOrderByWithRelationInput[] + cursor?: Prisma.HabitWhereUniqueInput + take?: number + skip?: number + distinct?: Prisma.HabitScalarFieldEnum | Prisma.HabitScalarFieldEnum[] +} + +/** + * User.checkIns + */ +export type User$checkInsArgs = { + /** + * Select specific fields to fetch from the CheckIn + */ + select?: Prisma.CheckInSelect | null + /** + * Omit specific fields from the CheckIn + */ + omit?: Prisma.CheckInOmit | null + /** + * Choose, which related nodes to fetch as well + */ + include?: Prisma.CheckInInclude | null + where?: Prisma.CheckInWhereInput + orderBy?: Prisma.CheckInOrderByWithRelationInput | Prisma.CheckInOrderByWithRelationInput[] + cursor?: Prisma.CheckInWhereUniqueInput + take?: number + skip?: number + distinct?: Prisma.CheckInScalarFieldEnum | Prisma.CheckInScalarFieldEnum[] +} + +/** + * User.checkLists + */ +export type User$checkListsArgs = { + /** + * Select specific fields to fetch from the CheckList + */ + select?: Prisma.CheckListSelect | null + /** + * Omit specific fields from the CheckList + */ + omit?: Prisma.CheckListOmit | null + /** + * Choose, which related nodes to fetch as well + */ + include?: Prisma.CheckListInclude | null + where?: Prisma.CheckListWhereInput + orderBy?: Prisma.CheckListOrderByWithRelationInput | Prisma.CheckListOrderByWithRelationInput[] + cursor?: Prisma.CheckListWhereUniqueInput + take?: number + skip?: number + distinct?: Prisma.CheckListScalarFieldEnum | Prisma.CheckListScalarFieldEnum[] +} + +/** + * User.templates + */ +export type User$templatesArgs = { + /** + * Select specific fields to fetch from the CheckListTemplate + */ + select?: Prisma.CheckListTemplateSelect | null + /** + * Omit specific fields from the CheckListTemplate + */ + omit?: Prisma.CheckListTemplateOmit | null + /** + * Choose, which related nodes to fetch as well + */ + include?: Prisma.CheckListTemplateInclude | null + where?: Prisma.CheckListTemplateWhereInput + orderBy?: Prisma.CheckListTemplateOrderByWithRelationInput | Prisma.CheckListTemplateOrderByWithRelationInput[] + cursor?: Prisma.CheckListTemplateWhereUniqueInput + take?: number + skip?: number + distinct?: Prisma.CheckListTemplateScalarFieldEnum | Prisma.CheckListTemplateScalarFieldEnum[] +} + /** * User without action */ @@ -1123,4 +1676,8 @@ export type UserDefaultArgs | null + /** + * Choose, which related nodes to fetch as well + */ + include?: Prisma.UserInclude | null } diff --git a/prisma/migrations/20261022120000_add_checkin_checklist/migration.sql b/prisma/migrations/20261022120000_add_checkin_checklist/migration.sql new file mode 100644 index 0000000..ca4361e --- /dev/null +++ b/prisma/migrations/20261022120000_add_checkin_checklist/migration.sql @@ -0,0 +1,99 @@ +-- CreateTable +CREATE TABLE `Habit` ( + `id` INTEGER NOT NULL AUTO_INCREMENT, + `userId` INTEGER NOT NULL, + `name` VARCHAR(191) NOT NULL, + `period` VARCHAR(191) NOT NULL DEFAULT 'day', + `target` INTEGER NOT NULL DEFAULT 1, + `color` VARCHAR(191) NOT NULL DEFAULT '#1677ff', + `icon` VARCHAR(191) NOT NULL DEFAULT '', + `note` VARCHAR(191) NOT NULL DEFAULT '', + `archived` BOOLEAN NOT NULL DEFAULT false, + `sortOrder` INTEGER NOT NULL DEFAULT 0, + `createdAt` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3), + `updatedAt` DATETIME(3) NOT NULL, + + INDEX `Habit_userId_archived_sortOrder_idx`(`userId`, `archived`, `sortOrder`), + PRIMARY KEY (`id`) +) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; + +-- CreateTable +CREATE TABLE `CheckIn` ( + `id` INTEGER NOT NULL AUTO_INCREMENT, + `habitId` INTEGER NOT NULL, + `userId` INTEGER NOT NULL, + `date` VARCHAR(10) NOT NULL, + `seq` INTEGER NOT NULL DEFAULT 1, + `note` VARCHAR(191) NOT NULL DEFAULT '', + `source` VARCHAR(191) NOT NULL DEFAULT 'user', + `createdAt` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3), + + UNIQUE INDEX `CheckIn_habitId_date_seq_key`(`habitId`, `date`, `seq`), + INDEX `CheckIn_userId_date_idx`(`userId`, `date`), + INDEX `CheckIn_habitId_date_idx`(`habitId`, `date`), + PRIMARY KEY (`id`) +) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; + +-- CreateTable +CREATE TABLE `CheckList` ( + `id` INTEGER NOT NULL AUTO_INCREMENT, + `userId` INTEGER NOT NULL, + `title` VARCHAR(191) NOT NULL, + `scene` VARCHAR(191) NOT NULL DEFAULT '', + `note` VARCHAR(191) NOT NULL DEFAULT '', + `archived` BOOLEAN NOT NULL DEFAULT false, + `createdAt` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3), + `updatedAt` DATETIME(3) NOT NULL, + + INDEX `CheckList_userId_archived_idx`(`userId`, `archived`), + PRIMARY KEY (`id`) +) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; + +-- CreateTable +CREATE TABLE `CheckListItem` ( + `id` INTEGER NOT NULL AUTO_INCREMENT, + `listId` INTEGER NOT NULL, + `title` VARCHAR(191) NOT NULL, + `note` VARCHAR(191) NOT NULL DEFAULT '', + `done` BOOLEAN NOT NULL DEFAULT false, + `doneAt` DATETIME(3) NULL, + `sortOrder` INTEGER NOT NULL DEFAULT 0, + `createdAt` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3), + `updatedAt` DATETIME(3) NOT NULL, + + INDEX `CheckListItem_listId_sortOrder_idx`(`listId`, `sortOrder`), + PRIMARY KEY (`id`) +) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; + +-- CreateTable +CREATE TABLE `CheckListTemplate` ( + `id` INTEGER NOT NULL AUTO_INCREMENT, + `userId` INTEGER NULL, + `name` VARCHAR(191) NOT NULL, + `scene` VARCHAR(191) NOT NULL DEFAULT '', + `items` JSON NOT NULL, + `builtin` BOOLEAN NOT NULL DEFAULT false, + `createdAt` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3), + `updatedAt` DATETIME(3) NOT NULL, + + INDEX `CheckListTemplate_userId_builtin_idx`(`userId`, `builtin`), + PRIMARY KEY (`id`) +) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; + +-- AddForeignKey +ALTER TABLE `Habit` ADD CONSTRAINT `Habit_userId_fkey` FOREIGN KEY (`userId`) REFERENCES `User`(`id`) ON DELETE CASCADE ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE `CheckIn` ADD CONSTRAINT `CheckIn_habitId_fkey` FOREIGN KEY (`habitId`) REFERENCES `Habit`(`id`) ON DELETE CASCADE ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE `CheckIn` ADD CONSTRAINT `CheckIn_userId_fkey` FOREIGN KEY (`userId`) REFERENCES `User`(`id`) ON DELETE CASCADE ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE `CheckList` ADD CONSTRAINT `CheckList_userId_fkey` FOREIGN KEY (`userId`) REFERENCES `User`(`id`) ON DELETE CASCADE ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE `CheckListItem` ADD CONSTRAINT `CheckListItem_listId_fkey` FOREIGN KEY (`listId`) REFERENCES `CheckList`(`id`) ON DELETE CASCADE ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE `CheckListTemplate` ADD CONSTRAINT `CheckListTemplate_userId_fkey` FOREIGN KEY (`userId`) REFERENCES `User`(`id`) ON DELETE CASCADE ON UPDATE CASCADE; diff --git a/prisma/schema.prisma b/prisma/schema.prisma index c045dd1..64a7361 100644 --- a/prisma/schema.prisma +++ b/prisma/schema.prisma @@ -19,6 +19,12 @@ model User { password String createdAt DateTime @default(now()) updatedAt DateTime @updatedAt + + // V0.2 打卡 / 清单: 用户删除时级联清理 + habits Habit[] + checkIns CheckIn[] + checkLists CheckList[] + templates CheckListTemplate[] } model Article { @@ -281,4 +287,91 @@ model MihomeEnvHour { @@index([deviceId, hour]) } +// ==================== 打卡 / 日历 / 清单 (V0.2) ==================== + +// 打卡项: 周期性目标 (每天 / 每周 / 每月 / 每年 n 次) +model Habit { + id Int @id @default(autoincrement()) + userId Int + user User @relation(fields: [userId], references: [id], onDelete: Cascade) + name String + period String @default("day") // day | week | month | year + target Int @default(1) // 周期内目标次数 n (>=1) + color String @default("#1677ff") + icon String @default("") // emoji 或图标名, 预留 + note String @default("") + archived Boolean @default(false) // 归档: 不出现在今日待办, 历史保留 + sortOrder Int @default(0) + createdAt DateTime @default(now()) + updatedAt DateTime @updatedAt + records CheckIn[] + + @@index([userId, archived, sortOrder]) +} + +// 打卡记录: 一次打卡 = 一条; 同日多次 => seq 递增 (1..n, 超额继续累加) +model CheckIn { + id Int @id @default(autoincrement()) + habitId Int + habit Habit @relation(fields: [habitId], references: [id], onDelete: Cascade) + userId Int + user User @relation(fields: [userId], references: [id], onDelete: Cascade) + date String @db.VarChar(10) // 本地日历日 "YYYY-MM-DD" (Asia/Shanghai) + seq Int @default(1) // 当日第几次 + note String @default("") + source String @default("user") // user | backfill (补打) + createdAt DateTime @default(now()) + + @@unique([habitId, date, seq]) + @@index([userId, date]) + @@index([habitId, date]) +} + +// 检查清单: 出差 / 回老家 等场景的一次性清单 +model CheckList { + id Int @id @default(autoincrement()) + userId Int + user User @relation(fields: [userId], references: [id], onDelete: Cascade) + title String + scene String @default("") // 出差 | 回老家 | 自定义 + note String @default("") + archived Boolean @default(false) + createdAt DateTime @default(now()) + updatedAt DateTime @updatedAt + items CheckListItem[] + + @@index([userId, archived]) +} + +// 检查项: 勾选即完成 +model CheckListItem { + id Int @id @default(autoincrement()) + listId Int + list CheckList @relation(fields: [listId], references: [id], onDelete: Cascade) + title String + note String @default("") + done Boolean @default(false) + doneAt DateTime? + sortOrder Int @default(0) + createdAt DateTime @default(now()) + updatedAt DateTime @updatedAt + + @@index([listId, sortOrder]) +} + +// 清单模板: builtin = 系统预置 (userId 为空); 否则为用户自定义 +model CheckListTemplate { + id Int @id @default(autoincrement()) + userId Int? + user User? @relation(fields: [userId], references: [id], onDelete: Cascade) + name String + scene String @default("") + items Json // [{ title, note }] + builtin Boolean @default(false) + createdAt DateTime @default(now()) + updatedAt DateTime @updatedAt + + @@index([userId, builtin]) +} + diff --git a/server/checkin/period.js b/server/checkin/period.js new file mode 100644 index 0000000..4f958c0 --- /dev/null +++ b/server/checkin/period.js @@ -0,0 +1,120 @@ +// 打卡周期计算: 全部以 Asia/Shanghai 的"本地日历日"为准 +// 日期统一用 "YYYY-MM-DD" 字符串 (字典序 = 时间序, 可直接用于范围查询) + +export const TZ = 'Asia/Shanghai' + +const FMT = new Intl.DateTimeFormat('en-CA', { + timeZone: TZ, + year: 'numeric', + month: '2-digit', + day: '2-digit', +}) + +/** 任意时间 -> 本地日历日 "YYYY-MM-DD" */ +export function toDateStr(d = new Date()) { + return FMT.format(d instanceof Date ? d : new Date(d)) +} + +/** "YYYY-MM-DD" -> UTC 零点的 Date (仅用于日期运算, 不做时区展示) */ +function toUTC(s) { + const [y, m, d] = String(s).split('-').map(Number) + return new Date(Date.UTC(y, (m || 1) - 1, d || 1)) +} + +function fromUTC(dt) { + return dt.toISOString().slice(0, 10) +} + +export function addDays(s, n) { + const d = toUTC(s) + d.setUTCDate(d.getUTCDate() + n) + return fromUTC(d) +} + +export function addMonths(s, n) { + const [y, m] = String(s).split('-').map(Number) + const first = new Date(Date.UTC(y, (m || 1) - 1 + n, 1)) + const day = Number(String(s).slice(8, 10)) || 1 + const lastDay = new Date(Date.UTC(first.getUTCFullYear(), first.getUTCMonth() + 1, 0)).getUTCDate() + first.setUTCDate(Math.min(day, lastDay)) + return fromUTC(first) +} + +/** 周一为一周第一天 */ +export function startOfWeek(s) { + const dow = (toUTC(s).getUTCDay() + 6) % 7 // 0=周一 + return addDays(s, -dow) +} + +export function endOfWeek(s) { + return addDays(startOfWeek(s), 6) +} + +export function startOfMonth(s) { + return String(s).slice(0, 8) + '01' +} + +export function endOfMonth(s) { + const [y, m] = String(s).split('-').map(Number) + return fromUTC(new Date(Date.UTC(y, m || 1, 0))) +} + +export function startOfYear(s) { + return String(s).slice(0, 4) + '-01-01' +} + +export function endOfYear(s) { + return String(s).slice(0, 4) + '-12-31' +} + +export const PERIODS = ['day', 'week', 'month', 'year'] + +export const PERIOD_LABEL = { day: '每天', week: '每周', month: '每月', year: '每年' } + +/** 周期窗口 [start, end] (闭区间, 本地日历日) */ +export function periodRange(period, s) { + switch (period) { + case 'week': return { start: startOfWeek(s), end: endOfWeek(s) } + case 'month': return { start: startOfMonth(s), end: endOfMonth(s) } + case 'year': return { start: startOfYear(s), end: endOfYear(s) } + default: return { start: s, end: s } + } +} + +/** 周期窗口内的天数 */ +export function periodDays(period, s) { + const { start, end } = periodRange(period, s) + return Math.round((toUTC(end) - toUTC(start)) / 86400000) + 1 +} + +/** + * 日均期望次数: 用于日历上"某一天是否完成了当天应做的份额" + * - 每天 n 次 -> n + * - 每周 n 次 -> ceil(n / 7) + * - 每月 n 次 -> ceil(n / 当月天数) + * - 每年 n 次 -> ceil(n / 365) + * 环形进度仍以"周期完成度"(周期内累计次数 / n) 为准, 两者不冲突 + */ +export function expectedPerDay(period, target, s) { + const n = Math.max(1, Number(target) || 1) + if (period === 'week') return Math.max(1, Math.ceil(n / 7)) + if (period === 'month') return Math.max(1, Math.ceil(n / periodDays('month', s))) + if (period === 'year') return Math.max(1, Math.ceil(n / 365)) + return n +} + +/** 该周期在日期 d 之前是否已完整结束 (用于 streak 判断: 未结束的周期不算断签) */ +export function periodIsClosed(period, d, today) { + const { end } = periodRange(period, d) + return end < today +} + +/** 遍历 [start, end] 闭区间的每一天 */ +export function eachDay(start, end, fn) { + let cur = start + let guard = 0 + while (cur <= end && guard++ < 4000) { + fn(cur) + cur = addDays(cur, 1) + } +} diff --git a/server/index.js b/server/index.js index 60372a3..814d00c 100644 --- a/server/index.js +++ b/server/index.js @@ -12,6 +12,8 @@ import otaRouter from './routes/ota.js' import apizeroRouter from './routes/apizero.js' import monitorsRouter from './routes/monitors.js' import mihomeRouter from './routes/mihome.js' +import checkinRouter from './routes/checkin.js' +import checklistsRouter from './routes/checklists.js' const PORT = Number(process.env.PORT) || 3001 const DIST_DIR = path.join(process.cwd(), 'dist') @@ -36,6 +38,9 @@ app.use('/api', articlesRouter) app.use('/api', apizeroRouter) app.use('/api', monitorsRouter) app.use('/api/mihome', mihomeRouter) +// V0.2 打卡 / 日历 / 清单 +app.use('/api/checkin', checkinRouter) +app.use('/api/checklists', checklistsRouter) // 静态资源 (Vite build 产物) if (HAS_DIST) { diff --git a/server/routes/checkin.js b/server/routes/checkin.js new file mode 100644 index 0000000..2c41ccb --- /dev/null +++ b/server/routes/checkin.js @@ -0,0 +1,328 @@ +import { Router } from 'express' +import { prisma } from '../db.js' +import { authRequired } from '../middleware.js' +import { + toDateStr, addDays, periodRange, periodDays, expectedPerDay, + periodIsClosed, eachDay, PERIODS, PERIOD_LABEL, +} from '../checkin/period.js' + +const router = Router() +router.use(authRequired) + +// 补打卡允许的回溯天数 (F-CK-10) +const BACKFILL_DAYS = 7 + +const DATE_RE = /^\d{4}-\d{2}-\d{2}$/ +const MONTH_RE = /^\d{4}-\d{2}$/ + +function normDate(v) { + const s = String(v || '') + return DATE_RE.test(s) ? s : toDateStr() +} + +// ---------- 统计辅助 ---------- + +// 记录 -> { habitId: { date: count } } +function groupRecords(records) { + const map = new Map() + for (const r of records) { + if (!map.has(r.habitId)) map.set(r.habitId, new Map()) + const byDate = map.get(r.habitId) + byDate.set(r.date, (byDate.get(r.date) || 0) + 1) + } + return map +} + +function countInRange(byDate, start, end) { + let n = 0 + eachDay(start, end, (d) => { n += byDate.get(d) || 0 }) + return n +} + +// 连续达标的周期数: 当前周期未结束且未达标 -> 跳过(不算断签), 不是中断 +function computeStreak(habit, byDate, today) { + let cursor = today + let streak = 0 + for (let i = 0; i < 400; i++) { + const { start } = periodRange(habit.period, cursor) + const done = countInRange(byDate, start, periodRange(habit.period, cursor).end) + if (done >= habit.target) { + streak++ + } else if (periodIsClosed(habit.period, cursor, today)) { + break + } + const prevEnd = addDays(start, -1) + if (prevEnd < '1970-01-01') break + cursor = prevEnd + } + return streak +} + +async function loadActiveHabits(userId) { + return prisma.habit.findMany({ + where: { userId, archived: false }, + orderBy: [{ sortOrder: 'asc' }, { id: 'asc' }], + }) +} + +// 组装单个打卡项的展示态 +function buildItem(habit, byDate, date, today) { + const { start, end } = periodRange(habit.period, date) + const done = countInRange(byDate, start, end) + const target = Math.max(1, habit.target) + const onDate = byDate.get(date) || 0 + const expPerDay = expectedPerDay(habit.period, target, date) + return { + id: habit.id, + name: habit.name, + period: habit.period, + periodLabel: PERIOD_LABEL[habit.period] || '每天', + target, + color: habit.color, + icon: habit.icon, + note: habit.note, + archived: habit.archived, + periodStart: start, + periodEnd: end, + periodDays: periodDays(habit.period, date), + done, + remaining: Math.max(0, target - done), + percent: Math.min(1, target > 0 ? done / target : 1), + completed: done >= target, + over: Math.max(0, done - target), + countOnDate: onDate, + expectedPerDay: expPerDay, + dayDone: onDate >= expPerDay, + streak: computeStreak(habit, byDate, today), + } +} + +// 拉取 [start, end] 内的打卡记录并分组 +async function loadRecords(userId, habits, ranges) { + let min = ranges[0]?.start + let max = ranges[0]?.end + for (const r of ranges) { + if (r.start < min) min = r.start + if (r.end > max) max = r.end + } + if (!min || !max) return new Map() + const records = await prisma.checkIn.findMany({ + where: { userId, habitId: { in: habits.map((h) => h.id) }, date: { gte: min, lte: max } }, + select: { habitId: true, date: true }, + }) + return groupRecords(records) +} + +// ---------- 打卡项 ---------- + +// GET /api/checkin/habits?date=YYYY-MM-DD 今日(或指定日)待办 + 周期进度 +router.get('/habits', async (req, res, next) => { + try { + const userId = req.user.sub + const today = toDateStr() + const date = normDate(req.query.date) + const habits = await loadActiveHabits(userId) + const ranges = habits.map((h) => periodRange(h.period, date)) + const grouped = await loadRecords(userId, habits, ranges.length ? ranges : [{ start: date, end: date }]) + const items = habits.map((h) => buildItem(h, grouped.get(h.id) || new Map(), date, today)) + const doneCount = items.filter((i) => i.completed).length + res.json({ today, date, items, summary: { total: items.length, done: doneCount } }) + } catch (e) { next(e) } +}) + +// POST /api/checkin/habits 新建打卡项 +router.post('/habits', async (req, res, next) => { + try { + const userId = req.user.sub + const { name, period = 'day', target = 1, color = '#1677ff', icon = '', note = '' } = req.body || {} + const cleanName = String(name || '').trim() + if (!cleanName) return res.status(400).json({ error: '名称不能为空' }) + if (cleanName.length > 20) return res.status(400).json({ error: '名称不能超过 20 个字' }) + if (!PERIODS.includes(period)) return res.status(400).json({ error: '周期类型不合法' }) + const t = Math.floor(Number(target)) + if (!Number.isFinite(t) || t < 1) return res.status(400).json({ error: '目标次数需为 ≥1 的整数' }) + const row = await prisma.habit.create({ + data: { userId, name: cleanName, period, target: t, color: String(color), icon: String(icon), note: String(note || '') }, + }) + res.json({ item: row }) + } catch (e) { next(e) } +}) + +// PUT /api/checkin/habits/:id 编辑 +router.put('/habits/:id', async (req, res, next) => { + try { + const userId = req.user.sub + const id = Number(req.params.id) + const exist = await prisma.habit.findFirst({ where: { id, userId } }) + if (!exist) return res.status(404).json({ error: '打卡项不存在' }) + const { name, period, target, color, icon, note, archived, sortOrder } = req.body || {} + const data = {} + if (name !== undefined) { + const n = String(name).trim() + if (!n) return res.status(400).json({ error: '名称不能为空' }) + if (n.length > 20) return res.status(400).json({ error: '名称不能超过 20 个字' }) + data.name = n + } + if (period !== undefined) { + if (!PERIODS.includes(period)) return res.status(400).json({ error: '周期类型不合法' }) + data.period = period + } + if (target !== undefined) { + const t = Math.floor(Number(target)) + if (!Number.isFinite(t) || t < 1) return res.status(400).json({ error: '目标次数需为 ≥1 的整数' }) + data.target = t + } + if (color !== undefined) data.color = String(color) + if (icon !== undefined) data.icon = String(icon) + if (note !== undefined) data.note = String(note) + if (archived !== undefined) data.archived = !!archived + if (sortOrder !== undefined) data.sortOrder = Number(sortOrder) || 0 + const row = await prisma.habit.update({ where: { id }, data }) + res.json({ item: row }) + } catch (e) { next(e) } +}) + +// DELETE /api/checkin/habits/:id?hard=1 默认归档(保留历史), hard=1 物理删除 +router.delete('/habits/:id', async (req, res, next) => { + try { + const userId = req.user.sub + const id = Number(req.params.id) + const exist = await prisma.habit.findFirst({ where: { id, userId } }) + if (!exist) return res.status(404).json({ error: '打卡项不存在' }) + if (req.query.hard === '1') { + await prisma.checkIn.deleteMany({ where: { habitId: id } }) + await prisma.habit.delete({ where: { id } }) + return res.json({ ok: true, removed: true }) + } + const row = await prisma.habit.update({ where: { id }, data: { archived: true } }) + res.json({ ok: true, removed: false, item: row }) + } catch (e) { next(e) } +}) + +// ---------- 打卡 / 撤销 ---------- + +// POST /api/checkin/habits/:id/check { date?, note? } 打一次卡 +router.post('/habits/:id/check', async (req, res, next) => { + try { + const userId = req.user.sub + const id = Number(req.params.id) + const habit = await prisma.habit.findFirst({ where: { id, userId } }) + if (!habit) return res.status(404).json({ error: '打卡项不存在' }) + const today = toDateStr() + const date = normDate((req.body || {}).date) + if (date > today) return res.status(400).json({ error: '不能为未来日期打卡' }) + if (date < addDays(today, -BACKFILL_DAYS)) { + return res.status(400).json({ error: `最多只能补打最近 ${BACKFILL_DAYS} 天` }) + } + const dayRecords = await prisma.checkIn.findMany({ where: { habitId: id, date }, select: { seq: true } }) + const seq = dayRecords.reduce((m, r) => Math.max(m, r.seq), 0) + 1 + const note = String((req.body || {}).note || '').slice(0, 200) + await prisma.checkIn.create({ + data: { habitId: id, userId, date, seq, note, source: date === today ? 'user' : 'backfill' }, + }) + const grouped = await loadRecords(userId, [habit], [periodRange(habit.period, date)]) + res.json({ item: buildItem(habit, grouped.get(habit.id) || new Map(), date, today), date }) + } catch (e) { + // 唯一约束冲突 = 并发重复提交, 视为已打卡 + if (e && e.code === 'P2002') return res.status(409).json({ error: '该次打卡已记录' }) + next(e) + } +}) + +// DELETE /api/checkin/habits/:id/check?date= 撤销本周期内最近一次打卡 +router.delete('/habits/:id/check', async (req, res, next) => { + try { + const userId = req.user.sub + const id = Number(req.params.id) + const habit = await prisma.habit.findFirst({ where: { id, userId } }) + if (!habit) return res.status(404).json({ error: '打卡项不存在' }) + const today = toDateStr() + const date = normDate(req.query.date) + const { start, end } = periodRange(habit.period, date) + const last = await prisma.checkIn.findFirst({ + where: { habitId: id, date: { gte: start, lte: end } }, + orderBy: [{ date: 'desc' }, { seq: 'desc' }], + }) + if (!last) return res.status(400).json({ error: '本周期还没有打卡记录' }) + await prisma.checkIn.delete({ where: { id: last.id } }) + const grouped = await loadRecords(userId, [habit], [{ start, end }]) + res.json({ item: buildItem(habit, grouped.get(habit.id) || new Map(), date, today), date }) + } catch (e) { next(e) } +}) + +// ---------- 某日详情 / 月历 ---------- + +// GET /api/checkin/day?date=YYYY-MM-DD 当天每个打卡项的明细 (含可打卡/只读标记) +router.get('/day', async (req, res, next) => { + try { + const userId = req.user.sub + const today = toDateStr() + const date = normDate(req.query.date) + const habits = await loadActiveHabits(userId) + const ranges = habits.map((h) => periodRange(h.period, date)) + const grouped = await loadRecords(userId, habits, ranges.length ? ranges : [{ start: date, end: date }]) + const items = habits.map((h) => { + const base = buildItem(h, grouped.get(h.id) || new Map(), date, today) + return { ...base, canCheck: date <= today && date >= addDays(today, -BACKFILL_DAYS) } + }) + res.json({ today, date, isToday: date === today, isFuture: date > today, items }) + } catch (e) { next(e) } +}) + +// GET /api/checkin/calendar?month=YYYY-MM 月历: 每天完成情况 + 当月完成率 +router.get('/calendar', async (req, res, next) => { + try { + const userId = req.user.sub + const today = toDateStr() + const month = MONTH_RE.test(String(req.query.month || '')) ? String(req.query.month) : today.slice(0, 7) + const start = month + '-01' + const end = addDays(monthStartNext(month), -1) + const habits = await prisma.habit.findMany({ where: { userId }, orderBy: [{ sortOrder: 'asc' }, { id: 'asc' }] }) + const active = habits.filter((h) => !h.archived) + const records = await prisma.checkIn.findMany({ + where: { userId, date: { gte: start, lte: end } }, + select: { habitId: true, date: true }, + }) + const grouped = groupRecords(records) + const days = [] + let expTotal = 0 + let doneTotal = 0 + eachDay(start, end, (d) => { + let expected = 0 + let actual = 0 + let over = false + const detail = [] + for (const h of active) { + if (toDateStr(h.createdAt) > d) continue // 创建之前的日期不计入期望 + const exp = expectedPerDay(h.period, Math.max(1, h.target), d) + const cnt = (grouped.get(h.id) || new Map()).get(d) || 0 + expected += exp + actual += Math.min(cnt, exp) + if (cnt > exp) over = true + detail.push({ id: h.id, name: h.name, color: h.color, count: cnt, expected: exp, done: cnt >= exp }) + } + const isFuture = d > today + if (!isFuture) { expTotal += expected; doneTotal += actual } + let status = 'empty' + if (expected > 0 && actual >= expected) status = over ? 'over' : 'full' + else if (actual > 0) status = 'partial' + days.push({ + date: d, expected, actual, status, isToday: d === today, isFuture, + habits: detail, + }) + }) + res.json({ + today, month, days, + rate: expTotal > 0 ? Math.min(1, doneTotal / expTotal) : 0, + habits: active.map((h) => ({ id: h.id, name: h.name, color: h.color, period: h.period, target: h.target })), + }) + } catch (e) { next(e) } +}) + +function monthStartNext(month) { + const [y, m] = month.split('-').map(Number) + const d = new Date(Date.UTC(y, m, 1)) // m 已 +1 (下月) + return d.toISOString().slice(0, 10) +} + +export default router diff --git a/server/routes/checklists.js b/server/routes/checklists.js new file mode 100644 index 0000000..2558708 --- /dev/null +++ b/server/routes/checklists.js @@ -0,0 +1,313 @@ +import { Router } from 'express' +import { prisma } from '../db.js' +import { authRequired } from '../middleware.js' + +const router = Router() +router.use(authRequired) + +// 系统预置模板 (builtin): 首次访问模板接口时幂等写入 +const BUILTIN_TEMPLATES = [ + { + name: '出差', + scene: '出差', + items: [ + { title: '身份证 / 证件' }, + { title: '手机充电器 + 充电宝' }, + { title: '笔记本电脑 + 电源' }, + { title: '耳机' }, + { title: '换洗衣物' }, + { title: '洗漱包' }, + { title: '常用药' }, + { title: '雨伞' }, + { title: '车票 / 机票 / 酒店确认' }, + { title: '工牌 / 名片' }, + { title: '报销单据' }, + ], + }, + { + name: '回老家', + scene: '回老家', + items: [ + { title: '身份证 / 证件' }, + { title: '钥匙' }, + { title: '手机充电器 + 充电宝' }, + { title: '换洗衣物' }, + { title: '洗漱包' }, + { title: '常用药' }, + { title: '给家人的礼物 / 伴手礼' }, + { title: '长辈的药品 / 营养品' }, + { title: '口罩' }, + { title: '现金零钱' }, + { title: '车票 / 加油 / 行程确认' }, + { title: '家里门窗水电检查' }, + ], + }, +] + +async function ensureBuiltin() { + const count = await prisma.checkListTemplate.count({ where: { builtin: true } }) + if (count >= BUILTIN_TEMPLATES.length) return + for (const t of BUILTIN_TEMPLATES) { + const exist = await prisma.checkListTemplate.findFirst({ where: { builtin: true, name: t.name } }) + if (exist) continue + await prisma.checkListTemplate.create({ + data: { name: t.name, scene: t.scene, items: t.items, builtin: true, userId: null }, + }) + } +} + +const LIST_INCLUDE = { items: { orderBy: [{ sortOrder: 'asc' }, { id: 'asc' }] } } + +function withProgress(list) { + const items = list.items || [] + const done = items.filter((i) => i.done).length + return { + ...list, + items, + total: items.length, + done, + percent: items.length > 0 ? done / items.length : 0, + completed: items.length > 0 && done === items.length, + } +} + +// ---------- 模板 ---------- + +// GET /api/checklists/templates +router.get('/templates', async (_req, res, next) => { + try { + await ensureBuiltin() + const rows = await prisma.checkListTemplate.findMany({ + where: { OR: [{ builtin: true }, { userId: _req.user.sub }] }, + orderBy: [{ builtin: 'desc' }, { id: 'asc' }], + }) + res.json({ items: rows }) + } catch (e) { next(e) } +}) + +// POST /api/checklists/templates 另存为模板 { name, scene, items: [{title, note}] } +router.post('/templates', async (req, res, next) => { + try { + const userId = req.user.sub + const { name, scene = '', items = [] } = req.body || {} + const cleanName = String(name || '').trim() + if (!cleanName) return res.status(400).json({ error: '模板名称不能为空' }) + const list = (Array.isArray(items) ? items : []) + .map((i) => ({ title: String(i?.title || '').trim(), note: String(i?.note || '') })) + .filter((i) => i.title) + if (!list.length) return res.status(400).json({ error: '模板至少需要一个检查项' }) + const row = await prisma.checkListTemplate.create({ + data: { userId, name: cleanName, scene: String(scene), items: list, builtin: false }, + }) + res.json({ item: row }) + } catch (e) { next(e) } +}) + +// DELETE /api/checklists/templates/:id +router.delete('/templates/:id', async (req, res, next) => { + try { + const userId = req.user.sub + const id = Number(req.params.id) + const exist = await prisma.checkListTemplate.findFirst({ where: { id, userId } }) + if (!exist) return res.status(404).json({ error: '模板不存在或无权删除' }) + await prisma.checkListTemplate.delete({ where: { id } }) + res.json({ ok: true }) + } catch (e) { next(e) } +}) + +// ---------- 清单 ---------- + +// GET /api/checklists?archived=0|1 +router.get('/', async (req, res, next) => { + try { + const userId = req.user.sub + const archived = String(req.query.archived || '0') === '1' + const rows = await prisma.checkList.findMany({ + where: { userId, archived }, + include: LIST_INCLUDE, + orderBy: [{ updatedAt: 'desc' }], + }) + res.json({ items: rows.map(withProgress) }) + } catch (e) { next(e) } +}) + +// POST /api/checklists { title, scene?, note?, items?: string[] | [{title,note}], templateId? } +router.post('/', async (req, res, next) => { + try { + const userId = req.user.sub + const { title, scene = '', note = '', items = [], templateId } = req.body || {} + const cleanTitle = String(title || '').trim() + if (!cleanTitle) return res.status(400).json({ error: '清单名称不能为空' }) + + let seed = (Array.isArray(items) ? items : []) + .map((i) => (typeof i === 'string' ? { title: i } : i)) + .map((i) => ({ title: String(i?.title || '').trim(), note: String(i?.note || '') })) + .filter((i) => i.title) + + if (!seed.length && templateId) { + const tpl = await prisma.checkListTemplate.findFirst({ + where: { id: Number(templateId), OR: [{ builtin: true }, { userId }] }, + }) + if (tpl && Array.isArray(tpl.items)) { + seed = tpl.items.map((i) => ({ title: String(i?.title || '').trim(), note: String(i?.note || '') })).filter((i) => i.title) + } + } + + const row = await prisma.checkList.create({ + data: { + userId, + title: cleanTitle, + scene: String(scene), + note: String(note), + items: { create: seed.map((i, idx) => ({ title: i.title, note: i.note, sortOrder: idx })) }, + }, + include: LIST_INCLUDE, + }) + res.json({ item: withProgress(row) }) + } catch (e) { next(e) } +}) + +// GET /api/checklists/:id +router.get('/:id', async (req, res, next) => { + try { + const userId = req.user.sub + const id = Number(req.params.id) + const row = await prisma.checkList.findFirst({ where: { id, userId }, include: LIST_INCLUDE }) + if (!row) return res.status(404).json({ error: '清单不存在' }) + res.json({ item: withProgress(row) }) + } catch (e) { next(e) } +}) + +// PUT /api/checklists/:id { title?, scene?, note?, archived? } +router.put('/:id', async (req, res, next) => { + try { + const userId = req.user.sub + const id = Number(req.params.id) + const exist = await prisma.checkList.findFirst({ where: { id, userId } }) + if (!exist) return res.status(404).json({ error: '清单不存在' }) + const { title, scene, note, archived } = req.body || {} + const data = {} + if (title !== undefined) { + const t = String(title).trim() + if (!t) return res.status(400).json({ error: '清单名称不能为空' }) + data.title = t + } + if (scene !== undefined) data.scene = String(scene) + if (note !== undefined) data.note = String(note) + if (archived !== undefined) data.archived = !!archived + const row = await prisma.checkList.update({ where: { id }, data, include: LIST_INCLUDE }) + res.json({ item: withProgress(row) }) + } catch (e) { next(e) } +}) + +// DELETE /api/checklists/:id +router.delete('/:id', async (req, res, next) => { + try { + const userId = req.user.sub + const id = Number(req.params.id) + const exist = await prisma.checkList.findFirst({ where: { id, userId } }) + if (!exist) return res.status(404).json({ error: '清单不存在' }) + await prisma.checkListItem.deleteMany({ where: { listId: id } }) + await prisma.checkList.delete({ where: { id } }) + res.json({ ok: true }) + } catch (e) { next(e) } +}) + +// POST /api/checklists/:id/duplicate 复制一份新清单 (勾选状态重置) +router.post('/:id/duplicate', async (req, res, next) => { + try { + const userId = req.user.sub + const id = Number(req.params.id) + const src = await prisma.checkList.findFirst({ where: { id, userId }, include: LIST_INCLUDE }) + if (!src) return res.status(404).json({ error: '清单不存在' }) + const row = await prisma.checkList.create({ + data: { + userId, + title: src.title + ' 副本', + scene: src.scene, + note: src.note, + items: { + create: src.items.map((i, idx) => ({ title: i.title, note: i.note, done: false, sortOrder: idx })), + }, + }, + include: LIST_INCLUDE, + }) + res.json({ item: withProgress(row) }) + } catch (e) { next(e) } +}) + +// ---------- 检查项 ---------- + +// POST /api/checklists/:id/items { title, note? } +router.post('/:id/items', async (req, res, next) => { + try { + const userId = req.user.sub + const listId = Number(req.params.id) + const list = await prisma.checkList.findFirst({ where: { id: listId, userId } }) + if (!list) return res.status(404).json({ error: '清单不存在' }) + const title = String((req.body || {}).title || '').trim() + if (!title) return res.status(400).json({ error: '检查项不能为空' }) + if (title.length > 40) return res.status(400).json({ error: '检查项不能超过 40 个字' }) + const max = await prisma.checkListItem.findFirst({ where: { listId }, orderBy: { sortOrder: 'desc' } }) + const row = await prisma.checkListItem.create({ + data: { listId, title, note: String((req.body || {}).note || ''), sortOrder: (max?.sortOrder || 0) + 1 }, + }) + res.json({ item: row }) + } catch (e) { next(e) } +}) + +// PUT /api/checklists/items/:id { title?, note?, done?, sortOrder? } +router.put('/items/:id', async (req, res, next) => { + try { + const userId = req.user.sub + const id = Number(req.params.id) + const exist = await prisma.checkListItem.findFirst({ where: { id, list: { userId } } }) + if (!exist) return res.status(404).json({ error: '检查项不存在' }) + const { title, note, done, sortOrder } = req.body || {} + const data = {} + if (title !== undefined) { + const t = String(title).trim() + if (!t) return res.status(400).json({ error: '检查项不能为空' }) + data.title = t + } + if (note !== undefined) data.note = String(note) + if (sortOrder !== undefined) data.sortOrder = Number(sortOrder) || 0 + if (done !== undefined) { + data.done = !!done + data.doneAt = done ? new Date() : null + } + const row = await prisma.checkListItem.update({ where: { id }, data }) + res.json({ item: row }) + } catch (e) { next(e) } +}) + +// DELETE /api/checklists/items/:id +router.delete('/items/:id', async (req, res, next) => { + try { + const userId = req.user.sub + const id = Number(req.params.id) + const exist = await prisma.checkListItem.findFirst({ where: { id, list: { userId } } }) + if (!exist) return res.status(404).json({ error: '检查项不存在' }) + await prisma.checkListItem.delete({ where: { id } }) + res.json({ ok: true }) + } catch (e) { next(e) } +}) + +// POST /api/checklists/:id/check-all { done: boolean } 一键全选 / 全不选 +router.post('/:id/check-all', async (req, res, next) => { + try { + const userId = req.user.sub + const listId = Number(req.params.id) + const list = await prisma.checkList.findFirst({ where: { id: listId, userId } }) + if (!list) return res.status(404).json({ error: '清单不存在' }) + const done = !!(req.body || {}).done + await prisma.checkListItem.updateMany({ + where: { listId }, + data: { done, doneAt: done ? new Date() : null }, + }) + const row = await prisma.checkList.findFirst({ where: { id: listId }, include: LIST_INCLUDE }) + res.json({ item: withProgress(row) }) + } catch (e) { next(e) } +}) + +export default router diff --git a/src/App.jsx b/src/App.jsx index b76aede..dc30220 100644 --- a/src/App.jsx +++ b/src/App.jsx @@ -7,6 +7,7 @@ import MacroPage from './pages/MacroPage.jsx' import MonitorPage from './pages/MonitorPage.jsx' import ServerDetail from './pages/monitor/ServerDetail.jsx' import MePage from './pages/MePage.jsx' +import CheckinPage from './pages/checkin/CheckinPage.jsx' import { useAuth } from './auth/AuthContext.jsx' // 已登录访问 /login 自动回首页 @@ -36,6 +37,8 @@ export default function App() { } /> } /> } /> + {/* V0.2 打卡 / 日历 / 清单 */} + } /> } /> } /> diff --git a/src/api/checkin.js b/src/api/checkin.js new file mode 100644 index 0000000..ea0e7e1 --- /dev/null +++ b/src/api/checkin.js @@ -0,0 +1,39 @@ +import { api } from './client.js' + +const q = (params) => { + const s = new URLSearchParams() + Object.entries(params || {}).forEach(([k, v]) => { + if (v !== undefined && v !== null && v !== '') s.set(k, v) + }) + const str = s.toString() + return str ? '?' + str : '' +} + +// 打卡 / 日历 +export const checkinApi = { + habits: (date) => api('/checkin/habits' + q({ date })), + day: (date) => api('/checkin/day' + q({ date })), + calendar: (month) => api('/checkin/calendar' + q({ month })), + createHabit: (body) => api('/checkin/habits', { method: 'POST', body }), + updateHabit: (id, body) => api(`/checkin/habits/${id}`, { method: 'PUT', body }), + deleteHabit: (id, hard) => api(`/checkin/habits/${id}${hard ? '?hard=1' : ''}`, { method: 'DELETE' }), + check: (id, date, note) => api(`/checkin/habits/${id}/check`, { method: 'POST', body: { date, note } }), + uncheck: (id, date) => api(`/checkin/habits/${id}/check` + q({ date }), { method: 'DELETE' }), +} + +// 检查清单 +export const checklistApi = { + lists: (archived) => api('/checklists' + q({ archived: archived ? 1 : 0 })), + list: (id) => api(`/checklists/${id}`), + create: (body) => api('/checklists', { method: 'POST', body }), + update: (id, body) => api(`/checklists/${id}`, { method: 'PUT', body }), + remove: (id) => api(`/checklists/${id}`, { method: 'DELETE' }), + duplicate: (id) => api(`/checklists/${id}/duplicate`, { method: 'POST', body: {} }), + addItem: (id, body) => api(`/checklists/${id}/items`, { method: 'POST', body }), + updateItem: (itemId, body) => api(`/checklists/items/${itemId}`, { method: 'PUT', body }), + removeItem: (itemId) => api(`/checklists/items/${itemId}`, { method: 'DELETE' }), + checkAll: (id, done) => api(`/checklists/${id}/check-all`, { method: 'POST', body: { done } }), + templates: () => api('/checklists/templates'), + createTemplate: (body) => api('/checklists/templates', { method: 'POST', body }), + removeTemplate: (id) => api(`/checklists/templates/${id}`, { method: 'DELETE' }), +} diff --git a/src/components/BottomNav.jsx b/src/components/BottomNav.jsx index 52b1606..f88b261 100644 --- a/src/components/BottomNav.jsx +++ b/src/components/BottomNav.jsx @@ -8,6 +8,7 @@ const TABS = [ { key: '/', name: 'home', label: '首页' }, { key: '/macro', name: 'macro', label: '宏观' }, { key: '/monitor', name: 'monitor', label: '监控' }, + { key: '/checkin', name: 'checkin', label: '打卡' }, { key: '/me', name: 'me', label: '我' }, ] @@ -46,4 +47,4 @@ export default function BottomNav() { ))} ) -} +} diff --git a/src/components/RingProgress.jsx b/src/components/RingProgress.jsx new file mode 100644 index 0000000..be2ff6e --- /dev/null +++ b/src/components/RingProgress.jsx @@ -0,0 +1,139 @@ +import { useEffect, useRef, useState } from 'react' + +// 环形进度组件 (F-CK-03/04/05, U-01) +// props: +// percent: 0~1 完成度 +// size: 外框尺寸(px) +// stroke: 环宽(px) +// color: 进度色 +// completed: 是否达标 (达标时显示对勾而非数字) +// done/target: 中心文案 +// onClick: 可选, 点击整个环触发 (用于"点环即打卡") +export default function RingProgress({ + percent = 0, + size = 58, + stroke = 6, + color = '#1677ff', + completed = false, + done = 0, + target = 1, + over = 0, + children, + onClick, + disabled = false, +}) { + const p = Math.max(0, Math.min(1, Number(percent) || 0)) + const r = (size - stroke) / 2 + const c = 2 * Math.PI * r + const offset = c * (1 - p) + + return ( +
+ + {/* 背景环 */} + + {/* 进度环: 从 12 点方向顺时针 */} + + +
+ {children !== undefined ? children : ( + completed ? ( + + + + ) : ( + + {done} + /{target} + + ) + )} +
+ {over > 0 && +{over}} +
+ ) +} + +// 完成特效 (F-CK-07, U-02/U-03/U-07) +// props: fire 计数器(每次 +1 触发一次), color 主色 +// 尊重"特效开关": localStorage iboard_celebrate === '0' 时不播放 +export function Celebrate({ fire = 0, color = '#1677ff' }) { + const [burst, setBurst] = useState(0) + const [visible, setVisible] = useState(false) + const prev = useRef(fire) + const timer = useRef(null) + + useEffect(() => { + if (fire === prev.current) return + prev.current = fire + if (fire <= 0) return + if (!effectsEnabled()) return + setBurst((n) => n + 1) + setVisible(true) + haptic() + clearTimeout(timer.current) + timer.current = setTimeout(() => setVisible(false), 900) + return () => clearTimeout(timer.current) + }, [fire]) + + if (!visible) return null + const dots = Array.from({ length: 14 }, (_, i) => i) + return ( +
+ + {dots.map((i) => { + const angle = (360 / dots.length) * i + (i % 2 ? 8 : -8) + const dist = 26 + (i % 4) * 8 + return ( + + ) + })} +
+ ) +} + +// 特效全局开关 (默认开) +export function effectsEnabled() { + try { + if (localStorage.getItem('iboard_celebrate') === '0') return false + } catch { /* ignore */ } + // 系统"减弱动效"偏好时降级 + if (typeof window !== 'undefined' && window.matchMedia) { + try { + if (window.matchMedia('(prefers-reduced-motion: reduce)').matches) return false + } catch { /* ignore */ } + } + return true +} + +export function setEffectsEnabled(v) { + try { localStorage.setItem('iboard_celebrate', v ? '1' : '0') } catch { /* ignore */ } +} + +// 轻量触感反馈 (Web Vibration API; Tauri Android WebView 支持) +export function haptic(ms = 18) { + try { + if (typeof navigator !== 'undefined' && navigator.vibrate) navigator.vibrate(ms) + } catch { /* ignore */ } +} diff --git a/src/components/TabIcon.jsx b/src/components/TabIcon.jsx index 51c00d1..736c86c 100644 --- a/src/components/TabIcon.jsx +++ b/src/components/TabIcon.jsx @@ -22,6 +22,15 @@ const ICONS = { ), + // 打卡: 日历 + 对勾 + checkin: (active) => ( + + + + + + + ), me: (active) => ( @@ -34,4 +43,4 @@ export default function TabIcon({ name, active }) { const render = ICONS[name] if (!render) return null return {render(!!active)} -} +} diff --git a/src/pages/checkin/CalendarView.jsx b/src/pages/checkin/CalendarView.jsx new file mode 100644 index 0000000..3196631 --- /dev/null +++ b/src/pages/checkin/CalendarView.jsx @@ -0,0 +1,173 @@ +import { useCallback, useEffect, useMemo, useState } from 'react' +import { Button, DotLoading, Empty, Segmented, Toast } from 'antd-mobile' +import { Celebrate } from '../../components/RingProgress.jsx' +import { checkinApi } from '../../api/checkin.js' +import useRefreshOnVisible from '../../hooks/useRefreshOnVisible.js' +import { + toDateStr, addDays, addMonths, monthGrid, weekdayLabels, dayLabel, fmtMonth, +} from './date.js' + +// 日历视图: 月历网格 + 今天/昨天/明天 三视图 + 日期标记 (F-CL-*) +export default function CalendarView({ date, onDateChange }) { + const today = toDateStr() + const [month, setMonth] = useState(() => date.slice(0, 7)) + const [cal, setCal] = useState(null) // 月历数据 + const [detail, setDetail] = useState(null) // 选中日详情 + const [err, setErr] = useState('') + const [bursts, setBursts] = useState({}) + + const loadCal = useCallback((silent) => { + if (!silent) setErr('') + checkinApi.calendar(month) + .then(setCal) + .catch((e) => { if (!silent) setErr(e.message) }) + }, [month]) + + const loadDetail = useCallback((silent) => { + checkinApi.day(date).then(setDetail).catch(() => {}) + }, [date]) + + useEffect(() => { loadCal(false) }, [loadCal]) + useEffect(() => { setDetail(null); loadDetail(false) }, [loadDetail]) + useRefreshOnVisible(() => { loadCal(true); loadDetail(true) }) + + // 切换日期时, 若跨月则同步月份 + useEffect(() => { + const m = date.slice(0, 7) + setMonth((cur) => (cur === m ? cur : m)) + }, [date]) + + const days = useMemo(() => monthGrid(month), [month]) + const byDate = useMemo(() => { + const map = new Map() + ;(cal?.days || []).forEach((d) => map.set(d.date, d)) + return map + }, [cal]) + + const quickValue = useMemo(() => { + if (date === today) return 0 + if (date === addDays(today, -1)) return -1 + if (date === addDays(today, 1)) return 1 + return null + }, [date, today]) + + async function checkFromCalendar(item) { + if (!item.canCheck) return + const snapshot = detail + setDetail((d) => ({ + ...d, + items: d.items.map((x) => { + if (x.id !== item.id) return x + const done = x.done + 1 + const countOnDate = (x.countOnDate || 0) + 1 + return { + ...x, done, countOnDate, + percent: Math.min(1, done / x.target), + completed: done >= x.target, + over: Math.max(0, done - x.target), + dayDone: countOnDate >= x.expectedPerDay, + } + }), + })) + try { + const res = await checkinApi.check(item.id, date) + const fresh = await checkinApi.day(date) + setDetail(fresh) + if (res.item.completed) setBursts((m) => ({ ...m, [item.id]: (m[item.id] || 0) + 1 })) + loadCal(true) + } catch (e) { + setDetail(snapshot) + Toast.show({ content: e.message || '打卡失败' }) + } + } + + const items = detail?.items || [] + const isFuture = !!detail?.isFuture + + return ( +
+
+ setMonth((m) => addMonths(m, -1))}>‹ + {fmtMonth(month)} + setMonth((m) => addMonths(m, 1))}>› + onDateChange(today)}>回到今天 +
+ +
+ onDateChange(addDays(today, Number(v)))} + /> +
+ + {err &&
{err} loadCal(false)}>重试
} + +
+
+ {weekdayLabels().map((w) => {w})} +
+
+ {days.map((d) => { + const info = byDate.get(d) + const inMonth = d.slice(0, 7) === month + const status = info?.status || 'empty' + return ( +
onDateChange(d)} + > + {Number(d.slice(8, 10))} + {inMonth && status !== 'empty' && ( + + )} +
+ ) + })} +
+
+ + {cal && ( +
本月完成率 {Math.round((cal.rate || 0) * 100)}%
+ )} + +
+
+ {dayLabel(date, today)} · {date} + {isFuture && 计划(不可打卡)} +
+ + {detail === null &&
加载中...
} + {detail !== null && items.length === 0 && } + + {items.map((item) => ( +
+ + {item.name} + + {item.periodLabel} {item.target} 次 · 当日 {item.countOnDate || 0}/{item.expectedPerDay} + + + {item.canCheck ? ( + + ) : ( + {item.dayDone ? '计划' : '待办'} + )} + + +
+ ))} +
+
+ ) +} diff --git a/src/pages/checkin/CheckinPage.jsx b/src/pages/checkin/CheckinPage.jsx new file mode 100644 index 0000000..d06134a --- /dev/null +++ b/src/pages/checkin/CheckinPage.jsx @@ -0,0 +1,28 @@ +import { useState } from 'react' +import { NavBar } from 'antd-mobile' +import SwipeTabs from '../../components/SwipeTabs.jsx' +import HabitView from './HabitView.jsx' +import CalendarView from './CalendarView.jsx' +import ListView from './ListView.jsx' +import { toDateStr } from './date.js' + +// 打卡页: 一个页面三个视图 —— 打卡(环形进度) / 日历(今天·昨天·明天) / 清单(场景检查) +export default function CheckinPage() { + const [active, setActive] = useState('habit') + const [date, setDate] = useState(() => toDateStr()) + + const tabs = [ + { key: 'habit', label: '打卡', render: () => }, + { key: 'calendar', label: '日历', render: () => }, + { key: 'list', label: '清单', render: () => }, + ] + + return ( +
+ 打卡 +
+ +
+
+ ) +} diff --git a/src/pages/checkin/HabitView.jsx b/src/pages/checkin/HabitView.jsx new file mode 100644 index 0000000..63998cc --- /dev/null +++ b/src/pages/checkin/HabitView.jsx @@ -0,0 +1,290 @@ +import { useCallback, useEffect, useMemo, useState } from 'react' +import { + Button, Dialog, DotLoading, Empty, Input, Popup, Selector, Stepper, Toast, +} from 'antd-mobile' +import RingProgress, { Celebrate, effectsEnabled, setEffectsEnabled } from '../../components/RingProgress.jsx' +import { checkinApi } from '../../api/checkin.js' +import useRefreshOnVisible from '../../hooks/useRefreshOnVisible.js' +import { toDateStr, dayLabel } from './date.js' + +const PERIOD_OPTIONS = [ + { label: '每天', value: 'day' }, + { label: '每周', value: 'week' }, + { label: '每月', value: 'month' }, + { label: '每年', value: 'year' }, +] + +const COLORS = ['#1677ff', '#00b578', '#ff8f1f', '#ff3141', '#a855f7', '#14b8a6', '#f43f9e'] + +const EMPTY_FORM = { id: null, name: '', period: 'day', target: 1, color: COLORS[0], note: '' } + +// 打卡视图: 今日待办列表 + 环形进度 + 打卡/撤销 + 新建/编辑 +export default function HabitView({ date, onDateChange }) { + const [data, setData] = useState(null) // { today, date, items, summary } + const [err, setErr] = useState('') + const [bursts, setBursts] = useState({}) // { habitId: 触发计数 } + const [form, setForm] = useState(EMPTY_FORM) + const [showForm, setShowForm] = useState(false) + const [effects, setEffects] = useState(effectsEnabled()) + + const load = useCallback((silent) => { + if (!silent) setErr('') + checkinApi.habits(date) + .then((d) => setData(d)) + .catch((e) => { if (!silent) setErr(e.message) }) + }, [date]) + + useEffect(() => { load(false) }, [load]) + useRefreshOnVisible(() => load(true)) + + const items = useMemo(() => { + const list = data?.items || [] + // 未完成在前, 已完成在后 (F-CK-16 默认排序) + return [...list].sort((a, b) => Number(a.completed) - Number(b.completed) || a.id - b.id) + }, [data]) + + const fireBurst = (id) => setBursts((m) => ({ ...m, [id]: (m[id] || 0) + 1 })) + + // 乐观更新: 先本地 +1, 成功用服务端结果覆盖, 失败回滚 (F-SY-06/E-02) + async function doCheck(item) { + const before = data + const patch = (it) => { + const done = it.done + 1 + return { + ...it, + done, + remaining: Math.max(0, it.target - done), + percent: Math.min(1, done / it.target), + completed: done >= it.target, + over: Math.max(0, done - it.target), + countOnDate: (it.countOnDate || 0) + 1, + dayDone: (it.countOnDate || 0) + 1 >= it.expectedPerDay, + } + } + setData((d) => ({ ...d, items: d.items.map((x) => (x.id === item.id ? patch(x) : x)) })) + try { + const res = await checkinApi.check(item.id, date) + setData((d) => ({ ...d, items: d.items.map((x) => (x.id === item.id ? res.item : x)) })) + if (res.item.completed) fireBurst(item.id) + } catch (e) { + setData(before) + Toast.show({ content: e.message || '打卡失败' }) + } + } + + async function doUncheck(item) { + const before = data + setData((d) => ({ + ...d, + items: d.items.map((x) => { + if (x.id !== item.id) return x + const done = Math.max(0, x.done - 1) + return { + ...x, + done, + remaining: Math.max(0, x.target - done), + percent: Math.min(1, done / x.target), + completed: done >= x.target, + over: Math.max(0, done - x.target), + countOnDate: Math.max(0, (x.countOnDate || 0) - 1), + } + }), + })) + try { + const res = await checkinApi.uncheck(item.id, date) + setData((d) => ({ ...d, items: d.items.map((x) => (x.id === item.id ? res.item : x)) })) + } catch (e) { + setData(before) + Toast.show({ content: e.message || '撤销失败' }) + } + } + + async function submitForm() { + const name = String(form.name || '').trim() + if (!name) return Toast.show({ content: '请填写名称' }) + if (name.length > 20) return Toast.show({ content: '名称不能超过 20 个字' }) + const payload = { name, period: form.period, target: Number(form.target) || 1, color: form.color, note: form.note } + try { + if (form.id) await checkinApi.updateHabit(form.id, payload) + else await checkinApi.createHabit(payload) + setShowForm(false) + setForm(EMPTY_FORM) + load(true) + } catch (e) { + Toast.show({ content: e.message || '保存失败' }) + } + } + + async function removeHabit(item) { + const ok = await Dialog.confirm({ + content: `归档「${item.name}」?归档后不再出现在待办,历史记录保留。`, + confirmText: '归档', + cancelText: '取消', + }) + if (!ok) return + try { + await checkinApi.deleteHabit(item.id) + Toast.show({ content: '已归档' }) + load(true) + } catch (e) { + Toast.show({ content: e.message || '操作失败' }) + } + } + + const summary = data?.summary || { total: 0, done: 0 } + const isToday = data ? data.date === data.today : true + + return ( +
+
+
+
{dayLabel(date, data?.today || toDateStr())}
+
+ 已完成 {summary.done} / {summary.total} + {!isToday && 非今天} +
+
+
+ + +
+
+ + {err && ( +
+ {err} + load(false)}>重试 +
+ )} + + {data === null && !err &&
加载中...
} + + {data !== null && !err && items.length === 0 && ( +
+ + +
+ )} + +
+ {items.map((item) => ( +
+ doCheck(item)} + /> +
+
{item.name}
+
+ {item.periodLabel} {item.target} 次 + {item.streak > 0 && 连续 {item.streak}} +
+ {item.note &&
{item.note}
} +
+ {item.periodStart === item.periodEnd + ? '今日' + : `${item.periodStart.slice(5)} ~ ${item.periodEnd.slice(5)}`} + {item.over > 0 && 超额 {item.over}} +
+
+
+ +
+
+ {item.done > 0 && ( + doUncheck(item)}>撤销 + )} + { + setForm({ id: item.id, name: item.name, period: item.period, target: item.target, color: item.color, note: item.note }) + setShowForm(true) + }} + >编辑 + removeHabit(item)}>归档 +
+ +
+ ))} +
+ + {/* 新建 / 编辑 */} + setShowForm(false)} + bodyStyle={{ borderTopLeftRadius: 12, borderTopRightRadius: 12, paddingBottom: 16 }} + > +
+
{form.id ? '编辑打卡项' : '新建打卡项'}
+
+ + setForm((f) => ({ ...f, name: v }))} + /> +
+
+ + setForm((f) => ({ ...f, period: v[0] }))} + /> +
+
+ + setForm((f) => ({ ...f, target: v }))} /> +
+
+ +
+ {COLORS.map((c) => ( + setForm((f) => ({ ...f, color: c }))} + /> + ))} +
+
+
+ + setForm((f) => ({ ...f, note: v }))} + /> +
+
+ + +
+
+
+
+ ) +} diff --git a/src/pages/checkin/ListView.jsx b/src/pages/checkin/ListView.jsx new file mode 100644 index 0000000..5c465af --- /dev/null +++ b/src/pages/checkin/ListView.jsx @@ -0,0 +1,291 @@ +import { useCallback, useEffect, useMemo, useState } from 'react' +import { + Button, Dialog, DotLoading, Empty, Input, Popup, Segmented, Selector, Toast, +} from 'antd-mobile' +import { Celebrate } from '../../components/RingProgress.jsx' +import { checklistApi } from '../../api/checkin.js' +import useRefreshOnVisible from '../../hooks/useRefreshOnVisible.js' + +const SCENES = ['出差', '回老家', '其他'] + +// 清单视图: 出差/回老家等场景的一次性检查清单 (F-LS-*) +export default function ListView() { + const [archived, setArchived] = useState(false) + const [lists, setLists] = useState(null) + const [err, setErr] = useState('') + const [openId, setOpenId] = useState(null) + const [newItem, setNewItem] = useState({}) + const [bursts, setBursts] = useState({}) + const [templates, setTemplates] = useState([]) + const [showForm, setShowForm] = useState(false) + const [form, setForm] = useState({ title: '', scene: '出差', templateId: '' }) + + const load = useCallback((silent) => { + if (!silent) setErr('') + checklistApi.lists(archived) + .then((d) => setLists(d.items || [])) + .catch((e) => { if (!silent) setErr(e.message) }) + }, [archived]) + + useEffect(() => { setLists(null); load(false) }, [load]) + useRefreshOnVisible(() => load(true)) + + useEffect(() => { + checklistApi.templates().then((d) => setTemplates(d.items || [])).catch(() => {}) + }, []) + + const withProgress = useCallback((list) => { + const items = list.items || [] + const done = items.filter((i) => i.done).length + return { + ...list, + total: items.length, + done, + percent: items.length > 0 ? done / items.length : 0, + completed: items.length > 0 && done === items.length, + } + }, []) + + const patchList = (id, updater) => + setLists((prev) => (prev || []).map((l) => (l.id === id ? updater(l) : l))) + + // 勾选: 乐观更新 + 服务端确认 (F-LS-03, F-SY-06) + async function toggleItem(listId, item) { + const snapshot = lists + const next = !item.done + patchList(listId, (l) => withProgress({ + ...l, + items: l.items.map((i) => (i.id === item.id ? { ...i, done: next } : i)), + })) + try { + await checklistApi.updateItem(item.id, { done: next }) + const l = (lists || []).find((x) => x.id === listId) + const updated = withProgress({ + ...l, + items: l.items.map((i) => (i.id === item.id ? { ...i, done: next } : i)), + }) + if (updated.completed) setBursts((m) => ({ ...m, [listId]: (m[listId] || 0) + 1 })) + } catch (e) { + setLists(snapshot) + Toast.show({ content: e.message || '更新失败' }) + } + } + + async function addItem(listId, title) { + const t = String(title || '').trim() + if (!t) return + try { + const { item } = await checklistApi.addItem(listId, { title: t }) + patchList(listId, (l) => withProgress({ ...l, items: [...l.items, item] })) + setNewItem((m) => ({ ...m, [listId]: '' })) + } catch (e) { + Toast.show({ content: e.message || '添加失败' }) + } + } + + async function removeItem(listId, itemId) { + const snapshot = lists + patchList(listId, (l) => withProgress({ ...l, items: l.items.filter((i) => i.id !== itemId) })) + try { + await checklistApi.removeItem(itemId) + } catch (e) { + setLists(snapshot) + Toast.show({ content: e.message || '删除失败' }) + } + } + + async function checkAll(listId, done) { + const snapshot = lists + patchList(listId, (l) => withProgress({ ...l, items: l.items.map((i) => ({ ...i, done })) })) + try { + const { item } = await checklistApi.checkAll(listId, done) + patchList(listId, () => withProgress(item)) + if (item.completed) setBursts((m) => ({ ...m, [listId]: (m[listId] || 0) + 1 })) + } catch (e) { + setLists(snapshot) + Toast.show({ content: e.message || '操作失败' }) + } + } + + async function createList() { + const title = String(form.title || '').trim() + if (!title) return Toast.show({ content: '请填写清单名称' }) + try { + await checklistApi.create({ title, scene: form.scene, templateId: form.templateId || undefined }) + setShowForm(false) + setForm({ title: '', scene: '出差', templateId: '' }) + load(true) + } catch (e) { + Toast.show({ content: e.message || '创建失败' }) + } + } + + async function duplicate(list) { + try { + await checklistApi.duplicate(list.id) + Toast.show({ content: '已复制为新清单' }) + load(true) + } catch (e) { + Toast.show({ content: e.message || '复制失败' }) + } + } + + async function saveAsTemplate(list) { + try { + await checklistApi.createTemplate({ + name: list.title, + scene: list.scene || '其他', + items: (list.items || []).map((i) => ({ title: i.title, note: i.note })), + }) + Toast.show({ content: '已保存为模板' }) + const d = await checklistApi.templates() + setTemplates(d.items || []) + } catch (e) { + Toast.show({ content: e.message || '保存失败' }) + } + } + + async function toggleArchive(list) { + try { + await checklistApi.update(list.id, { archived: !list.archived }) + Toast.show({ content: list.archived ? '已恢复到进行中' : '已归档' }) + load(true) + } catch (e) { + Toast.show({ content: e.message || '操作失败' }) + } + } + + async function removeList(list) { + const ok = await Dialog.confirm({ content: `删除「${list.title}」?`, confirmText: '删除', cancelText: '取消' }) + if (!ok) return + try { + await checklistApi.remove(list.id) + load(true) + } catch (e) { + Toast.show({ content: e.message || '删除失败' }) + } + } + + const sorted = useMemo(() => lists || [], [lists]) + + return ( +
+
+ setArchived(v === 'archived')} + /> + +
+ + {err &&
{err} load(false)}>重试
} + {lists === null && !err &&
加载中...
} + {lists !== null && !err && sorted.length === 0 && ( + + )} + +
+ {sorted.map((list) => { + const open = openId === list.id + return ( +
+
setOpenId(open ? null : list.id)}> +
+ {list.title} + {list.scene && {list.scene}} +
+
+
+
+
+ {list.done}/{list.total} + › +
+
+ + {open && ( +
+ {(list.items || []).map((item) => ( +
+ { e.stopPropagation(); toggleItem(list.id, item) }} + > + + + + + toggleItem(list.id, item)}> + {item.title} + {item.note && {item.note}} + + removeItem(list.id, item.id)}>× +
+ ))} + +
+ setNewItem((m) => ({ ...m, [list.id]: v }))} + onEnterPress={() => addItem(list.id, newItem[list.id])} + /> + +
+ +
+ checkAll(list.id, true)}>全选 + checkAll(list.id, false)}>全不选 + duplicate(list)}>复制 + saveAsTemplate(list)}>存为模板 + toggleArchive(list)}>{list.archived ? '恢复' : '归档'} + removeList(list)}>删除 +
+
+ )} + +
+ ) + })} +
+ + setShowForm(false)} + bodyStyle={{ borderTopLeftRadius: 12, borderTopRightRadius: 12, paddingBottom: 16 }} + > +
+
新建检查清单
+
+ + setForm((f) => ({ ...f, title: v }))} /> +
+
+ + ({ label: s, value: s }))} + value={[form.scene]} + onChange={(v) => setForm((f) => ({ ...f, scene: v[0] }))} + /> +
+
+ + ({ label: t.name, value: String(t.id) }))]} + value={[form.templateId]} + onChange={(v) => setForm((f) => ({ ...f, templateId: v[0] }))} + /> +
+
+ + +
+
+
+
+ ) +} diff --git a/src/pages/checkin/date.js b/src/pages/checkin/date.js new file mode 100644 index 0000000..7881d01 --- /dev/null +++ b/src/pages/checkin/date.js @@ -0,0 +1,88 @@ +// 前端日期/周期工具: 与 server/checkin/period.js 保持同一套口径 (Asia/Shanghai) +export const TZ = 'Asia/Shanghai' + +const FMT = new Intl.DateTimeFormat('en-CA', { + timeZone: TZ, year: 'numeric', month: '2-digit', day: '2-digit', +}) + +/** 任意时间 -> 本地日历日 "YYYY-MM-DD" */ +export function toDateStr(d = new Date()) { + return FMT.format(d instanceof Date ? d : new Date(d)) +} + +function toUTC(s) { + const [y, m, d] = String(s).split('-').map(Number) + return new Date(Date.UTC(y, (m || 1) - 1, d || 1)) +} + +function fromUTC(dt) { + return dt.toISOString().slice(0, 10) +} + +export function addDays(s, n) { + const d = toUTC(s) + d.setUTCDate(d.getUTCDate() + n) + return fromUTC(d) +} + +export function addMonths(s, n) { + const [y, m] = String(s).split('-').map(Number) + const first = new Date(Date.UTC(y, (m || 1) - 1 + n, 1)) + const day = Number(String(s).slice(8, 10)) || 1 + const lastDay = new Date(Date.UTC(first.getUTCFullYear(), first.getUTCMonth() + 1, 0)).getUTCDate() + first.setUTCDate(Math.min(day, lastDay)) + return fromUTC(first) +} + +/** 周一为一周第一天 */ +export function startOfWeek(s) { + const dow = (toUTC(s).getUTCDay() + 6) % 7 + return addDays(s, -dow) +} + +export const PERIOD_LABEL = { day: '每天', week: '每周', month: '每月', year: '每年' } + +export function periodRange(period, s) { + switch (period) { + case 'week': { + const start = startOfWeek(s) + return { start, end: addDays(start, 6) } + } + case 'month': { + const start = String(s).slice(0, 8) + '01' + const [y, m] = String(s).split('-').map(Number) + return { start, end: fromUTC(new Date(Date.UTC(y, m || 1, 0))) } + } + case 'year': { + const y = String(s).slice(0, 4) + return { start: y + '-01-01', end: y + '-12-31' } + } + default: return { start: s, end: s } + } +} + +/** 月历网格: 返回 6*7 = 42 天 (含前后月的补位), 周一起始 */ +export function monthGrid(monthStr) { + const first = monthStr + '-01' + const gridStart = startOfWeek(first) + const days = [] + for (let i = 0; i < 42; i++) days.push(addDays(gridStart, i)) + return days +} + +export function weekdayLabels() { + return ['一', '二', '三', '四', '五', '六', '日'] +} + +/** 相对今天的文案: 昨天 / 今天 / 明天 / MM-DD */ +export function dayLabel(dateStr, today = toDateStr()) { + if (dateStr === today) return '今天' + if (dateStr === addDays(today, -1)) return '昨天' + if (dateStr === addDays(today, 1)) return '明天' + return dateStr.slice(5).replace('-', '/') +} + +export function fmtMonth(monthStr) { + const [y, m] = monthStr.split('-') + return y + '年' + Number(m) + '月' +} diff --git a/src/styles/globals.css b/src/styles/globals.css index a778ea9..4c407ee 100644 --- a/src/styles/globals.css +++ b/src/styles/globals.css @@ -500,3 +500,171 @@ input, textarea, select { font: inherit; } color: #fff; } .oil-day.future .oil-day-status { color: rgba(255,255,255,.85); } + +/* ================== 打卡 / 日历 / 清单 (V0.2) ================== */ +.checkin-content { padding: 0 0 16px; flex: 1 1 auto; min-height: 0; display: flex; flex-direction: column; } +.checkin-content .adm-tabs-content { --content-padding: 0; } + +/* ----- 环形进度 ----- */ +.ring-wrap { position: relative; display: inline-flex; flex-shrink: 0; align-items: center; justify-content: center; } +.ring-wrap.clickable { cursor: pointer; } +.ring-wrap.disabled { opacity: .5; } +.ring-svg { display: block; } +.ring-bar { transition: stroke-dashoffset 0.45s cubic-bezier(0.4, 0, 0.2, 1); } +.ring-center { + position: absolute; inset: 0; display: flex; align-items: center; justify-content: center; + font-size: 13px; font-weight: 600; color: var(--color-text); font-variant-numeric: tabular-nums; +} +.ring-num em { font-style: normal; font-size: 10px; color: var(--color-muted); font-weight: 400; } +.ring-check { animation: ring-check-in 0.32s ease; } +@keyframes ring-check-in { from { transform: scale(0.4); opacity: 0; } to { transform: scale(1); opacity: 1; } } +.ring-over { + position: absolute; right: -2px; bottom: -2px; font-size: 10px; font-weight: 600; + color: #fff; background: #ff8f1f; border-radius: 8px; padding: 0 4px; line-height: 14px; +} + +/* ----- 完成特效 ----- */ +.celebrate { position: absolute; inset: 0; pointer-events: none; z-index: 6; } +.celebrate i { + position: absolute; left: 50%; top: 50%; width: 7px; height: 7px; margin: -3.5px 0 0 -3.5px; + border-radius: 50%; animation: burst-fly 0.7s ease-out forwards; +} +@keyframes burst-fly { + 0% { transform: rotate(var(--a)) translateX(0) scale(1); opacity: 1; } + 70% { opacity: 1; } + 100% { transform: rotate(var(--a)) translateX(var(--d)) scale(0.3); opacity: 0; } +} +.celebrate-ring { + position: absolute; left: 50%; top: 50%; width: 64px; height: 64px; margin: -32px 0 0 -32px; + border-radius: 50%; border: 2px solid var(--color-primary); animation: ring-pulse 0.7s ease-out forwards; +} +@keyframes ring-pulse { + 0% { transform: scale(0.3); opacity: 0.9; } + 100% { transform: scale(1.7); opacity: 0; } +} + +/* ----- 打卡视图 ----- */ +.habit-view { padding: 0 12px 20px; } +.habit-head { display: flex; justify-content: space-between; align-items: flex-end; gap: 8px; padding: 10px 2px; } +.habit-date { font-size: 18px; font-weight: 700; color: var(--color-text); } +.habit-summary { font-size: 12px; color: var(--color-muted); margin-top: 2px; } +.habit-summary strong { color: var(--color-primary); font-size: 14px; } +.habit-badge { margin-left: 6px; font-size: 11px; color: #ad6800; background: #fff7e6; border-radius: 4px; padding: 1px 5px; } +.habit-head-right { display: flex; gap: 6px; flex-shrink: 0; } +.checkin-empty { padding: 48px 0; text-align: center; display: flex; flex-direction: column; align-items: center; gap: 12px; } + +.habit-list { display: flex; flex-direction: column; gap: 10px; } +.habit-card { + position: relative; background: #fff; border-radius: 10px; padding: 12px; + display: grid; grid-template-columns: auto 1fr auto; grid-template-areas: "ring main actions" "foot foot foot"; + gap: 8px 12px; box-shadow: 0 1px 2px rgba(0,0,0,.04); + transition: background 0.2s ease; +} +.habit-card:active { background: #fafafa; } +.habit-card.done { background: #f7fbf8; } +.habit-card .ring-wrap { grid-area: ring; } +.habit-main { grid-area: main; min-width: 0; } +.habit-actions { grid-area: actions; display: flex; align-items: center; } +.habit-foot { + grid-area: foot; display: flex; gap: 14px; padding-top: 8px; border-top: 1px dashed var(--color-border); +} +.habit-name { font-size: 15px; font-weight: 600; color: var(--color-text); word-break: break-all; } +.habit-meta { font-size: 12px; color: var(--color-muted); margin-top: 3px; } +.habit-streak { margin-left: 8px; color: #ff8f1f; background: rgba(255,143,31,.12); border-radius: 4px; padding: 1px 6px; } +.habit-note { font-size: 11px; color: var(--color-muted); margin-top: 3px; } +.habit-range { font-size: 11px; color: var(--color-muted); margin-top: 3px; font-variant-numeric: tabular-nums; } +.habit-over { margin-left: 8px; color: #ff8f1f; } +.habit-link { font-size: 12px; color: var(--color-primary); cursor: pointer; } +.habit-link.danger { color: var(--color-danger); } + +/* ----- 日历视图 ----- */ +.calendar-view { padding: 0 12px 20px; } +.cal-month-bar { display: flex; align-items: center; gap: 10px; padding: 8px 2px; } +.cal-month { font-size: 16px; font-weight: 700; color: var(--color-text); } +.cal-arrow { font-size: 20px; color: var(--color-muted); cursor: pointer; padding: 0 4px; line-height: 1; } +.cal-today-btn { margin-left: auto; font-size: 12px; color: var(--color-primary); cursor: pointer; } +.cal-quick { padding: 2px 0 10px; } +.cal-grid { background: #fff; border-radius: 10px; padding: 8px 6px 10px; box-shadow: 0 1px 2px rgba(0,0,0,.04); } +.cal-weekday, .cal-days { display: grid; grid-template-columns: repeat(7, 1fr); } +.cal-weekday span { text-align: center; font-size: 11px; color: var(--color-muted); padding: 4px 0; } +.cal-day { + position: relative; height: 38px; display: flex; flex-direction: column; align-items: center; + justify-content: center; border-radius: 8px; cursor: pointer; +} +.cal-day-num { font-size: 13px; color: var(--color-text); font-variant-numeric: tabular-nums; } +.cal-day.out .cal-day-num { color: #c8c8c8; } +.cal-day.future .cal-day-num { color: #b0b0b0; } +.cal-day.today .cal-day-num { color: var(--color-primary); font-weight: 700; } +.cal-day.selected { background: var(--color-primary); } +.cal-day.selected .cal-day-num { color: #fff; font-weight: 600; } +.cal-dot { width: 5px; height: 5px; border-radius: 50%; margin-top: 3px; } +.cal-dot.partial { background: #ffc53d; } +.cal-dot.full { background: #00b578; } +.cal-dot.over { background: #a855f7; } +.cal-day.selected .cal-dot { background: #fff; } +.cal-rate { font-size: 12px; color: var(--color-muted); padding: 8px 2px; } +.cal-rate strong { color: var(--color-primary); } +.cal-detail { margin-top: 6px; } +.cal-detail-title { font-size: 14px; font-weight: 600; color: var(--color-text); padding: 6px 2px 8px; } +.cal-item { + position: relative; display: flex; align-items: center; gap: 8px; background: #fff; + border-radius: 8px; padding: 10px 12px; margin-bottom: 8px; box-shadow: 0 1px 2px rgba(0,0,0,.04); +} +.cal-item.done { background: #f7fbf8; } +.cal-item-dot { width: 8px; height: 8px; border-radius: 50%; flex-shrink: 0; } +.cal-item-name { font-size: 14px; font-weight: 600; color: var(--color-text); } +.cal-item-meta { font-size: 11px; color: var(--color-muted); flex: 1; text-align: right; font-variant-numeric: tabular-nums; } +.cal-item-right { flex-shrink: 0; } +.cal-item-plan { font-size: 12px; color: var(--color-muted); } + +/* ----- 清单视图 ----- */ +.list-view { padding: 0 12px 20px; } +.list-view-head { display: flex; align-items: center; gap: 8px; padding: 8px 0 10px; } +.list-view-head .adm-segmented { flex: 1; } +.checklist-wrap { display: flex; flex-direction: column; gap: 10px; } +.checklist-card { + position: relative; background: #fff; border-radius: 10px; padding: 12px; + box-shadow: 0 1px 2px rgba(0,0,0,.04); +} +.checklist-card.done { background: #f7fbf8; } +.checklist-head { cursor: pointer; } +.checklist-title-row { display: flex; align-items: center; gap: 8px; } +.checklist-title { font-size: 15px; font-weight: 600; color: var(--color-text); } +.checklist-scene { font-size: 11px; color: var(--color-primary); background: #f0f5ff; border-radius: 4px; padding: 1px 6px; } +.checklist-progress-row { display: flex; align-items: center; gap: 8px; margin-top: 8px; } +.checklist-bar { flex: 1; height: 6px; border-radius: 3px; background: #f0f0f0; overflow: hidden; } +.checklist-bar-fill { height: 100%; border-radius: 3px; background: #00b578; transition: width 0.4s ease; } +.checklist-count { font-size: 12px; color: var(--color-muted); font-variant-numeric: tabular-nums; } +.checklist-arrow { color: var(--color-muted); transition: transform 0.2s ease; } +.checklist-arrow.open { transform: rotate(90deg); } +.checklist-body { margin-top: 10px; padding-top: 8px; border-top: 1px dashed var(--color-border); } +.checklist-item { display: flex; align-items: center; gap: 8px; padding: 7px 0; } +.check-box { + width: 20px; height: 20px; border-radius: 50%; border: 1.5px solid #d0d0d0; flex-shrink: 0; + display: inline-flex; align-items: center; justify-content: center; cursor: pointer; + transition: background 0.2s ease, border-color 0.2s ease; +} +.check-box svg { opacity: 0; transition: opacity 0.15s ease; } +.checklist-item.done .check-box { background: #00b578; border-color: #00b578; } +.checklist-item.done .check-box svg { opacity: 1; } +.checklist-item-title { flex: 1; font-size: 14px; color: var(--color-text); cursor: pointer; } +.checklist-item-title em { display: block; font-style: normal; font-size: 11px; color: var(--color-muted); margin-top: 2px; } +.checklist-item.done .checklist-item-title { color: #a0a0a0; text-decoration: line-through; } +.checklist-item-del { color: #ccc; font-size: 18px; line-height: 1; padding: 0 4px; cursor: pointer; } +.checklist-add { display: flex; align-items: center; gap: 8px; margin-top: 8px; } +.checklist-add .adm-input { flex: 1; border: 1px solid var(--color-border); border-radius: 6px; padding: 6px 8px; } +.checklist-actions { display: flex; flex-wrap: wrap; gap: 12px; margin-top: 10px; } + +/* ----- 表单弹窗 (打卡项 / 清单) ----- */ +.form-popup { padding: 16px 16px 8px; } +.form-title { font-size: 16px; font-weight: 700; color: var(--color-text); margin-bottom: 12px; } +.form-field { margin-bottom: 14px; } +.form-field > label { display: block; font-size: 12px; color: var(--color-muted); margin-bottom: 6px; } +.form-field .adm-input { border: 1px solid var(--color-border); border-radius: 8px; padding: 8px 10px; } +.form-actions { margin-top: 18px; } +.color-row { display: flex; gap: 10px; flex-wrap: wrap; } +.color-dot { + width: 26px; height: 26px; border-radius: 50%; cursor: pointer; display: inline-block; + border: 2px solid transparent; transition: transform 0.15s ease; +} +.color-dot.active { border-color: rgba(0,0,0,.25); transform: scale(1.12); }