9792 lines
167 KiB
HTML
9792 lines
167 KiB
HTML
|
||
<!doctype html>
|
||
<html lang="en" class="no-js">
|
||
<head>
|
||
|
||
<meta charset="utf-8">
|
||
<meta name="viewport" content="width=device-width,initial-scale=1">
|
||
|
||
<meta name="description" content="Build Power. Not Rent It. Own your digital infrastructure.">
|
||
|
||
|
||
<meta name="author" content="Bunker Operations">
|
||
|
||
|
||
<link rel="canonical" href="https://bnkserve.org/v2/database/schema/">
|
||
|
||
|
||
<link rel="prev" href="../">
|
||
|
||
|
||
<link rel="next" href="../migrations/">
|
||
|
||
|
||
|
||
|
||
|
||
<link rel="icon" href="../../../assets/favicon.png">
|
||
<meta name="generator" content="mkdocs-1.6.1, mkdocs-material-9.7.1">
|
||
|
||
|
||
|
||
<title>Schema Overview - Changemaker Lite</title>
|
||
|
||
|
||
|
||
<link rel="stylesheet" href="../../../assets/stylesheets/main.484c7ddc.min.css">
|
||
|
||
|
||
<link rel="stylesheet" href="../../../assets/stylesheets/palette.ab4e12ef.min.css">
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
|
||
<link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Inter:300,300i,400,400i,700,700i%7CJetBrains+Mono:400,400i,700,700i&display=fallback">
|
||
<style>:root{--md-text-font:"Inter";--md-code-font:"JetBrains Mono"}</style>
|
||
|
||
|
||
|
||
<link rel="stylesheet" href="../../../stylesheets/extra.css">
|
||
|
||
<link rel="stylesheet" href="../../../stylesheets/home.css">
|
||
|
||
<link rel="stylesheet" href="../../../assets/css/video-player.css">
|
||
|
||
<script>__md_scope=new URL("../../..",location),__md_hash=e=>[...e].reduce(((e,_)=>(e<<5)-e+_.charCodeAt(0)),0),__md_get=(e,_=localStorage,t=__md_scope)=>JSON.parse(_.getItem(t.pathname+"."+e)),__md_set=(e,_,t=localStorage,a=__md_scope)=>{try{t.setItem(a.pathname+"."+e,JSON.stringify(_))}catch(e){}}</script>
|
||
|
||
|
||
|
||
|
||
|
||
|
||
<meta property="og:type" content="website" />
|
||
<meta property="og:title" content="Schema Overview - Changemaker Lite" />
|
||
<meta property="og:description" content="Build Power. Not Rent It. Own your digital infrastructure." />
|
||
<meta property="og:image" content="https://bnkserve.org/assets/images/social/v2/database/schema.png" />
|
||
<meta property="og:image:type" content="image/png" />
|
||
<meta property="og:image:width" content="1200" />
|
||
<meta property="og:image:height" content="630" />
|
||
<meta property="og:url" content="https://bnkserve.org/v2/database/schema/" />
|
||
<meta property="twitter:card" content="summary_large_image" />
|
||
<meta property="twitter:title" content="Schema Overview - Changemaker Lite" />
|
||
<meta property="twitter:description" content="Build Power. Not Rent It. Own your digital infrastructure." />
|
||
<meta property="twitter:image" content="https://bnkserve.org/assets/images/social/v2/database/schema.png" />
|
||
</head>
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
<body dir="ltr" data-md-color-scheme="slate" data-md-color-primary="deep-purple" data-md-color-accent="amber">
|
||
|
||
|
||
<input class="md-toggle" data-md-toggle="drawer" type="checkbox" id="__drawer" autocomplete="off">
|
||
<input class="md-toggle" data-md-toggle="search" type="checkbox" id="__search" autocomplete="off">
|
||
<label class="md-overlay" for="__drawer"></label>
|
||
<div data-md-component="skip">
|
||
|
||
|
||
<a href="#complete-schema-reference" class="md-skip">
|
||
Skip to content
|
||
</a>
|
||
|
||
</div>
|
||
<div data-md-component="announce">
|
||
|
||
</div>
|
||
|
||
|
||
|
||
|
||
|
||
|
||
<header class="md-header md-header--shadow md-header--lifted" data-md-component="header">
|
||
<nav class="md-header__inner md-grid" aria-label="Header">
|
||
<a href="../../.." title="Changemaker Lite" class="md-header__button md-logo" aria-label="Changemaker Lite" data-md-component="logo">
|
||
|
||
<img src="../../../assets/logo.png" alt="logo">
|
||
|
||
</a>
|
||
<label class="md-header__button md-icon" for="__drawer">
|
||
|
||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M3 6h18v2H3zm0 5h18v2H3zm0 5h18v2H3z"/></svg>
|
||
</label>
|
||
<div class="md-header__title" data-md-component="header-title">
|
||
<div class="md-header__ellipsis">
|
||
<div class="md-header__topic">
|
||
<span class="md-ellipsis">
|
||
Changemaker Lite
|
||
</span>
|
||
</div>
|
||
<div class="md-header__topic" data-md-component="header-topic">
|
||
<span class="md-ellipsis">
|
||
|
||
Schema Overview
|
||
|
||
</span>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
|
||
|
||
<form class="md-header__option" data-md-component="palette">
|
||
|
||
|
||
|
||
|
||
<input class="md-option" data-md-color-media="" data-md-color-scheme="slate" data-md-color-primary="deep-purple" data-md-color-accent="amber" aria-label="Switch to light mode" type="radio" name="__palette" id="__palette_0">
|
||
|
||
<label class="md-header__button md-icon" title="Switch to light mode" for="__palette_1" hidden>
|
||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="m17.75 4.09-2.53 1.94.91 3.06-2.63-1.81-2.63 1.81.91-3.06-2.53-1.94L12.44 4l1.06-3 1.06 3zm3.5 6.91-1.64 1.25.59 1.98-1.7-1.17-1.7 1.17.59-1.98L15.75 11l2.06-.05L18.5 9l.69 1.95zm-2.28 4.95c.83-.08 1.72 1.1 1.19 1.85-.32.45-.66.87-1.08 1.27C15.17 23 8.84 23 4.94 19.07c-3.91-3.9-3.91-10.24 0-14.14.4-.4.82-.76 1.27-1.08.75-.53 1.93.36 1.85 1.19-.27 2.86.69 5.83 2.89 8.02a9.96 9.96 0 0 0 8.02 2.89m-1.64 2.02a12.08 12.08 0 0 1-7.8-3.47c-2.17-2.19-3.33-5-3.49-7.82-2.81 3.14-2.7 7.96.31 10.98 3.02 3.01 7.84 3.12 10.98.31"/></svg>
|
||
</label>
|
||
|
||
|
||
|
||
|
||
|
||
<input class="md-option" data-md-color-media="" data-md-color-scheme="default" data-md-color-primary="deep-purple" data-md-color-accent="amber" aria-label="Switch to dark mode" type="radio" name="__palette" id="__palette_1">
|
||
|
||
<label class="md-header__button md-icon" title="Switch to dark mode" for="__palette_0" hidden>
|
||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M12 7a5 5 0 0 1 5 5 5 5 0 0 1-5 5 5 5 0 0 1-5-5 5 5 0 0 1 5-5m0 2a3 3 0 0 0-3 3 3 3 0 0 0 3 3 3 3 0 0 0 3-3 3 3 0 0 0-3-3m0-7 2.39 3.42C13.65 5.15 12.84 5 12 5s-1.65.15-2.39.42zM3.34 7l4.16-.35A7.2 7.2 0 0 0 5.94 8.5c-.44.74-.69 1.5-.83 2.29zm.02 10 1.76-3.77a7.131 7.131 0 0 0 2.38 4.14zM20.65 7l-1.77 3.79a7.02 7.02 0 0 0-2.38-4.15zm-.01 10-4.14.36c.59-.51 1.12-1.14 1.54-1.86.42-.73.69-1.5.83-2.29zM12 22l-2.41-3.44c.74.27 1.55.44 2.41.44.82 0 1.63-.17 2.37-.44z"/></svg>
|
||
</label>
|
||
|
||
|
||
</form>
|
||
|
||
|
||
|
||
<script>var palette=__md_get("__palette");if(palette&&palette.color){if("(prefers-color-scheme)"===palette.color.media){var media=matchMedia("(prefers-color-scheme: light)"),input=document.querySelector(media.matches?"[data-md-color-media='(prefers-color-scheme: light)']":"[data-md-color-media='(prefers-color-scheme: dark)']");palette.color.media=input.getAttribute("data-md-color-media"),palette.color.scheme=input.getAttribute("data-md-color-scheme"),palette.color.primary=input.getAttribute("data-md-color-primary"),palette.color.accent=input.getAttribute("data-md-color-accent")}for(var[key,value]of Object.entries(palette.color))document.body.setAttribute("data-md-color-"+key,value)}</script>
|
||
|
||
|
||
|
||
|
||
|
||
<label class="md-header__button md-icon" for="__search">
|
||
|
||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M9.5 3A6.5 6.5 0 0 1 16 9.5c0 1.61-.59 3.09-1.56 4.23l.27.27h.79l5 5-1.5 1.5-5-5v-.79l-.27-.27A6.52 6.52 0 0 1 9.5 16 6.5 6.5 0 0 1 3 9.5 6.5 6.5 0 0 1 9.5 3m0 2C7 5 5 7 5 9.5S7 14 9.5 14 14 12 14 9.5 12 5 9.5 5"/></svg>
|
||
</label>
|
||
<div class="md-search" data-md-component="search" role="dialog">
|
||
<label class="md-search__overlay" for="__search"></label>
|
||
<div class="md-search__inner" role="search">
|
||
<form class="md-search__form" name="search">
|
||
<input type="text" class="md-search__input" name="query" aria-label="Search" placeholder="Search" autocapitalize="off" autocorrect="off" autocomplete="off" spellcheck="false" data-md-component="search-query" required>
|
||
<label class="md-search__icon md-icon" for="__search">
|
||
|
||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M9.5 3A6.5 6.5 0 0 1 16 9.5c0 1.61-.59 3.09-1.56 4.23l.27.27h.79l5 5-1.5 1.5-5-5v-.79l-.27-.27A6.52 6.52 0 0 1 9.5 16 6.5 6.5 0 0 1 3 9.5 6.5 6.5 0 0 1 9.5 3m0 2C7 5 5 7 5 9.5S7 14 9.5 14 14 12 14 9.5 12 5 9.5 5"/></svg>
|
||
|
||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M20 11v2H8l5.5 5.5-1.42 1.42L4.16 12l7.92-7.92L13.5 5.5 8 11z"/></svg>
|
||
</label>
|
||
<nav class="md-search__options" aria-label="Search">
|
||
|
||
<a href="javascript:void(0)" class="md-search__icon md-icon" title="Share" aria-label="Share" data-clipboard data-clipboard-text="" data-md-component="search-share" tabindex="-1">
|
||
|
||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M18 16.08c-.76 0-1.44.3-1.96.77L8.91 12.7c.05-.23.09-.46.09-.7s-.04-.47-.09-.7l7.05-4.11c.54.5 1.25.81 2.04.81a3 3 0 0 0 3-3 3 3 0 0 0-3-3 3 3 0 0 0-3 3c0 .24.04.47.09.7L8.04 9.81C7.5 9.31 6.79 9 6 9a3 3 0 0 0-3 3 3 3 0 0 0 3 3c.79 0 1.5-.31 2.04-.81l7.12 4.15c-.05.21-.08.43-.08.66 0 1.61 1.31 2.91 2.92 2.91s2.92-1.3 2.92-2.91A2.92 2.92 0 0 0 18 16.08"/></svg>
|
||
</a>
|
||
|
||
<button type="reset" class="md-search__icon md-icon" title="Clear" aria-label="Clear" tabindex="-1">
|
||
|
||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M19 6.41 17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12z"/></svg>
|
||
</button>
|
||
</nav>
|
||
|
||
<div class="md-search__suggest" data-md-component="search-suggest"></div>
|
||
|
||
</form>
|
||
<div class="md-search__output">
|
||
<div class="md-search__scrollwrap" tabindex="0" data-md-scrollfix>
|
||
<div class="md-search-result" data-md-component="search-result">
|
||
<div class="md-search-result__meta">
|
||
Initializing search
|
||
</div>
|
||
<ol class="md-search-result__list" role="presentation"></ol>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
|
||
|
||
|
||
<div class="md-header__source">
|
||
<a href="https://gitea.bnkops.com/admin/changemaker.lite" title="Go to repository" class="md-source" data-md-component="source">
|
||
<div class="md-source__icon md-icon">
|
||
|
||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 448 512"><!--! Font Awesome Free 7.1.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2025 Fonticons, Inc.--><path d="M439.6 236.1 244 40.5c-5.4-5.5-12.8-8.5-20.4-8.5s-15 3-20.4 8.4L162.5 81l51.5 51.5c27.1-9.1 52.7 16.8 43.4 43.7l49.7 49.7c34.2-11.8 61.2 31 35.5 56.7-26.5 26.5-70.2-2.9-56-37.3L240.3 199v121.9c25.3 12.5 22.3 41.8 9.1 55-6.4 6.4-15.2 10.1-24.3 10.1s-17.8-3.6-24.3-10.1c-17.6-17.6-11.1-46.9 11.2-56v-123c-20.8-8.5-24.6-30.7-18.6-45L142.6 101 8.5 235.1C3 240.6 0 247.9 0 255.5s3 15 8.5 20.4l195.6 195.7c5.4 5.4 12.7 8.4 20.4 8.4s15-3 20.4-8.4l194.7-194.7c5.4-5.4 8.4-12.8 8.4-20.4s-3-15-8.4-20.4"/></svg>
|
||
</div>
|
||
<div class="md-source__repository">
|
||
changemaker.lite
|
||
</div>
|
||
</a>
|
||
</div>
|
||
|
||
</nav>
|
||
|
||
|
||
|
||
<nav class="md-tabs" aria-label="Tabs" data-md-component="tabs">
|
||
<div class="md-grid">
|
||
<ul class="md-tabs__list">
|
||
|
||
|
||
|
||
|
||
|
||
|
||
<li class="md-tabs__item">
|
||
<a href="../../.." class="md-tabs__link">
|
||
|
||
|
||
|
||
|
||
|
||
Home
|
||
|
||
</a>
|
||
</li>
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
<li class="md-tabs__item md-tabs__item--active">
|
||
<a href="../../" class="md-tabs__link">
|
||
|
||
|
||
|
||
|
||
|
||
V2 Documentation
|
||
|
||
</a>
|
||
</li>
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
<li class="md-tabs__item">
|
||
<a href="../../../phil/" class="md-tabs__link">
|
||
|
||
|
||
|
||
|
||
|
||
Philosophy
|
||
|
||
</a>
|
||
</li>
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
<li class="md-tabs__item">
|
||
<a href="../../../v1/" class="md-tabs__link">
|
||
|
||
|
||
|
||
|
||
|
||
V1 Documentation (Legacy)
|
||
|
||
</a>
|
||
</li>
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
<li class="md-tabs__item">
|
||
<a href="../../../blog/" class="md-tabs__link">
|
||
|
||
|
||
|
||
|
||
|
||
Blog
|
||
|
||
</a>
|
||
</li>
|
||
|
||
|
||
|
||
|
||
</ul>
|
||
</div>
|
||
</nav>
|
||
|
||
|
||
</header>
|
||
|
||
<div class="md-container" data-md-component="container">
|
||
|
||
|
||
|
||
|
||
<main class="md-main" data-md-component="main">
|
||
<div class="md-main__inner md-grid">
|
||
|
||
|
||
|
||
<div class="md-sidebar md-sidebar--primary" data-md-component="sidebar" data-md-type="navigation" >
|
||
<div class="md-sidebar__scrollwrap">
|
||
<div class="md-sidebar__inner">
|
||
|
||
|
||
|
||
|
||
|
||
|
||
<nav class="md-nav md-nav--primary md-nav--lifted" aria-label="Navigation" data-md-level="0">
|
||
<label class="md-nav__title" for="__drawer">
|
||
<a href="../../.." title="Changemaker Lite" class="md-nav__button md-logo" aria-label="Changemaker Lite" data-md-component="logo">
|
||
|
||
<img src="../../../assets/logo.png" alt="logo">
|
||
|
||
</a>
|
||
Changemaker Lite
|
||
</label>
|
||
|
||
<div class="md-nav__source">
|
||
<a href="https://gitea.bnkops.com/admin/changemaker.lite" title="Go to repository" class="md-source" data-md-component="source">
|
||
<div class="md-source__icon md-icon">
|
||
|
||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 448 512"><!--! Font Awesome Free 7.1.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2025 Fonticons, Inc.--><path d="M439.6 236.1 244 40.5c-5.4-5.5-12.8-8.5-20.4-8.5s-15 3-20.4 8.4L162.5 81l51.5 51.5c27.1-9.1 52.7 16.8 43.4 43.7l49.7 49.7c34.2-11.8 61.2 31 35.5 56.7-26.5 26.5-70.2-2.9-56-37.3L240.3 199v121.9c25.3 12.5 22.3 41.8 9.1 55-6.4 6.4-15.2 10.1-24.3 10.1s-17.8-3.6-24.3-10.1c-17.6-17.6-11.1-46.9 11.2-56v-123c-20.8-8.5-24.6-30.7-18.6-45L142.6 101 8.5 235.1C3 240.6 0 247.9 0 255.5s3 15 8.5 20.4l195.6 195.7c5.4 5.4 12.7 8.4 20.4 8.4s15-3 20.4-8.4l194.7-194.7c5.4-5.4 8.4-12.8 8.4-20.4s-3-15-8.4-20.4"/></svg>
|
||
</div>
|
||
<div class="md-source__repository">
|
||
changemaker.lite
|
||
</div>
|
||
</a>
|
||
</div>
|
||
|
||
<ul class="md-nav__list" data-md-scrollfix>
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
<li class="md-nav__item">
|
||
<a href="../../.." class="md-nav__link">
|
||
|
||
|
||
|
||
<span class="md-ellipsis">
|
||
|
||
|
||
Home
|
||
|
||
|
||
|
||
</span>
|
||
|
||
|
||
|
||
</a>
|
||
</li>
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
<li class="md-nav__item md-nav__item--active md-nav__item--section md-nav__item--nested">
|
||
|
||
|
||
|
||
<input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_2" checked>
|
||
|
||
|
||
<div class="md-nav__link md-nav__container">
|
||
<a href="../../" class="md-nav__link ">
|
||
|
||
|
||
|
||
<span class="md-ellipsis">
|
||
|
||
|
||
V2 Documentation
|
||
|
||
|
||
|
||
</span>
|
||
|
||
|
||
|
||
</a>
|
||
|
||
|
||
<label class="md-nav__link " for="__nav_2" id="__nav_2_label" tabindex="">
|
||
<span class="md-nav__icon md-icon"></span>
|
||
</label>
|
||
|
||
</div>
|
||
|
||
<nav class="md-nav" data-md-level="1" aria-labelledby="__nav_2_label" aria-expanded="true">
|
||
<label class="md-nav__title" for="__nav_2">
|
||
<span class="md-nav__icon md-icon"></span>
|
||
|
||
|
||
V2 Documentation
|
||
|
||
|
||
</label>
|
||
<ul class="md-nav__list" data-md-scrollfix>
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
<li class="md-nav__item md-nav__item--section md-nav__item--nested">
|
||
|
||
|
||
|
||
|
||
|
||
<input class="md-nav__toggle md-toggle md-toggle--indeterminate" type="checkbox" id="__nav_2_2" >
|
||
|
||
|
||
<div class="md-nav__link md-nav__container">
|
||
<a href="../../getting-started/" class="md-nav__link ">
|
||
|
||
|
||
|
||
<span class="md-ellipsis">
|
||
|
||
|
||
Getting Started
|
||
|
||
|
||
|
||
</span>
|
||
|
||
|
||
|
||
</a>
|
||
|
||
|
||
<label class="md-nav__link " for="__nav_2_2" id="__nav_2_2_label" tabindex="">
|
||
<span class="md-nav__icon md-icon"></span>
|
||
</label>
|
||
|
||
</div>
|
||
|
||
<nav class="md-nav" data-md-level="2" aria-labelledby="__nav_2_2_label" aria-expanded="false">
|
||
<label class="md-nav__title" for="__nav_2_2">
|
||
<span class="md-nav__icon md-icon"></span>
|
||
|
||
|
||
Getting Started
|
||
|
||
|
||
</label>
|
||
<ul class="md-nav__list" data-md-scrollfix>
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
<li class="md-nav__item">
|
||
<a href="../../getting-started/quick-start/" class="md-nav__link">
|
||
|
||
|
||
|
||
<span class="md-ellipsis">
|
||
|
||
|
||
Quick Start
|
||
|
||
|
||
|
||
</span>
|
||
|
||
|
||
|
||
</a>
|
||
</li>
|
||
|
||
|
||
|
||
|
||
</ul>
|
||
</nav>
|
||
|
||
</li>
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
<li class="md-nav__item md-nav__item--section md-nav__item--nested">
|
||
|
||
|
||
|
||
|
||
|
||
<input class="md-nav__toggle md-toggle md-toggle--indeterminate" type="checkbox" id="__nav_2_3" >
|
||
|
||
|
||
<div class="md-nav__link md-nav__container">
|
||
<a href="../../architecture/" class="md-nav__link ">
|
||
|
||
|
||
|
||
<span class="md-ellipsis">
|
||
|
||
|
||
Architecture
|
||
|
||
|
||
|
||
</span>
|
||
|
||
|
||
|
||
</a>
|
||
|
||
|
||
<label class="md-nav__link " for="__nav_2_3" id="__nav_2_3_label" tabindex="">
|
||
<span class="md-nav__icon md-icon"></span>
|
||
</label>
|
||
|
||
</div>
|
||
|
||
<nav class="md-nav" data-md-level="2" aria-labelledby="__nav_2_3_label" aria-expanded="false">
|
||
<label class="md-nav__title" for="__nav_2_3">
|
||
<span class="md-nav__icon md-icon"></span>
|
||
|
||
|
||
Architecture
|
||
|
||
|
||
</label>
|
||
<ul class="md-nav__list" data-md-scrollfix>
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
<li class="md-nav__item">
|
||
<a href="../../architecture/dual-api/" class="md-nav__link">
|
||
|
||
|
||
|
||
<span class="md-ellipsis">
|
||
|
||
|
||
Dual API System
|
||
|
||
|
||
|
||
</span>
|
||
|
||
|
||
|
||
</a>
|
||
</li>
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
<li class="md-nav__item">
|
||
<a href="../../architecture/authentication/" class="md-nav__link">
|
||
|
||
|
||
|
||
<span class="md-ellipsis">
|
||
|
||
|
||
Authentication & Security
|
||
|
||
|
||
|
||
</span>
|
||
|
||
|
||
|
||
</a>
|
||
</li>
|
||
|
||
|
||
|
||
|
||
</ul>
|
||
</nav>
|
||
|
||
</li>
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
<li class="md-nav__item md-nav__item--section md-nav__item--nested">
|
||
|
||
|
||
|
||
|
||
|
||
<input class="md-nav__toggle md-toggle md-toggle--indeterminate" type="checkbox" id="__nav_2_4" >
|
||
|
||
|
||
<div class="md-nav__link md-nav__container">
|
||
<a href="../../backend/" class="md-nav__link ">
|
||
|
||
|
||
|
||
<span class="md-ellipsis">
|
||
|
||
|
||
Backend
|
||
|
||
|
||
|
||
</span>
|
||
|
||
|
||
|
||
</a>
|
||
|
||
|
||
<label class="md-nav__link " for="__nav_2_4" id="__nav_2_4_label" tabindex="">
|
||
<span class="md-nav__icon md-icon"></span>
|
||
</label>
|
||
|
||
</div>
|
||
|
||
<nav class="md-nav" data-md-level="2" aria-labelledby="__nav_2_4_label" aria-expanded="false">
|
||
<label class="md-nav__title" for="__nav_2_4">
|
||
<span class="md-nav__icon md-icon"></span>
|
||
|
||
|
||
Backend
|
||
|
||
|
||
</label>
|
||
<ul class="md-nav__list" data-md-scrollfix>
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
<li class="md-nav__item md-nav__item--pruned md-nav__item--nested">
|
||
|
||
|
||
|
||
|
||
|
||
<a href="../../backend/modules/" class="md-nav__link">
|
||
|
||
|
||
|
||
<span class="md-ellipsis">
|
||
|
||
|
||
Modules
|
||
|
||
|
||
|
||
</span>
|
||
|
||
|
||
|
||
|
||
<span class="md-nav__icon md-icon"></span>
|
||
|
||
</a>
|
||
|
||
|
||
|
||
</li>
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
<li class="md-nav__item md-nav__item--pruned md-nav__item--nested">
|
||
|
||
|
||
|
||
|
||
|
||
<a href="../../backend/services/" class="md-nav__link">
|
||
|
||
|
||
|
||
<span class="md-ellipsis">
|
||
|
||
|
||
Services
|
||
|
||
|
||
|
||
</span>
|
||
|
||
|
||
|
||
|
||
<span class="md-nav__icon md-icon"></span>
|
||
|
||
</a>
|
||
|
||
|
||
|
||
</li>
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
<li class="md-nav__item md-nav__item--pruned md-nav__item--nested">
|
||
|
||
|
||
|
||
|
||
|
||
<a href="../../backend/middleware/" class="md-nav__link">
|
||
|
||
|
||
|
||
<span class="md-ellipsis">
|
||
|
||
|
||
Middleware
|
||
|
||
|
||
|
||
</span>
|
||
|
||
|
||
|
||
|
||
<span class="md-nav__icon md-icon"></span>
|
||
|
||
</a>
|
||
|
||
|
||
|
||
</li>
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
<li class="md-nav__item md-nav__item--pruned md-nav__item--nested">
|
||
|
||
|
||
|
||
|
||
|
||
<a href="../../backend/utilities/" class="md-nav__link">
|
||
|
||
|
||
|
||
<span class="md-ellipsis">
|
||
|
||
|
||
Utilities
|
||
|
||
|
||
|
||
</span>
|
||
|
||
|
||
|
||
|
||
<span class="md-nav__icon md-icon"></span>
|
||
|
||
</a>
|
||
|
||
|
||
|
||
</li>
|
||
|
||
|
||
|
||
|
||
</ul>
|
||
</nav>
|
||
|
||
</li>
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
<li class="md-nav__item md-nav__item--section md-nav__item--nested">
|
||
|
||
|
||
|
||
|
||
|
||
<input class="md-nav__toggle md-toggle md-toggle--indeterminate" type="checkbox" id="__nav_2_5" >
|
||
|
||
|
||
<div class="md-nav__link md-nav__container">
|
||
<a href="../../frontend/" class="md-nav__link ">
|
||
|
||
|
||
|
||
<span class="md-ellipsis">
|
||
|
||
|
||
Frontend
|
||
|
||
|
||
|
||
</span>
|
||
|
||
|
||
|
||
</a>
|
||
|
||
|
||
<label class="md-nav__link " for="__nav_2_5" id="__nav_2_5_label" tabindex="">
|
||
<span class="md-nav__icon md-icon"></span>
|
||
</label>
|
||
|
||
</div>
|
||
|
||
<nav class="md-nav" data-md-level="2" aria-labelledby="__nav_2_5_label" aria-expanded="false">
|
||
<label class="md-nav__title" for="__nav_2_5">
|
||
<span class="md-nav__icon md-icon"></span>
|
||
|
||
|
||
Frontend
|
||
|
||
|
||
</label>
|
||
<ul class="md-nav__list" data-md-scrollfix>
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
<li class="md-nav__item md-nav__item--pruned md-nav__item--nested">
|
||
|
||
|
||
|
||
|
||
|
||
<a href="../../frontend/components/" class="md-nav__link">
|
||
|
||
|
||
|
||
<span class="md-ellipsis">
|
||
|
||
|
||
Components
|
||
|
||
|
||
|
||
</span>
|
||
|
||
|
||
|
||
|
||
<span class="md-nav__icon md-icon"></span>
|
||
|
||
</a>
|
||
|
||
|
||
|
||
</li>
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
<li class="md-nav__item md-nav__item--pruned md-nav__item--nested">
|
||
|
||
|
||
|
||
|
||
|
||
<a href="../../frontend/layouts/" class="md-nav__link">
|
||
|
||
|
||
|
||
<span class="md-ellipsis">
|
||
|
||
|
||
Layouts
|
||
|
||
|
||
|
||
</span>
|
||
|
||
|
||
|
||
|
||
<span class="md-nav__icon md-icon"></span>
|
||
|
||
</a>
|
||
|
||
|
||
|
||
</li>
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
<li class="md-nav__item md-nav__item--pruned md-nav__item--nested">
|
||
|
||
|
||
|
||
|
||
|
||
<a href="../../frontend/pages/" class="md-nav__link">
|
||
|
||
|
||
|
||
<span class="md-ellipsis">
|
||
|
||
|
||
Pages
|
||
|
||
|
||
|
||
</span>
|
||
|
||
|
||
|
||
|
||
<span class="md-nav__icon md-icon"></span>
|
||
|
||
</a>
|
||
|
||
|
||
|
||
</li>
|
||
|
||
|
||
|
||
|
||
</ul>
|
||
</nav>
|
||
|
||
</li>
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
<li class="md-nav__item md-nav__item--active md-nav__item--section md-nav__item--nested">
|
||
|
||
|
||
|
||
<input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_2_6" checked>
|
||
|
||
|
||
<div class="md-nav__link md-nav__container">
|
||
<a href="../" class="md-nav__link ">
|
||
|
||
|
||
|
||
<span class="md-ellipsis">
|
||
|
||
|
||
Database
|
||
|
||
|
||
|
||
</span>
|
||
|
||
|
||
|
||
</a>
|
||
|
||
|
||
<label class="md-nav__link " for="__nav_2_6" id="__nav_2_6_label" tabindex="">
|
||
<span class="md-nav__icon md-icon"></span>
|
||
</label>
|
||
|
||
</div>
|
||
|
||
<nav class="md-nav" data-md-level="2" aria-labelledby="__nav_2_6_label" aria-expanded="true">
|
||
<label class="md-nav__title" for="__nav_2_6">
|
||
<span class="md-nav__icon md-icon"></span>
|
||
|
||
|
||
Database
|
||
|
||
|
||
</label>
|
||
<ul class="md-nav__list" data-md-scrollfix>
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
<li class="md-nav__item md-nav__item--active">
|
||
|
||
<input class="md-nav__toggle md-toggle" type="checkbox" id="__toc">
|
||
|
||
|
||
|
||
|
||
|
||
<label class="md-nav__link md-nav__link--active" for="__toc">
|
||
|
||
|
||
|
||
<span class="md-ellipsis">
|
||
|
||
|
||
Schema Overview
|
||
|
||
|
||
|
||
</span>
|
||
|
||
|
||
|
||
<span class="md-nav__icon md-icon"></span>
|
||
</label>
|
||
|
||
<a href="./" class="md-nav__link md-nav__link--active">
|
||
|
||
|
||
|
||
<span class="md-ellipsis">
|
||
|
||
|
||
Schema Overview
|
||
|
||
|
||
|
||
</span>
|
||
|
||
|
||
|
||
</a>
|
||
|
||
|
||
|
||
|
||
|
||
<nav class="md-nav md-nav--secondary" aria-label="On this page">
|
||
|
||
|
||
|
||
|
||
|
||
|
||
<label class="md-nav__title" for="__toc">
|
||
<span class="md-nav__icon md-icon"></span>
|
||
On this page
|
||
</label>
|
||
<ul class="md-nav__list" data-md-component="toc" data-md-scrollfix>
|
||
|
||
<li class="md-nav__item">
|
||
<a href="#models-summary" class="md-nav__link">
|
||
<span class="md-ellipsis">
|
||
|
||
Models Summary
|
||
|
||
</span>
|
||
</a>
|
||
|
||
</li>
|
||
|
||
<li class="md-nav__item">
|
||
<a href="#auth-users" class="md-nav__link">
|
||
<span class="md-ellipsis">
|
||
|
||
Auth & Users
|
||
|
||
</span>
|
||
</a>
|
||
|
||
<nav class="md-nav" aria-label="Auth & Users">
|
||
<ul class="md-nav__list">
|
||
|
||
<li class="md-nav__item">
|
||
<a href="#user" class="md-nav__link">
|
||
<span class="md-ellipsis">
|
||
|
||
User
|
||
|
||
</span>
|
||
</a>
|
||
|
||
</li>
|
||
|
||
<li class="md-nav__item">
|
||
<a href="#refreshtoken" class="md-nav__link">
|
||
<span class="md-ellipsis">
|
||
|
||
RefreshToken
|
||
|
||
</span>
|
||
</a>
|
||
|
||
</li>
|
||
|
||
</ul>
|
||
</nav>
|
||
|
||
</li>
|
||
|
||
<li class="md-nav__item">
|
||
<a href="#influence" class="md-nav__link">
|
||
<span class="md-ellipsis">
|
||
|
||
Influence
|
||
|
||
</span>
|
||
</a>
|
||
|
||
<nav class="md-nav" aria-label="Influence">
|
||
<ul class="md-nav__list">
|
||
|
||
<li class="md-nav__item">
|
||
<a href="#campaign" class="md-nav__link">
|
||
<span class="md-ellipsis">
|
||
|
||
Campaign
|
||
|
||
</span>
|
||
</a>
|
||
|
||
</li>
|
||
|
||
<li class="md-nav__item">
|
||
<a href="#representative" class="md-nav__link">
|
||
<span class="md-ellipsis">
|
||
|
||
Representative
|
||
|
||
</span>
|
||
</a>
|
||
|
||
</li>
|
||
|
||
<li class="md-nav__item">
|
||
<a href="#campaignemail" class="md-nav__link">
|
||
<span class="md-ellipsis">
|
||
|
||
CampaignEmail
|
||
|
||
</span>
|
||
</a>
|
||
|
||
</li>
|
||
|
||
<li class="md-nav__item">
|
||
<a href="#representativeresponse" class="md-nav__link">
|
||
<span class="md-ellipsis">
|
||
|
||
RepresentativeResponse
|
||
|
||
</span>
|
||
</a>
|
||
|
||
</li>
|
||
|
||
<li class="md-nav__item">
|
||
<a href="#responseupvote" class="md-nav__link">
|
||
<span class="md-ellipsis">
|
||
|
||
ResponseUpvote
|
||
|
||
</span>
|
||
</a>
|
||
|
||
</li>
|
||
|
||
<li class="md-nav__item">
|
||
<a href="#customrecipient" class="md-nav__link">
|
||
<span class="md-ellipsis">
|
||
|
||
CustomRecipient
|
||
|
||
</span>
|
||
</a>
|
||
|
||
</li>
|
||
|
||
<li class="md-nav__item">
|
||
<a href="#postalcodecache" class="md-nav__link">
|
||
<span class="md-ellipsis">
|
||
|
||
PostalCodeCache
|
||
|
||
</span>
|
||
</a>
|
||
|
||
</li>
|
||
|
||
<li class="md-nav__item">
|
||
<a href="#emaillog" class="md-nav__link">
|
||
<span class="md-ellipsis">
|
||
|
||
EmailLog
|
||
|
||
</span>
|
||
</a>
|
||
|
||
</li>
|
||
|
||
<li class="md-nav__item">
|
||
<a href="#emailverification" class="md-nav__link">
|
||
<span class="md-ellipsis">
|
||
|
||
EmailVerification
|
||
|
||
</span>
|
||
</a>
|
||
|
||
</li>
|
||
|
||
<li class="md-nav__item">
|
||
<a href="#call" class="md-nav__link">
|
||
<span class="md-ellipsis">
|
||
|
||
Call
|
||
|
||
</span>
|
||
</a>
|
||
|
||
</li>
|
||
|
||
</ul>
|
||
</nav>
|
||
|
||
</li>
|
||
|
||
<li class="md-nav__item">
|
||
<a href="#map-locations" class="md-nav__link">
|
||
<span class="md-ellipsis">
|
||
|
||
Map — Locations
|
||
|
||
</span>
|
||
</a>
|
||
|
||
<nav class="md-nav" aria-label="Map — Locations">
|
||
<ul class="md-nav__list">
|
||
|
||
<li class="md-nav__item">
|
||
<a href="#location" class="md-nav__link">
|
||
<span class="md-ellipsis">
|
||
|
||
Location
|
||
|
||
</span>
|
||
</a>
|
||
|
||
</li>
|
||
|
||
<li class="md-nav__item">
|
||
<a href="#address" class="md-nav__link">
|
||
<span class="md-ellipsis">
|
||
|
||
Address
|
||
|
||
</span>
|
||
</a>
|
||
|
||
</li>
|
||
|
||
<li class="md-nav__item">
|
||
<a href="#locationhistory" class="md-nav__link">
|
||
<span class="md-ellipsis">
|
||
|
||
LocationHistory
|
||
|
||
</span>
|
||
</a>
|
||
|
||
</li>
|
||
|
||
</ul>
|
||
</nav>
|
||
|
||
</li>
|
||
|
||
<li class="md-nav__item">
|
||
<a href="#map-shifts-cuts" class="md-nav__link">
|
||
<span class="md-ellipsis">
|
||
|
||
Map — Shifts & Cuts
|
||
|
||
</span>
|
||
</a>
|
||
|
||
<nav class="md-nav" aria-label="Map — Shifts & Cuts">
|
||
<ul class="md-nav__list">
|
||
|
||
<li class="md-nav__item">
|
||
<a href="#shift" class="md-nav__link">
|
||
<span class="md-ellipsis">
|
||
|
||
Shift
|
||
|
||
</span>
|
||
</a>
|
||
|
||
</li>
|
||
|
||
<li class="md-nav__item">
|
||
<a href="#shiftsignup" class="md-nav__link">
|
||
<span class="md-ellipsis">
|
||
|
||
ShiftSignup
|
||
|
||
</span>
|
||
</a>
|
||
|
||
</li>
|
||
|
||
<li class="md-nav__item">
|
||
<a href="#cut" class="md-nav__link">
|
||
<span class="md-ellipsis">
|
||
|
||
Cut
|
||
|
||
</span>
|
||
</a>
|
||
|
||
</li>
|
||
|
||
<li class="md-nav__item">
|
||
<a href="#mapsettings" class="md-nav__link">
|
||
<span class="md-ellipsis">
|
||
|
||
MapSettings
|
||
|
||
</span>
|
||
</a>
|
||
|
||
</li>
|
||
|
||
</ul>
|
||
</nav>
|
||
|
||
</li>
|
||
|
||
<li class="md-nav__item">
|
||
<a href="#canvassing" class="md-nav__link">
|
||
<span class="md-ellipsis">
|
||
|
||
Canvassing
|
||
|
||
</span>
|
||
</a>
|
||
|
||
<nav class="md-nav" aria-label="Canvassing">
|
||
<ul class="md-nav__list">
|
||
|
||
<li class="md-nav__item">
|
||
<a href="#canvasssession" class="md-nav__link">
|
||
<span class="md-ellipsis">
|
||
|
||
CanvassSession
|
||
|
||
</span>
|
||
</a>
|
||
|
||
</li>
|
||
|
||
<li class="md-nav__item">
|
||
<a href="#canvassvisit" class="md-nav__link">
|
||
<span class="md-ellipsis">
|
||
|
||
CanvassVisit
|
||
|
||
</span>
|
||
</a>
|
||
|
||
</li>
|
||
|
||
<li class="md-nav__item">
|
||
<a href="#trackingsession" class="md-nav__link">
|
||
<span class="md-ellipsis">
|
||
|
||
TrackingSession
|
||
|
||
</span>
|
||
</a>
|
||
|
||
</li>
|
||
|
||
<li class="md-nav__item">
|
||
<a href="#trackpoint" class="md-nav__link">
|
||
<span class="md-ellipsis">
|
||
|
||
TrackPoint
|
||
|
||
</span>
|
||
</a>
|
||
|
||
</li>
|
||
|
||
</ul>
|
||
</nav>
|
||
|
||
</li>
|
||
|
||
<li class="md-nav__item">
|
||
<a href="#email-templates" class="md-nav__link">
|
||
<span class="md-ellipsis">
|
||
|
||
Email Templates
|
||
|
||
</span>
|
||
</a>
|
||
|
||
<nav class="md-nav" aria-label="Email Templates">
|
||
<ul class="md-nav__list">
|
||
|
||
<li class="md-nav__item">
|
||
<a href="#emailtemplate" class="md-nav__link">
|
||
<span class="md-ellipsis">
|
||
|
||
EmailTemplate
|
||
|
||
</span>
|
||
</a>
|
||
|
||
</li>
|
||
|
||
<li class="md-nav__item">
|
||
<a href="#emailtemplatevariable" class="md-nav__link">
|
||
<span class="md-ellipsis">
|
||
|
||
EmailTemplateVariable
|
||
|
||
</span>
|
||
</a>
|
||
|
||
</li>
|
||
|
||
<li class="md-nav__item">
|
||
<a href="#emailtemplateversion" class="md-nav__link">
|
||
<span class="md-ellipsis">
|
||
|
||
EmailTemplateVersion
|
||
|
||
</span>
|
||
</a>
|
||
|
||
</li>
|
||
|
||
<li class="md-nav__item">
|
||
<a href="#emailtemplatetestlog" class="md-nav__link">
|
||
<span class="md-ellipsis">
|
||
|
||
EmailTemplateTestLog
|
||
|
||
</span>
|
||
</a>
|
||
|
||
</li>
|
||
|
||
</ul>
|
||
</nav>
|
||
|
||
</li>
|
||
|
||
<li class="md-nav__item">
|
||
<a href="#landing-pages" class="md-nav__link">
|
||
<span class="md-ellipsis">
|
||
|
||
Landing Pages
|
||
|
||
</span>
|
||
</a>
|
||
|
||
<nav class="md-nav" aria-label="Landing Pages">
|
||
<ul class="md-nav__list">
|
||
|
||
<li class="md-nav__item">
|
||
<a href="#landingpage" class="md-nav__link">
|
||
<span class="md-ellipsis">
|
||
|
||
LandingPage
|
||
|
||
</span>
|
||
</a>
|
||
|
||
</li>
|
||
|
||
<li class="md-nav__item">
|
||
<a href="#pageblock" class="md-nav__link">
|
||
<span class="md-ellipsis">
|
||
|
||
PageBlock
|
||
|
||
</span>
|
||
</a>
|
||
|
||
</li>
|
||
|
||
</ul>
|
||
</nav>
|
||
|
||
</li>
|
||
|
||
<li class="md-nav__item">
|
||
<a href="#site-settings" class="md-nav__link">
|
||
<span class="md-ellipsis">
|
||
|
||
Site Settings
|
||
|
||
</span>
|
||
</a>
|
||
|
||
<nav class="md-nav" aria-label="Site Settings">
|
||
<ul class="md-nav__list">
|
||
|
||
<li class="md-nav__item">
|
||
<a href="#sitesettings" class="md-nav__link">
|
||
<span class="md-ellipsis">
|
||
|
||
SiteSettings
|
||
|
||
</span>
|
||
</a>
|
||
|
||
</li>
|
||
|
||
</ul>
|
||
</nav>
|
||
|
||
</li>
|
||
|
||
<li class="md-nav__item">
|
||
<a href="#media-drizzle-orm" class="md-nav__link">
|
||
<span class="md-ellipsis">
|
||
|
||
Media (Drizzle ORM)
|
||
|
||
</span>
|
||
</a>
|
||
|
||
<nav class="md-nav" aria-label="Media (Drizzle ORM)">
|
||
<ul class="md-nav__list">
|
||
|
||
<li class="md-nav__item">
|
||
<a href="#videos" class="md-nav__link">
|
||
<span class="md-ellipsis">
|
||
|
||
videos
|
||
|
||
</span>
|
||
</a>
|
||
|
||
</li>
|
||
|
||
<li class="md-nav__item">
|
||
<a href="#compilations" class="md-nav__link">
|
||
<span class="md-ellipsis">
|
||
|
||
compilations
|
||
|
||
</span>
|
||
</a>
|
||
|
||
</li>
|
||
|
||
<li class="md-nav__item">
|
||
<a href="#jobs" class="md-nav__link">
|
||
<span class="md-ellipsis">
|
||
|
||
jobs
|
||
|
||
</span>
|
||
</a>
|
||
|
||
</li>
|
||
|
||
</ul>
|
||
</nav>
|
||
|
||
</li>
|
||
|
||
<li class="md-nav__item">
|
||
<a href="#related-documentation" class="md-nav__link">
|
||
<span class="md-ellipsis">
|
||
|
||
Related Documentation
|
||
|
||
</span>
|
||
</a>
|
||
|
||
</li>
|
||
|
||
</ul>
|
||
|
||
</nav>
|
||
|
||
</li>
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
<li class="md-nav__item">
|
||
<a href="../migrations/" class="md-nav__link">
|
||
|
||
|
||
|
||
<span class="md-ellipsis">
|
||
|
||
|
||
Migrations
|
||
|
||
|
||
|
||
</span>
|
||
|
||
|
||
|
||
</a>
|
||
</li>
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
<li class="md-nav__item">
|
||
<a href="../seeding/" class="md-nav__link">
|
||
|
||
|
||
|
||
<span class="md-ellipsis">
|
||
|
||
|
||
Seeding
|
||
|
||
|
||
|
||
</span>
|
||
|
||
|
||
|
||
</a>
|
||
</li>
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
<li class="md-nav__item">
|
||
<a href="../indexes/" class="md-nav__link">
|
||
|
||
|
||
|
||
<span class="md-ellipsis">
|
||
|
||
|
||
Indexes
|
||
|
||
|
||
|
||
</span>
|
||
|
||
|
||
|
||
</a>
|
||
</li>
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
<li class="md-nav__item md-nav__item--pruned md-nav__item--nested">
|
||
|
||
|
||
|
||
|
||
|
||
<a href="../models/" class="md-nav__link">
|
||
|
||
|
||
|
||
<span class="md-ellipsis">
|
||
|
||
|
||
Models
|
||
|
||
|
||
|
||
</span>
|
||
|
||
|
||
|
||
|
||
<span class="md-nav__icon md-icon"></span>
|
||
|
||
</a>
|
||
|
||
|
||
|
||
</li>
|
||
|
||
|
||
|
||
|
||
</ul>
|
||
</nav>
|
||
|
||
</li>
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
<li class="md-nav__item md-nav__item--section md-nav__item--nested">
|
||
|
||
|
||
|
||
|
||
|
||
<input class="md-nav__toggle md-toggle md-toggle--indeterminate" type="checkbox" id="__nav_2_7" >
|
||
|
||
|
||
<div class="md-nav__link md-nav__container">
|
||
<a href="../../features/" class="md-nav__link ">
|
||
|
||
|
||
|
||
<span class="md-ellipsis">
|
||
|
||
|
||
Features
|
||
|
||
|
||
|
||
</span>
|
||
|
||
|
||
|
||
</a>
|
||
|
||
|
||
<label class="md-nav__link " for="__nav_2_7" id="__nav_2_7_label" tabindex="">
|
||
<span class="md-nav__icon md-icon"></span>
|
||
</label>
|
||
|
||
</div>
|
||
|
||
<nav class="md-nav" data-md-level="2" aria-labelledby="__nav_2_7_label" aria-expanded="false">
|
||
<label class="md-nav__title" for="__nav_2_7">
|
||
<span class="md-nav__icon md-icon"></span>
|
||
|
||
|
||
Features
|
||
|
||
|
||
</label>
|
||
<ul class="md-nav__list" data-md-scrollfix>
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
<li class="md-nav__item md-nav__item--pruned md-nav__item--nested">
|
||
|
||
|
||
|
||
|
||
|
||
<a href="../../features/influence/" class="md-nav__link">
|
||
|
||
|
||
|
||
<span class="md-ellipsis">
|
||
|
||
|
||
Influence
|
||
|
||
|
||
|
||
</span>
|
||
|
||
|
||
|
||
|
||
<span class="md-nav__icon md-icon"></span>
|
||
|
||
</a>
|
||
|
||
|
||
|
||
</li>
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
<li class="md-nav__item md-nav__item--pruned md-nav__item--nested">
|
||
|
||
|
||
|
||
|
||
|
||
<a href="../../features/map/" class="md-nav__link">
|
||
|
||
|
||
|
||
<span class="md-ellipsis">
|
||
|
||
|
||
Map
|
||
|
||
|
||
|
||
</span>
|
||
|
||
|
||
|
||
|
||
<span class="md-nav__icon md-icon"></span>
|
||
|
||
</a>
|
||
|
||
|
||
|
||
</li>
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
<li class="md-nav__item md-nav__item--pruned md-nav__item--nested">
|
||
|
||
|
||
|
||
|
||
|
||
<a href="../../features/landing-pages/" class="md-nav__link">
|
||
|
||
|
||
|
||
<span class="md-ellipsis">
|
||
|
||
|
||
Landing Pages
|
||
|
||
|
||
|
||
</span>
|
||
|
||
|
||
|
||
|
||
<span class="md-nav__icon md-icon"></span>
|
||
|
||
</a>
|
||
|
||
|
||
|
||
</li>
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
<li class="md-nav__item md-nav__item--pruned md-nav__item--nested">
|
||
|
||
|
||
|
||
|
||
|
||
<a href="../../features/email-templates/" class="md-nav__link">
|
||
|
||
|
||
|
||
<span class="md-ellipsis">
|
||
|
||
|
||
Email Templates
|
||
|
||
|
||
|
||
</span>
|
||
|
||
|
||
|
||
|
||
<span class="md-nav__icon md-icon"></span>
|
||
|
||
</a>
|
||
|
||
|
||
|
||
</li>
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
<li class="md-nav__item md-nav__item--pruned md-nav__item--nested">
|
||
|
||
|
||
|
||
|
||
|
||
<a href="../../features/media/" class="md-nav__link">
|
||
|
||
|
||
|
||
<span class="md-ellipsis">
|
||
|
||
|
||
Media
|
||
|
||
|
||
|
||
</span>
|
||
|
||
|
||
|
||
|
||
<span class="md-nav__icon md-icon"></span>
|
||
|
||
</a>
|
||
|
||
|
||
|
||
</li>
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
<li class="md-nav__item md-nav__item--pruned md-nav__item--nested">
|
||
|
||
|
||
|
||
|
||
|
||
<a href="../../features/newsletter/" class="md-nav__link">
|
||
|
||
|
||
|
||
<span class="md-ellipsis">
|
||
|
||
|
||
Newsletter
|
||
|
||
|
||
|
||
</span>
|
||
|
||
|
||
|
||
|
||
<span class="md-nav__icon md-icon"></span>
|
||
|
||
</a>
|
||
|
||
|
||
|
||
</li>
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
<li class="md-nav__item md-nav__item--pruned md-nav__item--nested">
|
||
|
||
|
||
|
||
|
||
|
||
<a href="../../features/observability/" class="md-nav__link">
|
||
|
||
|
||
|
||
<span class="md-ellipsis">
|
||
|
||
|
||
Observability
|
||
|
||
|
||
|
||
</span>
|
||
|
||
|
||
|
||
|
||
<span class="md-nav__icon md-icon"></span>
|
||
|
||
</a>
|
||
|
||
|
||
|
||
</li>
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
<li class="md-nav__item md-nav__item--pruned md-nav__item--nested">
|
||
|
||
|
||
|
||
|
||
|
||
<a href="../../features/tunnel/" class="md-nav__link">
|
||
|
||
|
||
|
||
<span class="md-ellipsis">
|
||
|
||
|
||
Tunnel
|
||
|
||
|
||
|
||
</span>
|
||
|
||
|
||
|
||
|
||
<span class="md-nav__icon md-icon"></span>
|
||
|
||
</a>
|
||
|
||
|
||
|
||
</li>
|
||
|
||
|
||
|
||
|
||
</ul>
|
||
</nav>
|
||
|
||
</li>
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
<li class="md-nav__item md-nav__item--section md-nav__item--nested">
|
||
|
||
|
||
|
||
|
||
|
||
<input class="md-nav__toggle md-toggle md-toggle--indeterminate" type="checkbox" id="__nav_2_8" >
|
||
|
||
|
||
<div class="md-nav__link md-nav__container">
|
||
<a href="../../deployment/" class="md-nav__link ">
|
||
|
||
|
||
|
||
<span class="md-ellipsis">
|
||
|
||
|
||
Deployment
|
||
|
||
|
||
|
||
</span>
|
||
|
||
|
||
|
||
</a>
|
||
|
||
|
||
<label class="md-nav__link " for="__nav_2_8" id="__nav_2_8_label" tabindex="">
|
||
<span class="md-nav__icon md-icon"></span>
|
||
</label>
|
||
|
||
</div>
|
||
|
||
<nav class="md-nav" data-md-level="2" aria-labelledby="__nav_2_8_label" aria-expanded="false">
|
||
<label class="md-nav__title" for="__nav_2_8">
|
||
<span class="md-nav__icon md-icon"></span>
|
||
|
||
|
||
Deployment
|
||
|
||
|
||
</label>
|
||
<ul class="md-nav__list" data-md-scrollfix>
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
<li class="md-nav__item">
|
||
<a href="../../deployment/docker-compose/" class="md-nav__link">
|
||
|
||
|
||
|
||
<span class="md-ellipsis">
|
||
|
||
|
||
Docker Compose
|
||
|
||
|
||
|
||
</span>
|
||
|
||
|
||
|
||
</a>
|
||
</li>
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
<li class="md-nav__item">
|
||
<a href="../../deployment/environment-variables/" class="md-nav__link">
|
||
|
||
|
||
|
||
<span class="md-ellipsis">
|
||
|
||
|
||
Environment Variables
|
||
|
||
|
||
|
||
</span>
|
||
|
||
|
||
|
||
</a>
|
||
</li>
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
<li class="md-nav__item">
|
||
<a href="../../deployment/nginx/" class="md-nav__link">
|
||
|
||
|
||
|
||
<span class="md-ellipsis">
|
||
|
||
|
||
Nginx Configuration
|
||
|
||
|
||
|
||
</span>
|
||
|
||
|
||
|
||
</a>
|
||
</li>
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
<li class="md-nav__item">
|
||
<a href="../../deployment/ssl-tls/" class="md-nav__link">
|
||
|
||
|
||
|
||
<span class="md-ellipsis">
|
||
|
||
|
||
SSL/TLS
|
||
|
||
|
||
|
||
</span>
|
||
|
||
|
||
|
||
</a>
|
||
</li>
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
<li class="md-nav__item">
|
||
<a href="../../deployment/tunneling/" class="md-nav__link">
|
||
|
||
|
||
|
||
<span class="md-ellipsis">
|
||
|
||
|
||
Tunneling
|
||
|
||
|
||
|
||
</span>
|
||
|
||
|
||
|
||
</a>
|
||
</li>
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
<li class="md-nav__item">
|
||
<a href="../../deployment/monitoring-stack/" class="md-nav__link">
|
||
|
||
|
||
|
||
<span class="md-ellipsis">
|
||
|
||
|
||
Monitoring Stack
|
||
|
||
|
||
|
||
</span>
|
||
|
||
|
||
|
||
</a>
|
||
</li>
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
<li class="md-nav__item">
|
||
<a href="../../deployment/healthchecks/" class="md-nav__link">
|
||
|
||
|
||
|
||
<span class="md-ellipsis">
|
||
|
||
|
||
Health Checks
|
||
|
||
|
||
|
||
</span>
|
||
|
||
|
||
|
||
</a>
|
||
</li>
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
<li class="md-nav__item">
|
||
<a href="../../deployment/scaling/" class="md-nav__link">
|
||
|
||
|
||
|
||
<span class="md-ellipsis">
|
||
|
||
|
||
Scaling
|
||
|
||
|
||
|
||
</span>
|
||
|
||
|
||
|
||
</a>
|
||
</li>
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
<li class="md-nav__item">
|
||
<a href="../../deployment/backup-restore/" class="md-nav__link">
|
||
|
||
|
||
|
||
<span class="md-ellipsis">
|
||
|
||
|
||
Backup & Restore
|
||
|
||
|
||
|
||
</span>
|
||
|
||
|
||
|
||
</a>
|
||
</li>
|
||
|
||
|
||
|
||
|
||
</ul>
|
||
</nav>
|
||
|
||
</li>
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
<li class="md-nav__item md-nav__item--section md-nav__item--nested">
|
||
|
||
|
||
|
||
|
||
|
||
<input class="md-nav__toggle md-toggle md-toggle--indeterminate" type="checkbox" id="__nav_2_9" >
|
||
|
||
|
||
<div class="md-nav__link md-nav__container">
|
||
<a href="../../development/" class="md-nav__link ">
|
||
|
||
|
||
|
||
<span class="md-ellipsis">
|
||
|
||
|
||
Development
|
||
|
||
|
||
|
||
</span>
|
||
|
||
|
||
|
||
</a>
|
||
|
||
|
||
<label class="md-nav__link " for="__nav_2_9" id="__nav_2_9_label" tabindex="">
|
||
<span class="md-nav__icon md-icon"></span>
|
||
</label>
|
||
|
||
</div>
|
||
|
||
<nav class="md-nav" data-md-level="2" aria-labelledby="__nav_2_9_label" aria-expanded="false">
|
||
<label class="md-nav__title" for="__nav_2_9">
|
||
<span class="md-nav__icon md-icon"></span>
|
||
|
||
|
||
Development
|
||
|
||
|
||
</label>
|
||
<ul class="md-nav__list" data-md-scrollfix>
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
<li class="md-nav__item">
|
||
<a href="../../development/local-setup/" class="md-nav__link">
|
||
|
||
|
||
|
||
<span class="md-ellipsis">
|
||
|
||
|
||
Local Setup
|
||
|
||
|
||
|
||
</span>
|
||
|
||
|
||
|
||
</a>
|
||
</li>
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
<li class="md-nav__item">
|
||
<a href="../../development/docker-workflow/" class="md-nav__link">
|
||
|
||
|
||
|
||
<span class="md-ellipsis">
|
||
|
||
|
||
Docker Workflow
|
||
|
||
|
||
|
||
</span>
|
||
|
||
|
||
|
||
</a>
|
||
</li>
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
<li class="md-nav__item">
|
||
<a href="../../development/git-workflow/" class="md-nav__link">
|
||
|
||
|
||
|
||
<span class="md-ellipsis">
|
||
|
||
|
||
Git Workflow
|
||
|
||
|
||
|
||
</span>
|
||
|
||
|
||
|
||
</a>
|
||
</li>
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
<li class="md-nav__item">
|
||
<a href="../../development/npm-commands/" class="md-nav__link">
|
||
|
||
|
||
|
||
<span class="md-ellipsis">
|
||
|
||
|
||
NPM Commands
|
||
|
||
|
||
|
||
</span>
|
||
|
||
|
||
|
||
</a>
|
||
</li>
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
<li class="md-nav__item">
|
||
<a href="../../development/migrations/" class="md-nav__link">
|
||
|
||
|
||
|
||
<span class="md-ellipsis">
|
||
|
||
|
||
Migrations
|
||
|
||
|
||
|
||
</span>
|
||
|
||
|
||
|
||
</a>
|
||
</li>
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
<li class="md-nav__item">
|
||
<a href="../../development/typescript/" class="md-nav__link">
|
||
|
||
|
||
|
||
<span class="md-ellipsis">
|
||
|
||
|
||
TypeScript
|
||
|
||
|
||
|
||
</span>
|
||
|
||
|
||
|
||
</a>
|
||
</li>
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
<li class="md-nav__item">
|
||
<a href="../../development/testing/" class="md-nav__link">
|
||
|
||
|
||
|
||
<span class="md-ellipsis">
|
||
|
||
|
||
Testing
|
||
|
||
|
||
|
||
</span>
|
||
|
||
|
||
|
||
</a>
|
||
</li>
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
<li class="md-nav__item">
|
||
<a href="../../development/debugging/" class="md-nav__link">
|
||
|
||
|
||
|
||
<span class="md-ellipsis">
|
||
|
||
|
||
Debugging
|
||
|
||
|
||
|
||
</span>
|
||
|
||
|
||
|
||
</a>
|
||
</li>
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
<li class="md-nav__item">
|
||
<a href="../../development/code-style/" class="md-nav__link">
|
||
|
||
|
||
|
||
<span class="md-ellipsis">
|
||
|
||
|
||
Code Style
|
||
|
||
|
||
|
||
</span>
|
||
|
||
|
||
|
||
</a>
|
||
</li>
|
||
|
||
|
||
|
||
|
||
</ul>
|
||
</nav>
|
||
|
||
</li>
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
<li class="md-nav__item md-nav__item--section md-nav__item--nested">
|
||
|
||
|
||
|
||
|
||
|
||
<input class="md-nav__toggle md-toggle md-toggle--indeterminate" type="checkbox" id="__nav_2_10" >
|
||
|
||
|
||
<div class="md-nav__link md-nav__container">
|
||
<a href="../../api-reference/" class="md-nav__link ">
|
||
|
||
|
||
|
||
<span class="md-ellipsis">
|
||
|
||
|
||
API Reference
|
||
|
||
|
||
|
||
</span>
|
||
|
||
|
||
|
||
</a>
|
||
|
||
</div>
|
||
|
||
<nav class="md-nav" data-md-level="2" aria-labelledby="__nav_2_10_label" aria-expanded="false">
|
||
<label class="md-nav__title" for="__nav_2_10">
|
||
<span class="md-nav__icon md-icon"></span>
|
||
|
||
|
||
API Reference
|
||
|
||
|
||
</label>
|
||
<ul class="md-nav__list" data-md-scrollfix>
|
||
|
||
|
||
|
||
</ul>
|
||
</nav>
|
||
|
||
</li>
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
<li class="md-nav__item md-nav__item--section md-nav__item--nested">
|
||
|
||
|
||
|
||
|
||
|
||
<input class="md-nav__toggle md-toggle md-toggle--indeterminate" type="checkbox" id="__nav_2_11" >
|
||
|
||
|
||
<div class="md-nav__link md-nav__container">
|
||
<a href="../../user-guides/" class="md-nav__link ">
|
||
|
||
|
||
|
||
<span class="md-ellipsis">
|
||
|
||
|
||
User Guides
|
||
|
||
|
||
|
||
</span>
|
||
|
||
|
||
|
||
</a>
|
||
|
||
|
||
<label class="md-nav__link " for="__nav_2_11" id="__nav_2_11_label" tabindex="">
|
||
<span class="md-nav__icon md-icon"></span>
|
||
</label>
|
||
|
||
</div>
|
||
|
||
<nav class="md-nav" data-md-level="2" aria-labelledby="__nav_2_11_label" aria-expanded="false">
|
||
<label class="md-nav__title" for="__nav_2_11">
|
||
<span class="md-nav__icon md-icon"></span>
|
||
|
||
|
||
User Guides
|
||
|
||
|
||
</label>
|
||
<ul class="md-nav__list" data-md-scrollfix>
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
<li class="md-nav__item">
|
||
<a href="../../user-guides/admin-guide/" class="md-nav__link">
|
||
|
||
|
||
|
||
<span class="md-ellipsis">
|
||
|
||
|
||
Admin Guide
|
||
|
||
|
||
|
||
</span>
|
||
|
||
|
||
|
||
</a>
|
||
</li>
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
<li class="md-nav__item">
|
||
<a href="../../user-guides/campaign-manager-guide/" class="md-nav__link">
|
||
|
||
|
||
|
||
<span class="md-ellipsis">
|
||
|
||
|
||
Campaign Manager Guide
|
||
|
||
|
||
|
||
</span>
|
||
|
||
|
||
|
||
</a>
|
||
</li>
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
<li class="md-nav__item">
|
||
<a href="../../user-guides/map-organizer-guide/" class="md-nav__link">
|
||
|
||
|
||
|
||
<span class="md-ellipsis">
|
||
|
||
|
||
Map Organizer Guide
|
||
|
||
|
||
|
||
</span>
|
||
|
||
|
||
|
||
</a>
|
||
</li>
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
<li class="md-nav__item">
|
||
<a href="../../user-guides/content-editor-guide/" class="md-nav__link">
|
||
|
||
|
||
|
||
<span class="md-ellipsis">
|
||
|
||
|
||
Content Editor Guide
|
||
|
||
|
||
|
||
</span>
|
||
|
||
|
||
|
||
</a>
|
||
</li>
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
<li class="md-nav__item">
|
||
<a href="../../user-guides/volunteer-guide/" class="md-nav__link">
|
||
|
||
|
||
|
||
<span class="md-ellipsis">
|
||
|
||
|
||
Volunteer Guide
|
||
|
||
|
||
|
||
</span>
|
||
|
||
|
||
|
||
</a>
|
||
</li>
|
||
|
||
|
||
|
||
|
||
</ul>
|
||
</nav>
|
||
|
||
</li>
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
<li class="md-nav__item md-nav__item--section md-nav__item--nested">
|
||
|
||
|
||
|
||
|
||
|
||
<input class="md-nav__toggle md-toggle md-toggle--indeterminate" type="checkbox" id="__nav_2_12" >
|
||
|
||
|
||
<div class="md-nav__link md-nav__container">
|
||
<a href="../../troubleshooting/" class="md-nav__link ">
|
||
|
||
|
||
|
||
<span class="md-ellipsis">
|
||
|
||
|
||
Troubleshooting
|
||
|
||
|
||
|
||
</span>
|
||
|
||
|
||
|
||
</a>
|
||
|
||
|
||
<label class="md-nav__link " for="__nav_2_12" id="__nav_2_12_label" tabindex="">
|
||
<span class="md-nav__icon md-icon"></span>
|
||
</label>
|
||
|
||
</div>
|
||
|
||
<nav class="md-nav" data-md-level="2" aria-labelledby="__nav_2_12_label" aria-expanded="false">
|
||
<label class="md-nav__title" for="__nav_2_12">
|
||
<span class="md-nav__icon md-icon"></span>
|
||
|
||
|
||
Troubleshooting
|
||
|
||
|
||
</label>
|
||
<ul class="md-nav__list" data-md-scrollfix>
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
<li class="md-nav__item">
|
||
<a href="../../troubleshooting/faq/" class="md-nav__link">
|
||
|
||
|
||
|
||
<span class="md-ellipsis">
|
||
|
||
|
||
FAQ
|
||
|
||
|
||
|
||
</span>
|
||
|
||
|
||
|
||
</a>
|
||
</li>
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
<li class="md-nav__item">
|
||
<a href="../../troubleshooting/common-errors/" class="md-nav__link">
|
||
|
||
|
||
|
||
<span class="md-ellipsis">
|
||
|
||
|
||
Common Errors
|
||
|
||
|
||
|
||
</span>
|
||
|
||
|
||
|
||
</a>
|
||
</li>
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
<li class="md-nav__item">
|
||
<a href="../../troubleshooting/auth-issues/" class="md-nav__link">
|
||
|
||
|
||
|
||
<span class="md-ellipsis">
|
||
|
||
|
||
Auth Issues
|
||
|
||
|
||
|
||
</span>
|
||
|
||
|
||
|
||
</a>
|
||
</li>
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
<li class="md-nav__item">
|
||
<a href="../../troubleshooting/database-issues/" class="md-nav__link">
|
||
|
||
|
||
|
||
<span class="md-ellipsis">
|
||
|
||
|
||
Database Issues
|
||
|
||
|
||
|
||
</span>
|
||
|
||
|
||
|
||
</a>
|
||
</li>
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
<li class="md-nav__item">
|
||
<a href="../../troubleshooting/docker-issues/" class="md-nav__link">
|
||
|
||
|
||
|
||
<span class="md-ellipsis">
|
||
|
||
|
||
Docker Issues
|
||
|
||
|
||
|
||
</span>
|
||
|
||
|
||
|
||
</a>
|
||
</li>
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
<li class="md-nav__item">
|
||
<a href="../../troubleshooting/email-issues/" class="md-nav__link">
|
||
|
||
|
||
|
||
<span class="md-ellipsis">
|
||
|
||
|
||
Email Issues
|
||
|
||
|
||
|
||
</span>
|
||
|
||
|
||
|
||
</a>
|
||
</li>
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
<li class="md-nav__item">
|
||
<a href="../../troubleshooting/geocoding-issues/" class="md-nav__link">
|
||
|
||
|
||
|
||
<span class="md-ellipsis">
|
||
|
||
|
||
Geocoding Issues
|
||
|
||
|
||
|
||
</span>
|
||
|
||
|
||
|
||
</a>
|
||
</li>
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
<li class="md-nav__item">
|
||
<a href="../../troubleshooting/monitoring-issues/" class="md-nav__link">
|
||
|
||
|
||
|
||
<span class="md-ellipsis">
|
||
|
||
|
||
Monitoring Issues
|
||
|
||
|
||
|
||
</span>
|
||
|
||
|
||
|
||
</a>
|
||
</li>
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
<li class="md-nav__item">
|
||
<a href="../../troubleshooting/performance-optimization/" class="md-nav__link">
|
||
|
||
|
||
|
||
<span class="md-ellipsis">
|
||
|
||
|
||
Performance Optimization
|
||
|
||
|
||
|
||
</span>
|
||
|
||
|
||
|
||
</a>
|
||
</li>
|
||
|
||
|
||
|
||
|
||
</ul>
|
||
</nav>
|
||
|
||
</li>
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
<li class="md-nav__item md-nav__item--section md-nav__item--nested">
|
||
|
||
|
||
|
||
|
||
|
||
<input class="md-nav__toggle md-toggle md-toggle--indeterminate" type="checkbox" id="__nav_2_13" >
|
||
|
||
|
||
<div class="md-nav__link md-nav__container">
|
||
<a href="../../migration/" class="md-nav__link ">
|
||
|
||
|
||
|
||
<span class="md-ellipsis">
|
||
|
||
|
||
Migration
|
||
|
||
|
||
|
||
</span>
|
||
|
||
|
||
|
||
</a>
|
||
|
||
|
||
<label class="md-nav__link " for="__nav_2_13" id="__nav_2_13_label" tabindex="">
|
||
<span class="md-nav__icon md-icon"></span>
|
||
</label>
|
||
|
||
</div>
|
||
|
||
<nav class="md-nav" data-md-level="2" aria-labelledby="__nav_2_13_label" aria-expanded="false">
|
||
<label class="md-nav__title" for="__nav_2_13">
|
||
<span class="md-nav__icon md-icon"></span>
|
||
|
||
|
||
Migration
|
||
|
||
|
||
</label>
|
||
<ul class="md-nav__list" data-md-scrollfix>
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
<li class="md-nav__item">
|
||
<a href="../../migration/feature-parity/" class="md-nav__link">
|
||
|
||
|
||
|
||
<span class="md-ellipsis">
|
||
|
||
|
||
Feature Parity
|
||
|
||
|
||
|
||
</span>
|
||
|
||
|
||
|
||
</a>
|
||
</li>
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
<li class="md-nav__item">
|
||
<a href="../../migration/breaking-changes/" class="md-nav__link">
|
||
|
||
|
||
|
||
<span class="md-ellipsis">
|
||
|
||
|
||
Breaking Changes
|
||
|
||
|
||
|
||
</span>
|
||
|
||
|
||
|
||
</a>
|
||
</li>
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
<li class="md-nav__item">
|
||
<a href="../../migration/api-changes/" class="md-nav__link">
|
||
|
||
|
||
|
||
<span class="md-ellipsis">
|
||
|
||
|
||
API Changes
|
||
|
||
|
||
|
||
</span>
|
||
|
||
|
||
|
||
</a>
|
||
</li>
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
<li class="md-nav__item">
|
||
<a href="../../migration/data-migration/" class="md-nav__link">
|
||
|
||
|
||
|
||
<span class="md-ellipsis">
|
||
|
||
|
||
Data Migration
|
||
|
||
|
||
|
||
</span>
|
||
|
||
|
||
|
||
</a>
|
||
</li>
|
||
|
||
|
||
|
||
|
||
</ul>
|
||
</nav>
|
||
|
||
</li>
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
<li class="md-nav__item md-nav__item--section md-nav__item--nested">
|
||
|
||
|
||
|
||
|
||
|
||
<input class="md-nav__toggle md-toggle md-toggle--indeterminate" type="checkbox" id="__nav_2_14" >
|
||
|
||
|
||
<div class="md-nav__link md-nav__container">
|
||
<a href="../../contributing/" class="md-nav__link ">
|
||
|
||
|
||
|
||
<span class="md-ellipsis">
|
||
|
||
|
||
Contributing
|
||
|
||
|
||
|
||
</span>
|
||
|
||
|
||
|
||
</a>
|
||
|
||
|
||
<label class="md-nav__link " for="__nav_2_14" id="__nav_2_14_label" tabindex="">
|
||
<span class="md-nav__icon md-icon"></span>
|
||
</label>
|
||
|
||
</div>
|
||
|
||
<nav class="md-nav" data-md-level="2" aria-labelledby="__nav_2_14_label" aria-expanded="false">
|
||
<label class="md-nav__title" for="__nav_2_14">
|
||
<span class="md-nav__icon md-icon"></span>
|
||
|
||
|
||
Contributing
|
||
|
||
|
||
</label>
|
||
<ul class="md-nav__list" data-md-scrollfix>
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
<li class="md-nav__item">
|
||
<a href="../../contributing/development-setup/" class="md-nav__link">
|
||
|
||
|
||
|
||
<span class="md-ellipsis">
|
||
|
||
|
||
Development Setup
|
||
|
||
|
||
|
||
</span>
|
||
|
||
|
||
|
||
</a>
|
||
</li>
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
<li class="md-nav__item">
|
||
<a href="../../contributing/code-of-conduct/" class="md-nav__link">
|
||
|
||
|
||
|
||
<span class="md-ellipsis">
|
||
|
||
|
||
Code of Conduct
|
||
|
||
|
||
|
||
</span>
|
||
|
||
|
||
|
||
</a>
|
||
</li>
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
<li class="md-nav__item">
|
||
<a href="../../contributing/pull-requests/" class="md-nav__link">
|
||
|
||
|
||
|
||
<span class="md-ellipsis">
|
||
|
||
|
||
Pull Requests
|
||
|
||
|
||
|
||
</span>
|
||
|
||
|
||
|
||
</a>
|
||
</li>
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
<li class="md-nav__item">
|
||
<a href="../../contributing/roadmap/" class="md-nav__link">
|
||
|
||
|
||
|
||
<span class="md-ellipsis">
|
||
|
||
|
||
Roadmap
|
||
|
||
|
||
|
||
</span>
|
||
|
||
|
||
|
||
</a>
|
||
</li>
|
||
|
||
|
||
|
||
|
||
</ul>
|
||
</nav>
|
||
|
||
</li>
|
||
|
||
|
||
|
||
|
||
</ul>
|
||
</nav>
|
||
|
||
</li>
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
<li class="md-nav__item md-nav__item--pruned md-nav__item--nested">
|
||
|
||
|
||
|
||
|
||
|
||
<a href="../../../phil/" class="md-nav__link">
|
||
|
||
|
||
|
||
<span class="md-ellipsis">
|
||
|
||
|
||
Philosophy
|
||
|
||
|
||
|
||
</span>
|
||
|
||
|
||
|
||
|
||
<span class="md-nav__icon md-icon"></span>
|
||
|
||
</a>
|
||
|
||
|
||
|
||
</li>
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
<li class="md-nav__item md-nav__item--pruned md-nav__item--nested">
|
||
|
||
|
||
|
||
|
||
|
||
<a href="../../../v1/" class="md-nav__link">
|
||
|
||
|
||
|
||
<span class="md-ellipsis">
|
||
|
||
|
||
V1 Documentation (Legacy)
|
||
|
||
|
||
|
||
</span>
|
||
|
||
|
||
|
||
|
||
<span class="md-nav__icon md-icon"></span>
|
||
|
||
</a>
|
||
|
||
|
||
|
||
</li>
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
<li class="md-nav__item md-nav__item--pruned md-nav__item--nested">
|
||
|
||
|
||
|
||
|
||
|
||
<a href="../../../blog/" class="md-nav__link">
|
||
|
||
|
||
|
||
<span class="md-ellipsis">
|
||
|
||
|
||
Blog
|
||
|
||
|
||
|
||
</span>
|
||
|
||
|
||
|
||
|
||
<span class="md-nav__icon md-icon"></span>
|
||
|
||
</a>
|
||
|
||
|
||
|
||
</li>
|
||
|
||
|
||
|
||
</ul>
|
||
</nav>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
|
||
|
||
|
||
<div class="md-sidebar md-sidebar--secondary" data-md-component="sidebar" data-md-type="toc" >
|
||
<div class="md-sidebar__scrollwrap">
|
||
<div class="md-sidebar__inner">
|
||
|
||
|
||
|
||
|
||
<nav class="md-nav md-nav--secondary" aria-label="On this page">
|
||
|
||
|
||
|
||
|
||
|
||
|
||
<label class="md-nav__title" for="__toc">
|
||
<span class="md-nav__icon md-icon"></span>
|
||
On this page
|
||
</label>
|
||
<ul class="md-nav__list" data-md-component="toc" data-md-scrollfix>
|
||
|
||
<li class="md-nav__item">
|
||
<a href="#models-summary" class="md-nav__link">
|
||
<span class="md-ellipsis">
|
||
|
||
Models Summary
|
||
|
||
</span>
|
||
</a>
|
||
|
||
</li>
|
||
|
||
<li class="md-nav__item">
|
||
<a href="#auth-users" class="md-nav__link">
|
||
<span class="md-ellipsis">
|
||
|
||
Auth & Users
|
||
|
||
</span>
|
||
</a>
|
||
|
||
<nav class="md-nav" aria-label="Auth & Users">
|
||
<ul class="md-nav__list">
|
||
|
||
<li class="md-nav__item">
|
||
<a href="#user" class="md-nav__link">
|
||
<span class="md-ellipsis">
|
||
|
||
User
|
||
|
||
</span>
|
||
</a>
|
||
|
||
</li>
|
||
|
||
<li class="md-nav__item">
|
||
<a href="#refreshtoken" class="md-nav__link">
|
||
<span class="md-ellipsis">
|
||
|
||
RefreshToken
|
||
|
||
</span>
|
||
</a>
|
||
|
||
</li>
|
||
|
||
</ul>
|
||
</nav>
|
||
|
||
</li>
|
||
|
||
<li class="md-nav__item">
|
||
<a href="#influence" class="md-nav__link">
|
||
<span class="md-ellipsis">
|
||
|
||
Influence
|
||
|
||
</span>
|
||
</a>
|
||
|
||
<nav class="md-nav" aria-label="Influence">
|
||
<ul class="md-nav__list">
|
||
|
||
<li class="md-nav__item">
|
||
<a href="#campaign" class="md-nav__link">
|
||
<span class="md-ellipsis">
|
||
|
||
Campaign
|
||
|
||
</span>
|
||
</a>
|
||
|
||
</li>
|
||
|
||
<li class="md-nav__item">
|
||
<a href="#representative" class="md-nav__link">
|
||
<span class="md-ellipsis">
|
||
|
||
Representative
|
||
|
||
</span>
|
||
</a>
|
||
|
||
</li>
|
||
|
||
<li class="md-nav__item">
|
||
<a href="#campaignemail" class="md-nav__link">
|
||
<span class="md-ellipsis">
|
||
|
||
CampaignEmail
|
||
|
||
</span>
|
||
</a>
|
||
|
||
</li>
|
||
|
||
<li class="md-nav__item">
|
||
<a href="#representativeresponse" class="md-nav__link">
|
||
<span class="md-ellipsis">
|
||
|
||
RepresentativeResponse
|
||
|
||
</span>
|
||
</a>
|
||
|
||
</li>
|
||
|
||
<li class="md-nav__item">
|
||
<a href="#responseupvote" class="md-nav__link">
|
||
<span class="md-ellipsis">
|
||
|
||
ResponseUpvote
|
||
|
||
</span>
|
||
</a>
|
||
|
||
</li>
|
||
|
||
<li class="md-nav__item">
|
||
<a href="#customrecipient" class="md-nav__link">
|
||
<span class="md-ellipsis">
|
||
|
||
CustomRecipient
|
||
|
||
</span>
|
||
</a>
|
||
|
||
</li>
|
||
|
||
<li class="md-nav__item">
|
||
<a href="#postalcodecache" class="md-nav__link">
|
||
<span class="md-ellipsis">
|
||
|
||
PostalCodeCache
|
||
|
||
</span>
|
||
</a>
|
||
|
||
</li>
|
||
|
||
<li class="md-nav__item">
|
||
<a href="#emaillog" class="md-nav__link">
|
||
<span class="md-ellipsis">
|
||
|
||
EmailLog
|
||
|
||
</span>
|
||
</a>
|
||
|
||
</li>
|
||
|
||
<li class="md-nav__item">
|
||
<a href="#emailverification" class="md-nav__link">
|
||
<span class="md-ellipsis">
|
||
|
||
EmailVerification
|
||
|
||
</span>
|
||
</a>
|
||
|
||
</li>
|
||
|
||
<li class="md-nav__item">
|
||
<a href="#call" class="md-nav__link">
|
||
<span class="md-ellipsis">
|
||
|
||
Call
|
||
|
||
</span>
|
||
</a>
|
||
|
||
</li>
|
||
|
||
</ul>
|
||
</nav>
|
||
|
||
</li>
|
||
|
||
<li class="md-nav__item">
|
||
<a href="#map-locations" class="md-nav__link">
|
||
<span class="md-ellipsis">
|
||
|
||
Map — Locations
|
||
|
||
</span>
|
||
</a>
|
||
|
||
<nav class="md-nav" aria-label="Map — Locations">
|
||
<ul class="md-nav__list">
|
||
|
||
<li class="md-nav__item">
|
||
<a href="#location" class="md-nav__link">
|
||
<span class="md-ellipsis">
|
||
|
||
Location
|
||
|
||
</span>
|
||
</a>
|
||
|
||
</li>
|
||
|
||
<li class="md-nav__item">
|
||
<a href="#address" class="md-nav__link">
|
||
<span class="md-ellipsis">
|
||
|
||
Address
|
||
|
||
</span>
|
||
</a>
|
||
|
||
</li>
|
||
|
||
<li class="md-nav__item">
|
||
<a href="#locationhistory" class="md-nav__link">
|
||
<span class="md-ellipsis">
|
||
|
||
LocationHistory
|
||
|
||
</span>
|
||
</a>
|
||
|
||
</li>
|
||
|
||
</ul>
|
||
</nav>
|
||
|
||
</li>
|
||
|
||
<li class="md-nav__item">
|
||
<a href="#map-shifts-cuts" class="md-nav__link">
|
||
<span class="md-ellipsis">
|
||
|
||
Map — Shifts & Cuts
|
||
|
||
</span>
|
||
</a>
|
||
|
||
<nav class="md-nav" aria-label="Map — Shifts & Cuts">
|
||
<ul class="md-nav__list">
|
||
|
||
<li class="md-nav__item">
|
||
<a href="#shift" class="md-nav__link">
|
||
<span class="md-ellipsis">
|
||
|
||
Shift
|
||
|
||
</span>
|
||
</a>
|
||
|
||
</li>
|
||
|
||
<li class="md-nav__item">
|
||
<a href="#shiftsignup" class="md-nav__link">
|
||
<span class="md-ellipsis">
|
||
|
||
ShiftSignup
|
||
|
||
</span>
|
||
</a>
|
||
|
||
</li>
|
||
|
||
<li class="md-nav__item">
|
||
<a href="#cut" class="md-nav__link">
|
||
<span class="md-ellipsis">
|
||
|
||
Cut
|
||
|
||
</span>
|
||
</a>
|
||
|
||
</li>
|
||
|
||
<li class="md-nav__item">
|
||
<a href="#mapsettings" class="md-nav__link">
|
||
<span class="md-ellipsis">
|
||
|
||
MapSettings
|
||
|
||
</span>
|
||
</a>
|
||
|
||
</li>
|
||
|
||
</ul>
|
||
</nav>
|
||
|
||
</li>
|
||
|
||
<li class="md-nav__item">
|
||
<a href="#canvassing" class="md-nav__link">
|
||
<span class="md-ellipsis">
|
||
|
||
Canvassing
|
||
|
||
</span>
|
||
</a>
|
||
|
||
<nav class="md-nav" aria-label="Canvassing">
|
||
<ul class="md-nav__list">
|
||
|
||
<li class="md-nav__item">
|
||
<a href="#canvasssession" class="md-nav__link">
|
||
<span class="md-ellipsis">
|
||
|
||
CanvassSession
|
||
|
||
</span>
|
||
</a>
|
||
|
||
</li>
|
||
|
||
<li class="md-nav__item">
|
||
<a href="#canvassvisit" class="md-nav__link">
|
||
<span class="md-ellipsis">
|
||
|
||
CanvassVisit
|
||
|
||
</span>
|
||
</a>
|
||
|
||
</li>
|
||
|
||
<li class="md-nav__item">
|
||
<a href="#trackingsession" class="md-nav__link">
|
||
<span class="md-ellipsis">
|
||
|
||
TrackingSession
|
||
|
||
</span>
|
||
</a>
|
||
|
||
</li>
|
||
|
||
<li class="md-nav__item">
|
||
<a href="#trackpoint" class="md-nav__link">
|
||
<span class="md-ellipsis">
|
||
|
||
TrackPoint
|
||
|
||
</span>
|
||
</a>
|
||
|
||
</li>
|
||
|
||
</ul>
|
||
</nav>
|
||
|
||
</li>
|
||
|
||
<li class="md-nav__item">
|
||
<a href="#email-templates" class="md-nav__link">
|
||
<span class="md-ellipsis">
|
||
|
||
Email Templates
|
||
|
||
</span>
|
||
</a>
|
||
|
||
<nav class="md-nav" aria-label="Email Templates">
|
||
<ul class="md-nav__list">
|
||
|
||
<li class="md-nav__item">
|
||
<a href="#emailtemplate" class="md-nav__link">
|
||
<span class="md-ellipsis">
|
||
|
||
EmailTemplate
|
||
|
||
</span>
|
||
</a>
|
||
|
||
</li>
|
||
|
||
<li class="md-nav__item">
|
||
<a href="#emailtemplatevariable" class="md-nav__link">
|
||
<span class="md-ellipsis">
|
||
|
||
EmailTemplateVariable
|
||
|
||
</span>
|
||
</a>
|
||
|
||
</li>
|
||
|
||
<li class="md-nav__item">
|
||
<a href="#emailtemplateversion" class="md-nav__link">
|
||
<span class="md-ellipsis">
|
||
|
||
EmailTemplateVersion
|
||
|
||
</span>
|
||
</a>
|
||
|
||
</li>
|
||
|
||
<li class="md-nav__item">
|
||
<a href="#emailtemplatetestlog" class="md-nav__link">
|
||
<span class="md-ellipsis">
|
||
|
||
EmailTemplateTestLog
|
||
|
||
</span>
|
||
</a>
|
||
|
||
</li>
|
||
|
||
</ul>
|
||
</nav>
|
||
|
||
</li>
|
||
|
||
<li class="md-nav__item">
|
||
<a href="#landing-pages" class="md-nav__link">
|
||
<span class="md-ellipsis">
|
||
|
||
Landing Pages
|
||
|
||
</span>
|
||
</a>
|
||
|
||
<nav class="md-nav" aria-label="Landing Pages">
|
||
<ul class="md-nav__list">
|
||
|
||
<li class="md-nav__item">
|
||
<a href="#landingpage" class="md-nav__link">
|
||
<span class="md-ellipsis">
|
||
|
||
LandingPage
|
||
|
||
</span>
|
||
</a>
|
||
|
||
</li>
|
||
|
||
<li class="md-nav__item">
|
||
<a href="#pageblock" class="md-nav__link">
|
||
<span class="md-ellipsis">
|
||
|
||
PageBlock
|
||
|
||
</span>
|
||
</a>
|
||
|
||
</li>
|
||
|
||
</ul>
|
||
</nav>
|
||
|
||
</li>
|
||
|
||
<li class="md-nav__item">
|
||
<a href="#site-settings" class="md-nav__link">
|
||
<span class="md-ellipsis">
|
||
|
||
Site Settings
|
||
|
||
</span>
|
||
</a>
|
||
|
||
<nav class="md-nav" aria-label="Site Settings">
|
||
<ul class="md-nav__list">
|
||
|
||
<li class="md-nav__item">
|
||
<a href="#sitesettings" class="md-nav__link">
|
||
<span class="md-ellipsis">
|
||
|
||
SiteSettings
|
||
|
||
</span>
|
||
</a>
|
||
|
||
</li>
|
||
|
||
</ul>
|
||
</nav>
|
||
|
||
</li>
|
||
|
||
<li class="md-nav__item">
|
||
<a href="#media-drizzle-orm" class="md-nav__link">
|
||
<span class="md-ellipsis">
|
||
|
||
Media (Drizzle ORM)
|
||
|
||
</span>
|
||
</a>
|
||
|
||
<nav class="md-nav" aria-label="Media (Drizzle ORM)">
|
||
<ul class="md-nav__list">
|
||
|
||
<li class="md-nav__item">
|
||
<a href="#videos" class="md-nav__link">
|
||
<span class="md-ellipsis">
|
||
|
||
videos
|
||
|
||
</span>
|
||
</a>
|
||
|
||
</li>
|
||
|
||
<li class="md-nav__item">
|
||
<a href="#compilations" class="md-nav__link">
|
||
<span class="md-ellipsis">
|
||
|
||
compilations
|
||
|
||
</span>
|
||
</a>
|
||
|
||
</li>
|
||
|
||
<li class="md-nav__item">
|
||
<a href="#jobs" class="md-nav__link">
|
||
<span class="md-ellipsis">
|
||
|
||
jobs
|
||
|
||
</span>
|
||
</a>
|
||
|
||
</li>
|
||
|
||
</ul>
|
||
</nav>
|
||
|
||
</li>
|
||
|
||
<li class="md-nav__item">
|
||
<a href="#related-documentation" class="md-nav__link">
|
||
<span class="md-ellipsis">
|
||
|
||
Related Documentation
|
||
|
||
</span>
|
||
</a>
|
||
|
||
</li>
|
||
|
||
</ul>
|
||
|
||
</nav>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
|
||
|
||
|
||
<div class="md-content" data-md-component="content">
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
<nav class="md-path" aria-label="Navigation" >
|
||
<ol class="md-path__list">
|
||
|
||
|
||
|
||
|
||
<li class="md-path__item">
|
||
<a href="../../.." class="md-path__link">
|
||
|
||
<span class="md-ellipsis">
|
||
Home
|
||
</span>
|
||
|
||
</a>
|
||
</li>
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
<li class="md-path__item">
|
||
<a href="../../" class="md-path__link">
|
||
|
||
<span class="md-ellipsis">
|
||
V2 Documentation
|
||
</span>
|
||
|
||
</a>
|
||
</li>
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
<li class="md-path__item">
|
||
<a href="../" class="md-path__link">
|
||
|
||
<span class="md-ellipsis">
|
||
Database
|
||
</span>
|
||
|
||
</a>
|
||
</li>
|
||
|
||
|
||
|
||
|
||
</ol>
|
||
</nav>
|
||
|
||
|
||
<article class="md-content__inner md-typeset">
|
||
|
||
|
||
|
||
|
||
|
||
<a href="https://gitea.bnkops.com/admin/changemaker.lite/src/branch/main/mkdocs/docs/v2/database/schema.md" title="Edit this page" class="md-content__button md-icon" rel="edit">
|
||
|
||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M10 20H6V4h7v5h5v3.1l2-2V8l-6-6H6c-1.1 0-2 .9-2 2v16c0 1.1.9 2 2 2h4zm10.2-7c.1 0 .3.1.4.2l1.3 1.3c.2.2.2.6 0 .8l-1 1-2.1-2.1 1-1c.1-.1.2-.2.4-.2m0 3.9L14.1 23H12v-2.1l6.1-6.1z"/></svg>
|
||
</a>
|
||
|
||
|
||
|
||
|
||
|
||
<a href="https://gitea.bnkops.com/admin/changemaker.lite/src/branch/main/mkdocs/docs/v2/database/schema.md" title="View source of this page" class="md-content__button md-icon">
|
||
|
||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M17 18c.56 0 1 .44 1 1s-.44 1-1 1-1-.44-1-1 .44-1 1-1m0-3c-2.73 0-5.06 1.66-6 4 .94 2.34 3.27 4 6 4s5.06-1.66 6-4c-.94-2.34-3.27-4-6-4m0 6.5a2.5 2.5 0 0 1-2.5-2.5 2.5 2.5 0 0 1 2.5-2.5 2.5 2.5 0 0 1 2.5 2.5 2.5 2.5 0 0 1-2.5 2.5M9.27 20H6V4h7v5h5v4.07c.7.08 1.36.25 2 .49V8l-6-6H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h4.5a8.2 8.2 0 0 1-1.23-2"/></svg>
|
||
</a>
|
||
|
||
|
||
|
||
<h1 id="complete-schema-reference">Complete Schema Reference<a class="headerlink" href="#complete-schema-reference" title="Permanent link">¶</a></h1>
|
||
<p>This page provides a comprehensive listing of all 33 models across both Prisma and Drizzle ORMs.</p>
|
||
<h2 id="models-summary">Models Summary<a class="headerlink" href="#models-summary" title="Permanent link">¶</a></h2>
|
||
<table>
|
||
<thead>
|
||
<tr>
|
||
<th>Group</th>
|
||
<th>Model</th>
|
||
<th>Table Name</th>
|
||
<th>Description</th>
|
||
<th>ORM</th>
|
||
</tr>
|
||
</thead>
|
||
<tbody>
|
||
<tr>
|
||
<td><strong>Auth & Users</strong></td>
|
||
<td>User</td>
|
||
<td><code>users</code></td>
|
||
<td>User accounts with role-based access control</td>
|
||
<td>Prisma</td>
|
||
</tr>
|
||
<tr>
|
||
<td></td>
|
||
<td>RefreshToken</td>
|
||
<td><code>refresh_tokens</code></td>
|
||
<td>JWT refresh token storage</td>
|
||
<td>Prisma</td>
|
||
</tr>
|
||
<tr>
|
||
<td><strong>Influence</strong></td>
|
||
<td>Campaign</td>
|
||
<td><code>campaigns</code></td>
|
||
<td>Advocacy campaigns with feature flags</td>
|
||
<td>Prisma</td>
|
||
</tr>
|
||
<tr>
|
||
<td></td>
|
||
<td>Representative</td>
|
||
<td><code>representatives</code></td>
|
||
<td>Cached representative data from Represent API</td>
|
||
<td>Prisma</td>
|
||
</tr>
|
||
<tr>
|
||
<td></td>
|
||
<td>CampaignEmail</td>
|
||
<td><code>campaign_emails</code></td>
|
||
<td>Email tracking and delivery logs</td>
|
||
<td>Prisma</td>
|
||
</tr>
|
||
<tr>
|
||
<td></td>
|
||
<td>RepresentativeResponse</td>
|
||
<td><code>representative_responses</code></td>
|
||
<td>Response wall submissions with moderation</td>
|
||
<td>Prisma</td>
|
||
</tr>
|
||
<tr>
|
||
<td></td>
|
||
<td>ResponseUpvote</td>
|
||
<td><code>response_upvotes</code></td>
|
||
<td>Upvote tracking with deduplication</td>
|
||
<td>Prisma</td>
|
||
</tr>
|
||
<tr>
|
||
<td></td>
|
||
<td>CustomRecipient</td>
|
||
<td><code>custom_recipients</code></td>
|
||
<td>Custom email targets for campaigns</td>
|
||
<td>Prisma</td>
|
||
</tr>
|
||
<tr>
|
||
<td></td>
|
||
<td>PostalCodeCache</td>
|
||
<td><code>postal_code_cache</code></td>
|
||
<td>Postal code geocoding cache</td>
|
||
<td>Prisma</td>
|
||
</tr>
|
||
<tr>
|
||
<td></td>
|
||
<td>EmailLog</td>
|
||
<td><code>email_logs</code></td>
|
||
<td>Global email audit trail</td>
|
||
<td>Prisma</td>
|
||
</tr>
|
||
<tr>
|
||
<td></td>
|
||
<td>EmailVerification</td>
|
||
<td><code>email_verifications</code></td>
|
||
<td>Email verification tokens</td>
|
||
<td>Prisma</td>
|
||
</tr>
|
||
<tr>
|
||
<td></td>
|
||
<td>Call</td>
|
||
<td><code>calls</code></td>
|
||
<td>Phone call tracking</td>
|
||
<td>Prisma</td>
|
||
</tr>
|
||
<tr>
|
||
<td><strong>Map — Locations</strong></td>
|
||
<td>Location</td>
|
||
<td><code>locations</code></td>
|
||
<td>Building-level address data with geocoding</td>
|
||
<td>Prisma</td>
|
||
</tr>
|
||
<tr>
|
||
<td></td>
|
||
<td>Address</td>
|
||
<td><code>addresses</code></td>
|
||
<td>Unit-level data with support levels</td>
|
||
<td>Prisma</td>
|
||
</tr>
|
||
<tr>
|
||
<td></td>
|
||
<td>LocationHistory</td>
|
||
<td><code>location_history</code></td>
|
||
<td>Audit trail for location changes</td>
|
||
<td>Prisma</td>
|
||
</tr>
|
||
<tr>
|
||
<td><strong>Map — Shifts & Cuts</strong></td>
|
||
<td>Shift</td>
|
||
<td><code>shifts</code></td>
|
||
<td>Volunteer shifts with scheduling</td>
|
||
<td>Prisma</td>
|
||
</tr>
|
||
<tr>
|
||
<td></td>
|
||
<td>ShiftSignup</td>
|
||
<td><code>shift_signups</code></td>
|
||
<td>Shift signup tracking</td>
|
||
<td>Prisma</td>
|
||
</tr>
|
||
<tr>
|
||
<td></td>
|
||
<td>Cut</td>
|
||
<td><code>cuts</code></td>
|
||
<td>GeoJSON polygon overlays for map filtering</td>
|
||
<td>Prisma</td>
|
||
</tr>
|
||
<tr>
|
||
<td></td>
|
||
<td>MapSettings</td>
|
||
<td><code>map_settings</code></td>
|
||
<td>Singleton for map configuration</td>
|
||
<td>Prisma</td>
|
||
</tr>
|
||
<tr>
|
||
<td><strong>Canvassing</strong></td>
|
||
<td>CanvassSession</td>
|
||
<td><code>canvass_sessions</code></td>
|
||
<td>Canvassing session lifecycle</td>
|
||
<td>Prisma</td>
|
||
</tr>
|
||
<tr>
|
||
<td></td>
|
||
<td>CanvassVisit</td>
|
||
<td><code>canvass_visits</code></td>
|
||
<td>Visit recording with outcomes</td>
|
||
<td>Prisma</td>
|
||
</tr>
|
||
<tr>
|
||
<td></td>
|
||
<td>TrackingSession</td>
|
||
<td><code>tracking_sessions</code></td>
|
||
<td>GPS tracking sessions</td>
|
||
<td>Prisma</td>
|
||
</tr>
|
||
<tr>
|
||
<td></td>
|
||
<td>TrackPoint</td>
|
||
<td><code>track_points</code></td>
|
||
<td>GPS breadcrumb trail</td>
|
||
<td>Prisma</td>
|
||
</tr>
|
||
<tr>
|
||
<td><strong>Email Templates</strong></td>
|
||
<td>EmailTemplate</td>
|
||
<td><code>email_templates</code></td>
|
||
<td>Email template master records</td>
|
||
<td>Prisma</td>
|
||
</tr>
|
||
<tr>
|
||
<td></td>
|
||
<td>EmailTemplateVariable</td>
|
||
<td><code>email_template_variables</code></td>
|
||
<td>Template variable definitions</td>
|
||
<td>Prisma</td>
|
||
</tr>
|
||
<tr>
|
||
<td></td>
|
||
<td>EmailTemplateVersion</td>
|
||
<td><code>email_template_versions</code></td>
|
||
<td>Template version history</td>
|
||
<td>Prisma</td>
|
||
</tr>
|
||
<tr>
|
||
<td></td>
|
||
<td>EmailTemplateTestLog</td>
|
||
<td><code>email_template_test_logs</code></td>
|
||
<td>Test email audit logs</td>
|
||
<td>Prisma</td>
|
||
</tr>
|
||
<tr>
|
||
<td><strong>Landing Pages</strong></td>
|
||
<td>LandingPage</td>
|
||
<td><code>landing_pages</code></td>
|
||
<td>GrapesJS editor output with MkDocs export</td>
|
||
<td>Prisma</td>
|
||
</tr>
|
||
<tr>
|
||
<td></td>
|
||
<td>PageBlock</td>
|
||
<td><code>page_blocks</code></td>
|
||
<td>Reusable block library</td>
|
||
<td>Prisma</td>
|
||
</tr>
|
||
<tr>
|
||
<td><strong>Site Settings</strong></td>
|
||
<td>SiteSettings</td>
|
||
<td><code>site_settings</code></td>
|
||
<td>Global site configuration singleton</td>
|
||
<td>Prisma</td>
|
||
</tr>
|
||
<tr>
|
||
<td><strong>Media</strong></td>
|
||
<td>videos</td>
|
||
<td><code>videos</code></td>
|
||
<td>Video library with metadata</td>
|
||
<td>Drizzle</td>
|
||
</tr>
|
||
<tr>
|
||
<td></td>
|
||
<td>compilations</td>
|
||
<td><code>compilations</code></td>
|
||
<td>Video compilation tracking</td>
|
||
<td>Drizzle</td>
|
||
</tr>
|
||
<tr>
|
||
<td></td>
|
||
<td>jobs</td>
|
||
<td><code>jobs</code></td>
|
||
<td>Job queue with resource management</td>
|
||
<td>Drizzle</td>
|
||
</tr>
|
||
</tbody>
|
||
</table>
|
||
<p><strong>Total:</strong> 33 models (30 Prisma + 3 Drizzle)</p>
|
||
<hr />
|
||
<h2 id="auth-users">Auth & Users<a class="headerlink" href="#auth-users" title="Permanent link">¶</a></h2>
|
||
<h3 id="user">User<a class="headerlink" href="#user" title="Permanent link">¶</a></h3>
|
||
<p><strong>Table:</strong> <code>users</code>
|
||
<strong>Description:</strong> User accounts with role-based access control, temporary user support, and audit tracking.</p>
|
||
<table>
|
||
<thead>
|
||
<tr>
|
||
<th>Field</th>
|
||
<th>Type</th>
|
||
<th>Required</th>
|
||
<th>Default</th>
|
||
<th>Description</th>
|
||
</tr>
|
||
</thead>
|
||
<tbody>
|
||
<tr>
|
||
<td>id</td>
|
||
<td>String</td>
|
||
<td>✓</td>
|
||
<td><code>cuid()</code></td>
|
||
<td>Primary key</td>
|
||
</tr>
|
||
<tr>
|
||
<td>email</td>
|
||
<td>String</td>
|
||
<td>✓</td>
|
||
<td>—</td>
|
||
<td>Unique email address</td>
|
||
</tr>
|
||
<tr>
|
||
<td>password</td>
|
||
<td>String</td>
|
||
<td>✓</td>
|
||
<td>—</td>
|
||
<td>bcrypt hashed password (12+ chars policy)</td>
|
||
</tr>
|
||
<tr>
|
||
<td>name</td>
|
||
<td>String</td>
|
||
<td>✗</td>
|
||
<td><code>null</code></td>
|
||
<td>User display name</td>
|
||
</tr>
|
||
<tr>
|
||
<td>phone</td>
|
||
<td>String</td>
|
||
<td>✗</td>
|
||
<td><code>null</code></td>
|
||
<td>Phone number</td>
|
||
</tr>
|
||
<tr>
|
||
<td>role</td>
|
||
<td>UserRole</td>
|
||
<td>✓</td>
|
||
<td><code>USER</code></td>
|
||
<td>Role: SUPER_ADMIN, INFLUENCE_ADMIN, MAP_ADMIN, USER, TEMP</td>
|
||
</tr>
|
||
<tr>
|
||
<td>status</td>
|
||
<td>UserStatus</td>
|
||
<td>✓</td>
|
||
<td><code>ACTIVE</code></td>
|
||
<td>Status: ACTIVE, INACTIVE, SUSPENDED, EXPIRED</td>
|
||
</tr>
|
||
<tr>
|
||
<td>permissions</td>
|
||
<td>Json</td>
|
||
<td>✗</td>
|
||
<td><code>null</code></td>
|
||
<td>Granular per-app permissions object</td>
|
||
</tr>
|
||
<tr>
|
||
<td>createdVia</td>
|
||
<td>UserCreatedVia</td>
|
||
<td>✓</td>
|
||
<td><code>STANDARD</code></td>
|
||
<td>Creation source: ADMIN, PUBLIC_SHIFT_SIGNUP, STANDARD</td>
|
||
</tr>
|
||
<tr>
|
||
<td>expiresAt</td>
|
||
<td>DateTime</td>
|
||
<td>✗</td>
|
||
<td><code>null</code></td>
|
||
<td>Expiration date for TEMP users</td>
|
||
</tr>
|
||
<tr>
|
||
<td>expireDays</td>
|
||
<td>Int</td>
|
||
<td>✗</td>
|
||
<td><code>null</code></td>
|
||
<td>Days until expiration for TEMP users</td>
|
||
</tr>
|
||
<tr>
|
||
<td>lastLoginAt</td>
|
||
<td>DateTime</td>
|
||
<td>✗</td>
|
||
<td><code>null</code></td>
|
||
<td>Last login timestamp</td>
|
||
</tr>
|
||
<tr>
|
||
<td>emailVerified</td>
|
||
<td>Boolean</td>
|
||
<td>✓</td>
|
||
<td><code>false</code></td>
|
||
<td>Email verification status</td>
|
||
</tr>
|
||
<tr>
|
||
<td>createdAt</td>
|
||
<td>DateTime</td>
|
||
<td>✓</td>
|
||
<td><code>now()</code></td>
|
||
<td>Creation timestamp</td>
|
||
</tr>
|
||
<tr>
|
||
<td>updatedAt</td>
|
||
<td>DateTime</td>
|
||
<td>✓</td>
|
||
<td>Auto</td>
|
||
<td>Last update timestamp</td>
|
||
</tr>
|
||
</tbody>
|
||
</table>
|
||
<p><strong>Indexes:</strong>
|
||
- Unique: <code>email</code></p>
|
||
<p><strong>Relations (33 total):</strong>
|
||
- refreshTokens → RefreshToken[]
|
||
- campaignsCreated → Campaign[]
|
||
- campaignEmails → CampaignEmail[]
|
||
- responses → RepresentativeResponse[]
|
||
- responseUpvotes → ResponseUpvote[]
|
||
- shiftSignups → ShiftSignup[]
|
||
- locationsCreated → Location[]
|
||
- locationsUpdated → Location[]
|
||
- addressesCreated → Address[]
|
||
- addressesUpdated → Address[]
|
||
- locationEdits → LocationHistory[]
|
||
- cutsCreated → Cut[]
|
||
- canvassVisits → CanvassVisit[]
|
||
- canvassSessions → CanvassSession[]
|
||
- trackingSessions → TrackingSession[]
|
||
- templatesCreated → EmailTemplate[]
|
||
- templatesUpdated → EmailTemplate[]
|
||
- templateVersionsCreated → EmailTemplateVersion[]
|
||
- templateTestsSent → EmailTemplateTestLog[]</p>
|
||
<h3 id="refreshtoken">RefreshToken<a class="headerlink" href="#refreshtoken" title="Permanent link">¶</a></h3>
|
||
<p><strong>Table:</strong> <code>refresh_tokens</code>
|
||
<strong>Description:</strong> JWT refresh token storage with expiration tracking.</p>
|
||
<table>
|
||
<thead>
|
||
<tr>
|
||
<th>Field</th>
|
||
<th>Type</th>
|
||
<th>Required</th>
|
||
<th>Default</th>
|
||
<th>Description</th>
|
||
</tr>
|
||
</thead>
|
||
<tbody>
|
||
<tr>
|
||
<td>id</td>
|
||
<td>String</td>
|
||
<td>✓</td>
|
||
<td><code>cuid()</code></td>
|
||
<td>Primary key</td>
|
||
</tr>
|
||
<tr>
|
||
<td>token</td>
|
||
<td>String</td>
|
||
<td>✓</td>
|
||
<td>—</td>
|
||
<td>JWT refresh token (unique)</td>
|
||
</tr>
|
||
<tr>
|
||
<td>userId</td>
|
||
<td>String</td>
|
||
<td>✓</td>
|
||
<td>—</td>
|
||
<td>Foreign key to User</td>
|
||
</tr>
|
||
<tr>
|
||
<td>expiresAt</td>
|
||
<td>DateTime</td>
|
||
<td>✓</td>
|
||
<td>—</td>
|
||
<td>Token expiration timestamp</td>
|
||
</tr>
|
||
<tr>
|
||
<td>createdAt</td>
|
||
<td>DateTime</td>
|
||
<td>✓</td>
|
||
<td><code>now()</code></td>
|
||
<td>Creation timestamp</td>
|
||
</tr>
|
||
</tbody>
|
||
</table>
|
||
<p><strong>Indexes:</strong>
|
||
- Unique: <code>token</code>
|
||
- Foreign key: <code>userId</code></p>
|
||
<p><strong>Relations:</strong>
|
||
- user → User (onDelete: Cascade)</p>
|
||
<hr />
|
||
<h2 id="influence">Influence<a class="headerlink" href="#influence" title="Permanent link">¶</a></h2>
|
||
<h3 id="campaign">Campaign<a class="headerlink" href="#campaign" title="Permanent link">¶</a></h3>
|
||
<p><strong>Table:</strong> <code>campaigns</code>
|
||
<strong>Description:</strong> Advocacy campaigns with 12 feature flags and government-level targeting.</p>
|
||
<table>
|
||
<thead>
|
||
<tr>
|
||
<th>Field</th>
|
||
<th>Type</th>
|
||
<th>Required</th>
|
||
<th>Default</th>
|
||
<th>Description</th>
|
||
</tr>
|
||
</thead>
|
||
<tbody>
|
||
<tr>
|
||
<td>id</td>
|
||
<td>String</td>
|
||
<td>✓</td>
|
||
<td><code>cuid()</code></td>
|
||
<td>Primary key</td>
|
||
</tr>
|
||
<tr>
|
||
<td>slug</td>
|
||
<td>String</td>
|
||
<td>✓</td>
|
||
<td>—</td>
|
||
<td>URL-friendly slug (unique)</td>
|
||
</tr>
|
||
<tr>
|
||
<td>title</td>
|
||
<td>String</td>
|
||
<td>✓</td>
|
||
<td>—</td>
|
||
<td>Campaign title</td>
|
||
</tr>
|
||
<tr>
|
||
<td>description</td>
|
||
<td>String</td>
|
||
<td>✗</td>
|
||
<td><code>null</code></td>
|
||
<td>Campaign description (long text)</td>
|
||
</tr>
|
||
<tr>
|
||
<td>emailSubject</td>
|
||
<td>String</td>
|
||
<td>✓</td>
|
||
<td>—</td>
|
||
<td>Default email subject line</td>
|
||
</tr>
|
||
<tr>
|
||
<td>emailBody</td>
|
||
<td>String</td>
|
||
<td>✓</td>
|
||
<td>—</td>
|
||
<td>Default email body (long text)</td>
|
||
</tr>
|
||
<tr>
|
||
<td>callToAction</td>
|
||
<td>String</td>
|
||
<td>✗</td>
|
||
<td><code>null</code></td>
|
||
<td>Call-to-action text (long text)</td>
|
||
</tr>
|
||
<tr>
|
||
<td>coverPhoto</td>
|
||
<td>String</td>
|
||
<td>✗</td>
|
||
<td><code>null</code></td>
|
||
<td>Cover photo URL</td>
|
||
</tr>
|
||
<tr>
|
||
<td>status</td>
|
||
<td>CampaignStatus</td>
|
||
<td>✓</td>
|
||
<td><code>DRAFT</code></td>
|
||
<td>Status: DRAFT, ACTIVE, PAUSED, ARCHIVED</td>
|
||
</tr>
|
||
<tr>
|
||
<td>allowSmtpEmail</td>
|
||
<td>Boolean</td>
|
||
<td>✓</td>
|
||
<td><code>true</code></td>
|
||
<td>Allow SMTP email sending</td>
|
||
</tr>
|
||
<tr>
|
||
<td>allowMailtoLink</td>
|
||
<td>Boolean</td>
|
||
<td>✓</td>
|
||
<td><code>true</code></td>
|
||
<td>Allow mailto: links</td>
|
||
</tr>
|
||
<tr>
|
||
<td>collectUserInfo</td>
|
||
<td>Boolean</td>
|
||
<td>✓</td>
|
||
<td><code>true</code></td>
|
||
<td>Collect user information</td>
|
||
</tr>
|
||
<tr>
|
||
<td>showEmailCount</td>
|
||
<td>Boolean</td>
|
||
<td>✓</td>
|
||
<td><code>true</code></td>
|
||
<td>Show email sent count</td>
|
||
</tr>
|
||
<tr>
|
||
<td>showCallCount</td>
|
||
<td>Boolean</td>
|
||
<td>✓</td>
|
||
<td><code>true</code></td>
|
||
<td>Show call made count</td>
|
||
</tr>
|
||
<tr>
|
||
<td>allowEmailEditing</td>
|
||
<td>Boolean</td>
|
||
<td>✓</td>
|
||
<td><code>false</code></td>
|
||
<td>Allow users to edit email content</td>
|
||
</tr>
|
||
<tr>
|
||
<td>allowCustomRecipients</td>
|
||
<td>Boolean</td>
|
||
<td>✓</td>
|
||
<td><code>false</code></td>
|
||
<td>Allow custom email recipients</td>
|
||
</tr>
|
||
<tr>
|
||
<td>showResponseWall</td>
|
||
<td>Boolean</td>
|
||
<td>✓</td>
|
||
<td><code>false</code></td>
|
||
<td>Show public response wall</td>
|
||
</tr>
|
||
<tr>
|
||
<td>highlightCampaign</td>
|
||
<td>Boolean</td>
|
||
<td>✓</td>
|
||
<td><code>false</code></td>
|
||
<td>Highlight on campaign list page</td>
|
||
</tr>
|
||
<tr>
|
||
<td>targetGovernmentLevels</td>
|
||
<td>GovernmentLevel[]</td>
|
||
<td>✓</td>
|
||
<td><code>[]</code></td>
|
||
<td>Target levels: FEDERAL, PROVINCIAL, MUNICIPAL, SCHOOL_BOARD</td>
|
||
</tr>
|
||
<tr>
|
||
<td>createdByUserId</td>
|
||
<td>String</td>
|
||
<td>✗</td>
|
||
<td><code>null</code></td>
|
||
<td>Foreign key to User (creator)</td>
|
||
</tr>
|
||
<tr>
|
||
<td>createdByUserEmail</td>
|
||
<td>String</td>
|
||
<td>✗</td>
|
||
<td><code>null</code></td>
|
||
<td>Creator email (denormalized)</td>
|
||
</tr>
|
||
<tr>
|
||
<td>createdByUserName</td>
|
||
<td>String</td>
|
||
<td>✗</td>
|
||
<td><code>null</code></td>
|
||
<td>Creator name (denormalized)</td>
|
||
</tr>
|
||
<tr>
|
||
<td>createdAt</td>
|
||
<td>DateTime</td>
|
||
<td>✓</td>
|
||
<td><code>now()</code></td>
|
||
<td>Creation timestamp</td>
|
||
</tr>
|
||
<tr>
|
||
<td>updatedAt</td>
|
||
<td>DateTime</td>
|
||
<td>✓</td>
|
||
<td>Auto</td>
|
||
<td>Last update timestamp</td>
|
||
</tr>
|
||
</tbody>
|
||
</table>
|
||
<p><strong>Indexes:</strong>
|
||
- Unique: <code>slug</code></p>
|
||
<p><strong>Relations:</strong>
|
||
- createdByUser → User (onDelete: SetNull)
|
||
- emails → CampaignEmail[]
|
||
- responses → RepresentativeResponse[]
|
||
- customRecipients → CustomRecipient[]
|
||
- calls → Call[]</p>
|
||
<h3 id="representative">Representative<a class="headerlink" href="#representative" title="Permanent link">¶</a></h3>
|
||
<p><strong>Table:</strong> <code>representatives</code>
|
||
<strong>Description:</strong> Cached representative data from Represent API.</p>
|
||
<table>
|
||
<thead>
|
||
<tr>
|
||
<th>Field</th>
|
||
<th>Type</th>
|
||
<th>Required</th>
|
||
<th>Default</th>
|
||
<th>Description</th>
|
||
</tr>
|
||
</thead>
|
||
<tbody>
|
||
<tr>
|
||
<td>id</td>
|
||
<td>String</td>
|
||
<td>✓</td>
|
||
<td><code>cuid()</code></td>
|
||
<td>Primary key</td>
|
||
</tr>
|
||
<tr>
|
||
<td>postalCode</td>
|
||
<td>String</td>
|
||
<td>✓</td>
|
||
<td>—</td>
|
||
<td>Canadian postal code (indexed)</td>
|
||
</tr>
|
||
<tr>
|
||
<td>name</td>
|
||
<td>String</td>
|
||
<td>✗</td>
|
||
<td><code>null</code></td>
|
||
<td>Representative name</td>
|
||
</tr>
|
||
<tr>
|
||
<td>email</td>
|
||
<td>String</td>
|
||
<td>✗</td>
|
||
<td><code>null</code></td>
|
||
<td>Representative email</td>
|
||
</tr>
|
||
<tr>
|
||
<td>districtName</td>
|
||
<td>String</td>
|
||
<td>✗</td>
|
||
<td><code>null</code></td>
|
||
<td>Electoral district name</td>
|
||
</tr>
|
||
<tr>
|
||
<td>electedOffice</td>
|
||
<td>String</td>
|
||
<td>✗</td>
|
||
<td><code>null</code></td>
|
||
<td>Office title</td>
|
||
</tr>
|
||
<tr>
|
||
<td>partyName</td>
|
||
<td>String</td>
|
||
<td>✗</td>
|
||
<td><code>null</code></td>
|
||
<td>Political party</td>
|
||
</tr>
|
||
<tr>
|
||
<td>representativeSetName</td>
|
||
<td>String</td>
|
||
<td>✗</td>
|
||
<td><code>null</code></td>
|
||
<td>Representative set from Represent API</td>
|
||
</tr>
|
||
<tr>
|
||
<td>url</td>
|
||
<td>String</td>
|
||
<td>✗</td>
|
||
<td><code>null</code></td>
|
||
<td>Official website URL</td>
|
||
</tr>
|
||
<tr>
|
||
<td>photoUrl</td>
|
||
<td>String</td>
|
||
<td>✗</td>
|
||
<td><code>null</code></td>
|
||
<td>Photo URL</td>
|
||
</tr>
|
||
<tr>
|
||
<td>offices</td>
|
||
<td>Json</td>
|
||
<td>✗</td>
|
||
<td><code>null</code></td>
|
||
<td>Array of office contact info objects</td>
|
||
</tr>
|
||
<tr>
|
||
<td>cachedAt</td>
|
||
<td>DateTime</td>
|
||
<td>✓</td>
|
||
<td><code>now()</code></td>
|
||
<td>Cache timestamp</td>
|
||
</tr>
|
||
</tbody>
|
||
</table>
|
||
<p><strong>Indexes:</strong>
|
||
- Non-unique: <code>postalCode</code></p>
|
||
<p><strong>Relations:</strong> None (standalone cache)</p>
|
||
<h3 id="campaignemail">CampaignEmail<a class="headerlink" href="#campaignemail" title="Permanent link">¶</a></h3>
|
||
<p><strong>Table:</strong> <code>campaign_emails</code>
|
||
<strong>Description:</strong> Email tracking and delivery logs for campaign emails.</p>
|
||
<table>
|
||
<thead>
|
||
<tr>
|
||
<th>Field</th>
|
||
<th>Type</th>
|
||
<th>Required</th>
|
||
<th>Default</th>
|
||
<th>Description</th>
|
||
</tr>
|
||
</thead>
|
||
<tbody>
|
||
<tr>
|
||
<td>id</td>
|
||
<td>String</td>
|
||
<td>✓</td>
|
||
<td><code>cuid()</code></td>
|
||
<td>Primary key</td>
|
||
</tr>
|
||
<tr>
|
||
<td>campaignId</td>
|
||
<td>String</td>
|
||
<td>✓</td>
|
||
<td>—</td>
|
||
<td>Foreign key to Campaign</td>
|
||
</tr>
|
||
<tr>
|
||
<td>campaignSlug</td>
|
||
<td>String</td>
|
||
<td>✓</td>
|
||
<td>—</td>
|
||
<td>Denormalized campaign slug</td>
|
||
</tr>
|
||
<tr>
|
||
<td>userId</td>
|
||
<td>String</td>
|
||
<td>✗</td>
|
||
<td><code>null</code></td>
|
||
<td>Foreign key to User (sender)</td>
|
||
</tr>
|
||
<tr>
|
||
<td>userEmail</td>
|
||
<td>String</td>
|
||
<td>✗</td>
|
||
<td><code>null</code></td>
|
||
<td>Sender email</td>
|
||
</tr>
|
||
<tr>
|
||
<td>userName</td>
|
||
<td>String</td>
|
||
<td>✗</td>
|
||
<td><code>null</code></td>
|
||
<td>Sender name</td>
|
||
</tr>
|
||
<tr>
|
||
<td>userPostalCode</td>
|
||
<td>String</td>
|
||
<td>✗</td>
|
||
<td><code>null</code></td>
|
||
<td>Sender postal code</td>
|
||
</tr>
|
||
<tr>
|
||
<td>recipientEmail</td>
|
||
<td>String</td>
|
||
<td>✓</td>
|
||
<td>—</td>
|
||
<td>Recipient email address</td>
|
||
</tr>
|
||
<tr>
|
||
<td>recipientName</td>
|
||
<td>String</td>
|
||
<td>✗</td>
|
||
<td><code>null</code></td>
|
||
<td>Recipient name</td>
|
||
</tr>
|
||
<tr>
|
||
<td>recipientTitle</td>
|
||
<td>String</td>
|
||
<td>✗</td>
|
||
<td><code>null</code></td>
|
||
<td>Recipient title</td>
|
||
</tr>
|
||
<tr>
|
||
<td>recipientLevel</td>
|
||
<td>GovernmentLevel</td>
|
||
<td>✗</td>
|
||
<td><code>null</code></td>
|
||
<td>Government level</td>
|
||
</tr>
|
||
<tr>
|
||
<td>emailMethod</td>
|
||
<td>EmailMethod</td>
|
||
<td>✓</td>
|
||
<td>—</td>
|
||
<td>Method: SMTP, MAILTO</td>
|
||
</tr>
|
||
<tr>
|
||
<td>subject</td>
|
||
<td>String</td>
|
||
<td>✓</td>
|
||
<td>—</td>
|
||
<td>Email subject line</td>
|
||
</tr>
|
||
<tr>
|
||
<td>message</td>
|
||
<td>String</td>
|
||
<td>✓</td>
|
||
<td>—</td>
|
||
<td>Email message body (long text)</td>
|
||
</tr>
|
||
<tr>
|
||
<td>status</td>
|
||
<td>CampaignEmailStatus</td>
|
||
<td>✓</td>
|
||
<td><code>SENT</code></td>
|
||
<td>Status: QUEUED, SENT, FAILED, CLICKED, USER_INFO_CAPTURED</td>
|
||
</tr>
|
||
<tr>
|
||
<td>senderIp</td>
|
||
<td>String</td>
|
||
<td>✗</td>
|
||
<td><code>null</code></td>
|
||
<td>Sender IP address</td>
|
||
</tr>
|
||
<tr>
|
||
<td>sentAt</td>
|
||
<td>DateTime</td>
|
||
<td>✓</td>
|
||
<td><code>now()</code></td>
|
||
<td>Send timestamp</td>
|
||
</tr>
|
||
</tbody>
|
||
</table>
|
||
<p><strong>Indexes:</strong>
|
||
- Foreign key: <code>campaignId</code>
|
||
- Non-unique: <code>campaignSlug</code></p>
|
||
<p><strong>Relations:</strong>
|
||
- campaign → Campaign (onDelete: Cascade)
|
||
- user → User (onDelete: SetNull)</p>
|
||
<h3 id="representativeresponse">RepresentativeResponse<a class="headerlink" href="#representativeresponse" title="Permanent link">¶</a></h3>
|
||
<p><strong>Table:</strong> <code>representative_responses</code>
|
||
<strong>Description:</strong> Response wall submissions with moderation workflow.</p>
|
||
<table>
|
||
<thead>
|
||
<tr>
|
||
<th>Field</th>
|
||
<th>Type</th>
|
||
<th>Required</th>
|
||
<th>Default</th>
|
||
<th>Description</th>
|
||
</tr>
|
||
</thead>
|
||
<tbody>
|
||
<tr>
|
||
<td>id</td>
|
||
<td>String</td>
|
||
<td>✓</td>
|
||
<td><code>cuid()</code></td>
|
||
<td>Primary key</td>
|
||
</tr>
|
||
<tr>
|
||
<td>campaignId</td>
|
||
<td>String</td>
|
||
<td>✓</td>
|
||
<td>—</td>
|
||
<td>Foreign key to Campaign</td>
|
||
</tr>
|
||
<tr>
|
||
<td>campaignSlug</td>
|
||
<td>String</td>
|
||
<td>✓</td>
|
||
<td>—</td>
|
||
<td>Denormalized campaign slug</td>
|
||
</tr>
|
||
<tr>
|
||
<td>representativeName</td>
|
||
<td>String</td>
|
||
<td>✓</td>
|
||
<td>—</td>
|
||
<td>Representative name</td>
|
||
</tr>
|
||
<tr>
|
||
<td>representativeTitle</td>
|
||
<td>String</td>
|
||
<td>✗</td>
|
||
<td><code>null</code></td>
|
||
<td>Representative title</td>
|
||
</tr>
|
||
<tr>
|
||
<td>representativeLevel</td>
|
||
<td>GovernmentLevel</td>
|
||
<td>✓</td>
|
||
<td>—</td>
|
||
<td>Government level</td>
|
||
</tr>
|
||
<tr>
|
||
<td>representativeEmail</td>
|
||
<td>String</td>
|
||
<td>✗</td>
|
||
<td><code>null</code></td>
|
||
<td>Representative email</td>
|
||
</tr>
|
||
<tr>
|
||
<td>responseType</td>
|
||
<td>ResponseType</td>
|
||
<td>✓</td>
|
||
<td>—</td>
|
||
<td>Type: EMAIL, LETTER, PHONE_CALL, MEETING, SOCIAL_MEDIA, OTHER</td>
|
||
</tr>
|
||
<tr>
|
||
<td>responseText</td>
|
||
<td>String</td>
|
||
<td>✓</td>
|
||
<td>—</td>
|
||
<td>Response text (long text)</td>
|
||
</tr>
|
||
<tr>
|
||
<td>userComment</td>
|
||
<td>String</td>
|
||
<td>✗</td>
|
||
<td><code>null</code></td>
|
||
<td>User comment (long text)</td>
|
||
</tr>
|
||
<tr>
|
||
<td>screenshotUrl</td>
|
||
<td>String</td>
|
||
<td>✗</td>
|
||
<td><code>null</code></td>
|
||
<td>Screenshot URL</td>
|
||
</tr>
|
||
<tr>
|
||
<td>submittedByUserId</td>
|
||
<td>String</td>
|
||
<td>✗</td>
|
||
<td><code>null</code></td>
|
||
<td>Foreign key to User</td>
|
||
</tr>
|
||
<tr>
|
||
<td>submittedByName</td>
|
||
<td>String</td>
|
||
<td>✗</td>
|
||
<td><code>null</code></td>
|
||
<td>Submitter name</td>
|
||
</tr>
|
||
<tr>
|
||
<td>submittedByEmail</td>
|
||
<td>String</td>
|
||
<td>✗</td>
|
||
<td><code>null</code></td>
|
||
<td>Submitter email</td>
|
||
</tr>
|
||
<tr>
|
||
<td>isAnonymous</td>
|
||
<td>Boolean</td>
|
||
<td>✓</td>
|
||
<td><code>false</code></td>
|
||
<td>Anonymous submission flag</td>
|
||
</tr>
|
||
<tr>
|
||
<td>status</td>
|
||
<td>ResponseStatus</td>
|
||
<td>✓</td>
|
||
<td><code>PENDING</code></td>
|
||
<td>Status: PENDING, APPROVED, REJECTED</td>
|
||
</tr>
|
||
<tr>
|
||
<td>isVerified</td>
|
||
<td>Boolean</td>
|
||
<td>✓</td>
|
||
<td><code>false</code></td>
|
||
<td>Email verification status</td>
|
||
</tr>
|
||
<tr>
|
||
<td>verificationToken</td>
|
||
<td>String</td>
|
||
<td>✗</td>
|
||
<td><code>null</code></td>
|
||
<td>Verification token</td>
|
||
</tr>
|
||
<tr>
|
||
<td>verificationSentAt</td>
|
||
<td>DateTime</td>
|
||
<td>✗</td>
|
||
<td><code>null</code></td>
|
||
<td>Verification email timestamp</td>
|
||
</tr>
|
||
<tr>
|
||
<td>verifiedAt</td>
|
||
<td>DateTime</td>
|
||
<td>✗</td>
|
||
<td><code>null</code></td>
|
||
<td>Verification timestamp</td>
|
||
</tr>
|
||
<tr>
|
||
<td>verifiedBy</td>
|
||
<td>String</td>
|
||
<td>✗</td>
|
||
<td><code>null</code></td>
|
||
<td>Email address that verified</td>
|
||
</tr>
|
||
<tr>
|
||
<td>upvoteCount</td>
|
||
<td>Int</td>
|
||
<td>✓</td>
|
||
<td><code>0</code></td>
|
||
<td>Upvote count (denormalized)</td>
|
||
</tr>
|
||
<tr>
|
||
<td>submittedIp</td>
|
||
<td>String</td>
|
||
<td>✗</td>
|
||
<td><code>null</code></td>
|
||
<td>Submitter IP address</td>
|
||
</tr>
|
||
<tr>
|
||
<td>createdAt</td>
|
||
<td>DateTime</td>
|
||
<td>✓</td>
|
||
<td><code>now()</code></td>
|
||
<td>Creation timestamp</td>
|
||
</tr>
|
||
<tr>
|
||
<td>updatedAt</td>
|
||
<td>DateTime</td>
|
||
<td>✓</td>
|
||
<td>Auto</td>
|
||
<td>Last update timestamp</td>
|
||
</tr>
|
||
</tbody>
|
||
</table>
|
||
<p><strong>Indexes:</strong>
|
||
- Foreign key: <code>campaignId</code>
|
||
- Non-unique: <code>campaignSlug</code></p>
|
||
<p><strong>Relations:</strong>
|
||
- campaign → Campaign (onDelete: Cascade)
|
||
- submittedByUser → User (onDelete: SetNull)
|
||
- upvotes → ResponseUpvote[]</p>
|
||
<h3 id="responseupvote">ResponseUpvote<a class="headerlink" href="#responseupvote" title="Permanent link">¶</a></h3>
|
||
<p><strong>Table:</strong> <code>response_upvotes</code>
|
||
<strong>Description:</strong> Upvote tracking with deduplication by user ID and IP address.</p>
|
||
<table>
|
||
<thead>
|
||
<tr>
|
||
<th>Field</th>
|
||
<th>Type</th>
|
||
<th>Required</th>
|
||
<th>Default</th>
|
||
<th>Description</th>
|
||
</tr>
|
||
</thead>
|
||
<tbody>
|
||
<tr>
|
||
<td>id</td>
|
||
<td>String</td>
|
||
<td>✓</td>
|
||
<td><code>cuid()</code></td>
|
||
<td>Primary key</td>
|
||
</tr>
|
||
<tr>
|
||
<td>responseId</td>
|
||
<td>String</td>
|
||
<td>✓</td>
|
||
<td>—</td>
|
||
<td>Foreign key to RepresentativeResponse</td>
|
||
</tr>
|
||
<tr>
|
||
<td>userId</td>
|
||
<td>String</td>
|
||
<td>✗</td>
|
||
<td><code>null</code></td>
|
||
<td>Foreign key to User</td>
|
||
</tr>
|
||
<tr>
|
||
<td>userEmail</td>
|
||
<td>String</td>
|
||
<td>✗</td>
|
||
<td><code>null</code></td>
|
||
<td>User email (for guest upvotes)</td>
|
||
</tr>
|
||
<tr>
|
||
<td>upvotedIp</td>
|
||
<td>String</td>
|
||
<td>✗</td>
|
||
<td><code>null</code></td>
|
||
<td>Upvoter IP address</td>
|
||
</tr>
|
||
</tbody>
|
||
</table>
|
||
<p><strong>Indexes:</strong>
|
||
- Unique: <code>[responseId, userId]</code> (prevent duplicate upvotes from logged-in users)
|
||
- Unique: <code>[responseId, upvotedIp]</code> (prevent duplicate upvotes from same IP)</p>
|
||
<p><strong>Relations:</strong>
|
||
- response → RepresentativeResponse (onDelete: Cascade)
|
||
- user → User (onDelete: SetNull)</p>
|
||
<h3 id="customrecipient">CustomRecipient<a class="headerlink" href="#customrecipient" title="Permanent link">¶</a></h3>
|
||
<p><strong>Table:</strong> <code>custom_recipients</code>
|
||
<strong>Description:</strong> Custom email targets for campaigns (when allowCustomRecipients enabled).</p>
|
||
<table>
|
||
<thead>
|
||
<tr>
|
||
<th>Field</th>
|
||
<th>Type</th>
|
||
<th>Required</th>
|
||
<th>Default</th>
|
||
<th>Description</th>
|
||
</tr>
|
||
</thead>
|
||
<tbody>
|
||
<tr>
|
||
<td>id</td>
|
||
<td>String</td>
|
||
<td>✓</td>
|
||
<td><code>cuid()</code></td>
|
||
<td>Primary key</td>
|
||
</tr>
|
||
<tr>
|
||
<td>campaignId</td>
|
||
<td>String</td>
|
||
<td>✓</td>
|
||
<td>—</td>
|
||
<td>Foreign key to Campaign</td>
|
||
</tr>
|
||
<tr>
|
||
<td>campaignSlug</td>
|
||
<td>String</td>
|
||
<td>✓</td>
|
||
<td>—</td>
|
||
<td>Denormalized campaign slug</td>
|
||
</tr>
|
||
<tr>
|
||
<td>recipientName</td>
|
||
<td>String</td>
|
||
<td>✓</td>
|
||
<td>—</td>
|
||
<td>Recipient name</td>
|
||
</tr>
|
||
<tr>
|
||
<td>recipientEmail</td>
|
||
<td>String</td>
|
||
<td>✓</td>
|
||
<td>—</td>
|
||
<td>Recipient email address</td>
|
||
</tr>
|
||
<tr>
|
||
<td>recipientTitle</td>
|
||
<td>String</td>
|
||
<td>✗</td>
|
||
<td><code>null</code></td>
|
||
<td>Recipient title</td>
|
||
</tr>
|
||
<tr>
|
||
<td>recipientOrganization</td>
|
||
<td>String</td>
|
||
<td>✗</td>
|
||
<td><code>null</code></td>
|
||
<td>Recipient organization</td>
|
||
</tr>
|
||
<tr>
|
||
<td>notes</td>
|
||
<td>String</td>
|
||
<td>✗</td>
|
||
<td><code>null</code></td>
|
||
<td>Admin notes (long text)</td>
|
||
</tr>
|
||
<tr>
|
||
<td>isActive</td>
|
||
<td>Boolean</td>
|
||
<td>✓</td>
|
||
<td><code>true</code></td>
|
||
<td>Active status</td>
|
||
</tr>
|
||
<tr>
|
||
<td>createdAt</td>
|
||
<td>DateTime</td>
|
||
<td>✓</td>
|
||
<td><code>now()</code></td>
|
||
<td>Creation timestamp</td>
|
||
</tr>
|
||
<tr>
|
||
<td>updatedAt</td>
|
||
<td>DateTime</td>
|
||
<td>✓</td>
|
||
<td>Auto</td>
|
||
<td>Last update timestamp</td>
|
||
</tr>
|
||
</tbody>
|
||
</table>
|
||
<p><strong>Indexes:</strong>
|
||
- Foreign key: <code>campaignId</code></p>
|
||
<p><strong>Relations:</strong>
|
||
- campaign → Campaign (onDelete: Cascade)</p>
|
||
<h3 id="postalcodecache">PostalCodeCache<a class="headerlink" href="#postalcodecache" title="Permanent link">¶</a></h3>
|
||
<p><strong>Table:</strong> <code>postal_code_cache</code>
|
||
<strong>Description:</strong> Postal code geocoding cache for centroid lookups.</p>
|
||
<table>
|
||
<thead>
|
||
<tr>
|
||
<th>Field</th>
|
||
<th>Type</th>
|
||
<th>Required</th>
|
||
<th>Default</th>
|
||
<th>Description</th>
|
||
</tr>
|
||
</thead>
|
||
<tbody>
|
||
<tr>
|
||
<td>id</td>
|
||
<td>String</td>
|
||
<td>✓</td>
|
||
<td><code>cuid()</code></td>
|
||
<td>Primary key</td>
|
||
</tr>
|
||
<tr>
|
||
<td>postalCode</td>
|
||
<td>String</td>
|
||
<td>✓</td>
|
||
<td>—</td>
|
||
<td>Canadian postal code (unique)</td>
|
||
</tr>
|
||
<tr>
|
||
<td>city</td>
|
||
<td>String</td>
|
||
<td>✗</td>
|
||
<td><code>null</code></td>
|
||
<td>City name</td>
|
||
</tr>
|
||
<tr>
|
||
<td>province</td>
|
||
<td>String</td>
|
||
<td>✗</td>
|
||
<td><code>null</code></td>
|
||
<td>Province code (e.g., "AB")</td>
|
||
</tr>
|
||
<tr>
|
||
<td>centroidLat</td>
|
||
<td>Decimal(10,8)</td>
|
||
<td>✗</td>
|
||
<td><code>null</code></td>
|
||
<td>Centroid latitude</td>
|
||
</tr>
|
||
<tr>
|
||
<td>centroidLng</td>
|
||
<td>Decimal(11,8)</td>
|
||
<td>✗</td>
|
||
<td><code>null</code></td>
|
||
<td>Centroid longitude</td>
|
||
</tr>
|
||
<tr>
|
||
<td>lastUpdated</td>
|
||
<td>DateTime</td>
|
||
<td>✓</td>
|
||
<td><code>now()</code></td>
|
||
<td>Last cache update</td>
|
||
</tr>
|
||
</tbody>
|
||
</table>
|
||
<p><strong>Indexes:</strong>
|
||
- Unique: <code>postalCode</code></p>
|
||
<p><strong>Relations:</strong> None (standalone cache)</p>
|
||
<h3 id="emaillog">EmailLog<a class="headerlink" href="#emaillog" title="Permanent link">¶</a></h3>
|
||
<p><strong>Table:</strong> <code>email_logs</code>
|
||
<strong>Description:</strong> Global email audit trail (all email types).</p>
|
||
<table>
|
||
<thead>
|
||
<tr>
|
||
<th>Field</th>
|
||
<th>Type</th>
|
||
<th>Required</th>
|
||
<th>Default</th>
|
||
<th>Description</th>
|
||
</tr>
|
||
</thead>
|
||
<tbody>
|
||
<tr>
|
||
<td>id</td>
|
||
<td>String</td>
|
||
<td>✓</td>
|
||
<td><code>cuid()</code></td>
|
||
<td>Primary key</td>
|
||
</tr>
|
||
<tr>
|
||
<td>recipientEmail</td>
|
||
<td>String</td>
|
||
<td>✓</td>
|
||
<td>—</td>
|
||
<td>Recipient email address</td>
|
||
</tr>
|
||
<tr>
|
||
<td>senderName</td>
|
||
<td>String</td>
|
||
<td>✓</td>
|
||
<td>—</td>
|
||
<td>Sender name</td>
|
||
</tr>
|
||
<tr>
|
||
<td>senderEmail</td>
|
||
<td>String</td>
|
||
<td>✓</td>
|
||
<td>—</td>
|
||
<td>Sender email address</td>
|
||
</tr>
|
||
<tr>
|
||
<td>subject</td>
|
||
<td>String</td>
|
||
<td>✗</td>
|
||
<td><code>null</code></td>
|
||
<td>Email subject line</td>
|
||
</tr>
|
||
<tr>
|
||
<td>message</td>
|
||
<td>String</td>
|
||
<td>✗</td>
|
||
<td><code>null</code></td>
|
||
<td>Email message body (long text)</td>
|
||
</tr>
|
||
<tr>
|
||
<td>postalCode</td>
|
||
<td>String</td>
|
||
<td>✗</td>
|
||
<td><code>null</code></td>
|
||
<td>Sender postal code</td>
|
||
</tr>
|
||
<tr>
|
||
<td>status</td>
|
||
<td>String</td>
|
||
<td>✓</td>
|
||
<td><code>"sent"</code></td>
|
||
<td>Status: sent, failed, previewed</td>
|
||
</tr>
|
||
<tr>
|
||
<td>senderIp</td>
|
||
<td>String</td>
|
||
<td>✗</td>
|
||
<td><code>null</code></td>
|
||
<td>Sender IP address</td>
|
||
</tr>
|
||
<tr>
|
||
<td>sentAt</td>
|
||
<td>DateTime</td>
|
||
<td>✓</td>
|
||
<td><code>now()</code></td>
|
||
<td>Send timestamp</td>
|
||
</tr>
|
||
</tbody>
|
||
</table>
|
||
<p><strong>Indexes:</strong> None</p>
|
||
<p><strong>Relations:</strong> None (audit log only)</p>
|
||
<h3 id="emailverification">EmailVerification<a class="headerlink" href="#emailverification" title="Permanent link">¶</a></h3>
|
||
<p><strong>Table:</strong> <code>email_verifications</code>
|
||
<strong>Description:</strong> Email verification tokens for response wall submissions.</p>
|
||
<table>
|
||
<thead>
|
||
<tr>
|
||
<th>Field</th>
|
||
<th>Type</th>
|
||
<th>Required</th>
|
||
<th>Default</th>
|
||
<th>Description</th>
|
||
</tr>
|
||
</thead>
|
||
<tbody>
|
||
<tr>
|
||
<td>id</td>
|
||
<td>String</td>
|
||
<td>✓</td>
|
||
<td><code>cuid()</code></td>
|
||
<td>Primary key</td>
|
||
</tr>
|
||
<tr>
|
||
<td>token</td>
|
||
<td>String</td>
|
||
<td>✓</td>
|
||
<td>—</td>
|
||
<td>Verification token (unique)</td>
|
||
</tr>
|
||
<tr>
|
||
<td>email</td>
|
||
<td>String</td>
|
||
<td>✓</td>
|
||
<td>—</td>
|
||
<td>Email address to verify</td>
|
||
</tr>
|
||
<tr>
|
||
<td>tempCampaignData</td>
|
||
<td>String</td>
|
||
<td>✗</td>
|
||
<td><code>null</code></td>
|
||
<td>Temporary campaign data JSON (long text)</td>
|
||
</tr>
|
||
<tr>
|
||
<td>createdAt</td>
|
||
<td>DateTime</td>
|
||
<td>✓</td>
|
||
<td><code>now()</code></td>
|
||
<td>Creation timestamp</td>
|
||
</tr>
|
||
<tr>
|
||
<td>expiresAt</td>
|
||
<td>DateTime</td>
|
||
<td>✓</td>
|
||
<td>—</td>
|
||
<td>Token expiration timestamp</td>
|
||
</tr>
|
||
<tr>
|
||
<td>used</td>
|
||
<td>Boolean</td>
|
||
<td>✓</td>
|
||
<td><code>false</code></td>
|
||
<td>Token used flag</td>
|
||
</tr>
|
||
</tbody>
|
||
</table>
|
||
<p><strong>Indexes:</strong>
|
||
- Unique: <code>token</code></p>
|
||
<p><strong>Relations:</strong> None (standalone)</p>
|
||
<h3 id="call">Call<a class="headerlink" href="#call" title="Permanent link">¶</a></h3>
|
||
<p><strong>Table:</strong> <code>calls</code>
|
||
<strong>Description:</strong> Phone call tracking for advocacy campaigns.</p>
|
||
<table>
|
||
<thead>
|
||
<tr>
|
||
<th>Field</th>
|
||
<th>Type</th>
|
||
<th>Required</th>
|
||
<th>Default</th>
|
||
<th>Description</th>
|
||
</tr>
|
||
</thead>
|
||
<tbody>
|
||
<tr>
|
||
<td>id</td>
|
||
<td>String</td>
|
||
<td>✓</td>
|
||
<td><code>cuid()</code></td>
|
||
<td>Primary key</td>
|
||
</tr>
|
||
<tr>
|
||
<td>representativeName</td>
|
||
<td>String</td>
|
||
<td>✓</td>
|
||
<td>—</td>
|
||
<td>Representative name</td>
|
||
</tr>
|
||
<tr>
|
||
<td>representativeTitle</td>
|
||
<td>String</td>
|
||
<td>✗</td>
|
||
<td><code>null</code></td>
|
||
<td>Representative title</td>
|
||
</tr>
|
||
<tr>
|
||
<td>phoneNumber</td>
|
||
<td>String</td>
|
||
<td>✓</td>
|
||
<td>—</td>
|
||
<td>Phone number called</td>
|
||
</tr>
|
||
<tr>
|
||
<td>officeType</td>
|
||
<td>String</td>
|
||
<td>✗</td>
|
||
<td><code>null</code></td>
|
||
<td>Office type (constituency, legislative, etc.)</td>
|
||
</tr>
|
||
<tr>
|
||
<td>callerName</td>
|
||
<td>String</td>
|
||
<td>✗</td>
|
||
<td><code>null</code></td>
|
||
<td>Caller name</td>
|
||
</tr>
|
||
<tr>
|
||
<td>callerEmail</td>
|
||
<td>String</td>
|
||
<td>✗</td>
|
||
<td><code>null</code></td>
|
||
<td>Caller email</td>
|
||
</tr>
|
||
<tr>
|
||
<td>postalCode</td>
|
||
<td>String</td>
|
||
<td>✗</td>
|
||
<td><code>null</code></td>
|
||
<td>Caller postal code</td>
|
||
</tr>
|
||
<tr>
|
||
<td>campaignId</td>
|
||
<td>String</td>
|
||
<td>✗</td>
|
||
<td><code>null</code></td>
|
||
<td>Foreign key to Campaign</td>
|
||
</tr>
|
||
<tr>
|
||
<td>campaignSlug</td>
|
||
<td>String</td>
|
||
<td>✗</td>
|
||
<td><code>null</code></td>
|
||
<td>Denormalized campaign slug</td>
|
||
</tr>
|
||
<tr>
|
||
<td>callerIp</td>
|
||
<td>String</td>
|
||
<td>✗</td>
|
||
<td><code>null</code></td>
|
||
<td>Caller IP address</td>
|
||
</tr>
|
||
<tr>
|
||
<td>calledAt</td>
|
||
<td>DateTime</td>
|
||
<td>✓</td>
|
||
<td><code>now()</code></td>
|
||
<td>Call timestamp</td>
|
||
</tr>
|
||
</tbody>
|
||
</table>
|
||
<p><strong>Indexes:</strong>
|
||
- Foreign key: <code>campaignId</code></p>
|
||
<p><strong>Relations:</strong>
|
||
- campaign → Campaign (onDelete: SetNull)</p>
|
||
<hr />
|
||
<h2 id="map-locations">Map — Locations<a class="headerlink" href="#map-locations" title="Permanent link">¶</a></h2>
|
||
<h3 id="location">Location<a class="headerlink" href="#location" title="Permanent link">¶</a></h3>
|
||
<p><strong>Table:</strong> <code>locations</code>
|
||
<strong>Description:</strong> Building-level address data with geocoding and NAR integration.</p>
|
||
<table>
|
||
<thead>
|
||
<tr>
|
||
<th>Field</th>
|
||
<th>Type</th>
|
||
<th>Required</th>
|
||
<th>Default</th>
|
||
<th>Description</th>
|
||
</tr>
|
||
</thead>
|
||
<tbody>
|
||
<tr>
|
||
<td>id</td>
|
||
<td>String</td>
|
||
<td>✓</td>
|
||
<td><code>cuid()</code></td>
|
||
<td>Primary key</td>
|
||
</tr>
|
||
<tr>
|
||
<td>latitude</td>
|
||
<td>Decimal(10,8)</td>
|
||
<td>✓</td>
|
||
<td>—</td>
|
||
<td>Latitude coordinate (required)</td>
|
||
</tr>
|
||
<tr>
|
||
<td>longitude</td>
|
||
<td>Decimal(11,8)</td>
|
||
<td>✓</td>
|
||
<td>—</td>
|
||
<td>Longitude coordinate (required)</td>
|
||
</tr>
|
||
<tr>
|
||
<td>address</td>
|
||
<td>String</td>
|
||
<td>✓</td>
|
||
<td>—</td>
|
||
<td>Base street address (no unit number)</td>
|
||
</tr>
|
||
<tr>
|
||
<td>postalCode</td>
|
||
<td>String</td>
|
||
<td>✗</td>
|
||
<td><code>null</code></td>
|
||
<td>Canadian postal code</td>
|
||
</tr>
|
||
<tr>
|
||
<td>province</td>
|
||
<td>String</td>
|
||
<td>✗</td>
|
||
<td><code>null</code></td>
|
||
<td>Province code (e.g., "AB")</td>
|
||
</tr>
|
||
<tr>
|
||
<td>federalDistrict</td>
|
||
<td>String</td>
|
||
<td>✗</td>
|
||
<td><code>null</code></td>
|
||
<td>Federal electoral district name</td>
|
||
</tr>
|
||
<tr>
|
||
<td>buildingUse</td>
|
||
<td>Int</td>
|
||
<td>✗</td>
|
||
<td><code>null</code></td>
|
||
<td>NAR BU_USE: 1=Residential, 2=Partial, 3=Non-Residential, 4=Unknown</td>
|
||
</tr>
|
||
<tr>
|
||
<td>locGuid</td>
|
||
<td>String</td>
|
||
<td>✗</td>
|
||
<td><code>null</code></td>
|
||
<td>NAR LOC_GUID (unique)</td>
|
||
</tr>
|
||
<tr>
|
||
<td>buildingType</td>
|
||
<td>BuildingType</td>
|
||
<td>✓</td>
|
||
<td><code>SINGLE_FAMILY</code></td>
|
||
<td>Type: SINGLE_FAMILY, MULTI_UNIT, MIXED_USE, COMMERCIAL</td>
|
||
</tr>
|
||
<tr>
|
||
<td>totalUnits</td>
|
||
<td>Int</td>
|
||
<td>✓</td>
|
||
<td><code>1</code></td>
|
||
<td>Total units in building</td>
|
||
</tr>
|
||
<tr>
|
||
<td>buildingNotes</td>
|
||
<td>String</td>
|
||
<td>✗</td>
|
||
<td><code>null</code></td>
|
||
<td>Access codes, manager contact (long text)</td>
|
||
</tr>
|
||
<tr>
|
||
<td>geocodeConfidence</td>
|
||
<td>Int</td>
|
||
<td>✗</td>
|
||
<td><code>null</code></td>
|
||
<td>Geocoding confidence (0-100)</td>
|
||
</tr>
|
||
<tr>
|
||
<td>geocodeProvider</td>
|
||
<td>GeocodeProvider</td>
|
||
<td>✗</td>
|
||
<td><code>null</code></td>
|
||
<td>Provider: GOOGLE, MAPBOX, NOMINATIM, PHOTON, LOCATIONIQ, ARCGIS, UNKNOWN</td>
|
||
</tr>
|
||
<tr>
|
||
<td>createdByUserId</td>
|
||
<td>String</td>
|
||
<td>✗</td>
|
||
<td><code>null</code></td>
|
||
<td>Foreign key to User (creator)</td>
|
||
</tr>
|
||
<tr>
|
||
<td>updatedByUserId</td>
|
||
<td>String</td>
|
||
<td>✗</td>
|
||
<td><code>null</code></td>
|
||
<td>Foreign key to User (last updater)</td>
|
||
</tr>
|
||
<tr>
|
||
<td>createdAt</td>
|
||
<td>DateTime</td>
|
||
<td>✓</td>
|
||
<td><code>now()</code></td>
|
||
<td>Creation timestamp</td>
|
||
</tr>
|
||
<tr>
|
||
<td>updatedAt</td>
|
||
<td>DateTime</td>
|
||
<td>✓</td>
|
||
<td>Auto</td>
|
||
<td>Last update timestamp</td>
|
||
</tr>
|
||
</tbody>
|
||
</table>
|
||
<p><strong>Indexes:</strong>
|
||
- Unique: <code>locGuid</code>
|
||
- Composite: <code>[latitude, longitude]</code> (spatial queries)
|
||
- Non-unique: <code>postalCode</code></p>
|
||
<p><strong>Relations:</strong>
|
||
- createdByUser → User (onDelete: SetNull)
|
||
- updatedByUser → User (onDelete: SetNull)
|
||
- addresses → Address[]
|
||
- history → LocationHistory[]</p>
|
||
<h3 id="address">Address<a class="headerlink" href="#address" title="Permanent link">¶</a></h3>
|
||
<p><strong>Table:</strong> <code>addresses</code>
|
||
<strong>Description:</strong> Unit-level data with support levels and canvassing information.</p>
|
||
<table>
|
||
<thead>
|
||
<tr>
|
||
<th>Field</th>
|
||
<th>Type</th>
|
||
<th>Required</th>
|
||
<th>Default</th>
|
||
<th>Description</th>
|
||
</tr>
|
||
</thead>
|
||
<tbody>
|
||
<tr>
|
||
<td>id</td>
|
||
<td>String</td>
|
||
<td>✓</td>
|
||
<td><code>cuid()</code></td>
|
||
<td>Primary key</td>
|
||
</tr>
|
||
<tr>
|
||
<td>locationId</td>
|
||
<td>String</td>
|
||
<td>✓</td>
|
||
<td>—</td>
|
||
<td>Foreign key to Location</td>
|
||
</tr>
|
||
<tr>
|
||
<td>unitNumber</td>
|
||
<td>String</td>
|
||
<td>✗</td>
|
||
<td><code>null</code></td>
|
||
<td>Unit/apartment number</td>
|
||
</tr>
|
||
<tr>
|
||
<td>addrGuid</td>
|
||
<td>String</td>
|
||
<td>✗</td>
|
||
<td><code>null</code></td>
|
||
<td>NAR ADDR_GUID (unique)</td>
|
||
</tr>
|
||
<tr>
|
||
<td>firstName</td>
|
||
<td>String</td>
|
||
<td>✗</td>
|
||
<td><code>null</code></td>
|
||
<td>Occupant first name</td>
|
||
</tr>
|
||
<tr>
|
||
<td>lastName</td>
|
||
<td>String</td>
|
||
<td>✗</td>
|
||
<td><code>null</code></td>
|
||
<td>Occupant last name</td>
|
||
</tr>
|
||
<tr>
|
||
<td>email</td>
|
||
<td>String</td>
|
||
<td>✗</td>
|
||
<td><code>null</code></td>
|
||
<td>Occupant email</td>
|
||
</tr>
|
||
<tr>
|
||
<td>phone</td>
|
||
<td>String</td>
|
||
<td>✗</td>
|
||
<td><code>null</code></td>
|
||
<td>Occupant phone</td>
|
||
</tr>
|
||
<tr>
|
||
<td>supportLevel</td>
|
||
<td>SupportLevel</td>
|
||
<td>✗</td>
|
||
<td><code>null</code></td>
|
||
<td>Support level: 1, 2, 3, 4</td>
|
||
</tr>
|
||
<tr>
|
||
<td>sign</td>
|
||
<td>Boolean</td>
|
||
<td>✓</td>
|
||
<td><code>false</code></td>
|
||
<td>Sign requested flag</td>
|
||
</tr>
|
||
<tr>
|
||
<td>signSize</td>
|
||
<td>String</td>
|
||
<td>✗</td>
|
||
<td><code>null</code></td>
|
||
<td>Sign size</td>
|
||
</tr>
|
||
<tr>
|
||
<td>notes</td>
|
||
<td>String</td>
|
||
<td>✗</td>
|
||
<td><code>null</code></td>
|
||
<td>Canvassing notes (long text)</td>
|
||
</tr>
|
||
<tr>
|
||
<td>createdByUserId</td>
|
||
<td>String</td>
|
||
<td>✗</td>
|
||
<td><code>null</code></td>
|
||
<td>Foreign key to User (creator)</td>
|
||
</tr>
|
||
<tr>
|
||
<td>updatedByUserId</td>
|
||
<td>String</td>
|
||
<td>✗</td>
|
||
<td><code>null</code></td>
|
||
<td>Foreign key to User (last updater)</td>
|
||
</tr>
|
||
<tr>
|
||
<td>createdAt</td>
|
||
<td>DateTime</td>
|
||
<td>✓</td>
|
||
<td><code>now()</code></td>
|
||
<td>Creation timestamp</td>
|
||
</tr>
|
||
<tr>
|
||
<td>updatedAt</td>
|
||
<td>DateTime</td>
|
||
<td>✓</td>
|
||
<td>Auto</td>
|
||
<td>Last update timestamp</td>
|
||
</tr>
|
||
</tbody>
|
||
</table>
|
||
<p><strong>Indexes:</strong>
|
||
- Unique: <code>addrGuid</code>
|
||
- Foreign key: <code>locationId</code>
|
||
- Composite: <code>[locationId, unitNumber]</code> (unit lookups)</p>
|
||
<p><strong>Relations:</strong>
|
||
- location → Location (onDelete: Cascade)
|
||
- createdByUser → User (onDelete: SetNull)
|
||
- updatedByUser → User (onDelete: SetNull)
|
||
- canvassVisits → CanvassVisit[]</p>
|
||
<h3 id="locationhistory">LocationHistory<a class="headerlink" href="#locationhistory" title="Permanent link">¶</a></h3>
|
||
<p><strong>Table:</strong> <code>location_history</code>
|
||
<strong>Description:</strong> Audit trail for location changes with action types.</p>
|
||
<table>
|
||
<thead>
|
||
<tr>
|
||
<th>Field</th>
|
||
<th>Type</th>
|
||
<th>Required</th>
|
||
<th>Default</th>
|
||
<th>Description</th>
|
||
</tr>
|
||
</thead>
|
||
<tbody>
|
||
<tr>
|
||
<td>id</td>
|
||
<td>String</td>
|
||
<td>✓</td>
|
||
<td><code>cuid()</code></td>
|
||
<td>Primary key</td>
|
||
</tr>
|
||
<tr>
|
||
<td>locationId</td>
|
||
<td>String</td>
|
||
<td>✓</td>
|
||
<td>—</td>
|
||
<td>Foreign key to Location</td>
|
||
</tr>
|
||
<tr>
|
||
<td>userId</td>
|
||
<td>String</td>
|
||
<td>✗</td>
|
||
<td><code>null</code></td>
|
||
<td>Foreign key to User</td>
|
||
</tr>
|
||
<tr>
|
||
<td>action</td>
|
||
<td>LocationHistoryAction</td>
|
||
<td>✓</td>
|
||
<td>—</td>
|
||
<td>Action: CREATED, UPDATED, GEOCODED, BULK_GEOCODED, MOVED_ON_MAP, IMPORTED_CSV, IMPORTED_NAR</td>
|
||
</tr>
|
||
<tr>
|
||
<td>field</td>
|
||
<td>String</td>
|
||
<td>✗</td>
|
||
<td><code>null</code></td>
|
||
<td>Field name that changed</td>
|
||
</tr>
|
||
<tr>
|
||
<td>oldValue</td>
|
||
<td>String</td>
|
||
<td>✗</td>
|
||
<td><code>null</code></td>
|
||
<td>Old value (long text)</td>
|
||
</tr>
|
||
<tr>
|
||
<td>newValue</td>
|
||
<td>String</td>
|
||
<td>✗</td>
|
||
<td><code>null</code></td>
|
||
<td>New value (long text)</td>
|
||
</tr>
|
||
<tr>
|
||
<td>metadata</td>
|
||
<td>Json</td>
|
||
<td>✗</td>
|
||
<td><code>null</code></td>
|
||
<td>Provider, confidence, etc.</td>
|
||
</tr>
|
||
<tr>
|
||
<td>createdAt</td>
|
||
<td>DateTime</td>
|
||
<td>✓</td>
|
||
<td><code>now()</code></td>
|
||
<td>Timestamp</td>
|
||
</tr>
|
||
</tbody>
|
||
</table>
|
||
<p><strong>Indexes:</strong>
|
||
- Foreign key: <code>locationId</code>
|
||
- Foreign key: <code>userId</code>
|
||
- Non-unique: <code>createdAt</code> (temporal queries)</p>
|
||
<p><strong>Relations:</strong>
|
||
- location → Location (onDelete: Cascade)
|
||
- user → User (onDelete: SetNull)</p>
|
||
<hr />
|
||
<h2 id="map-shifts-cuts">Map — Shifts & Cuts<a class="headerlink" href="#map-shifts-cuts" title="Permanent link">¶</a></h2>
|
||
<h3 id="shift">Shift<a class="headerlink" href="#shift" title="Permanent link">¶</a></h3>
|
||
<p><strong>Table:</strong> <code>shifts</code>
|
||
<strong>Description:</strong> Volunteer shifts with scheduling and capacity tracking.</p>
|
||
<table>
|
||
<thead>
|
||
<tr>
|
||
<th>Field</th>
|
||
<th>Type</th>
|
||
<th>Required</th>
|
||
<th>Default</th>
|
||
<th>Description</th>
|
||
</tr>
|
||
</thead>
|
||
<tbody>
|
||
<tr>
|
||
<td>id</td>
|
||
<td>String</td>
|
||
<td>✓</td>
|
||
<td><code>cuid()</code></td>
|
||
<td>Primary key</td>
|
||
</tr>
|
||
<tr>
|
||
<td>title</td>
|
||
<td>String</td>
|
||
<td>✓</td>
|
||
<td>—</td>
|
||
<td>Shift title</td>
|
||
</tr>
|
||
<tr>
|
||
<td>description</td>
|
||
<td>String</td>
|
||
<td>✗</td>
|
||
<td><code>null</code></td>
|
||
<td>Shift description (long text)</td>
|
||
</tr>
|
||
<tr>
|
||
<td>date</td>
|
||
<td>DateTime</td>
|
||
<td>✓</td>
|
||
<td>—</td>
|
||
<td>Shift date (date only, no time)</td>
|
||
</tr>
|
||
<tr>
|
||
<td>startTime</td>
|
||
<td>String</td>
|
||
<td>✓</td>
|
||
<td>—</td>
|
||
<td>Start time (HH:MM format)</td>
|
||
</tr>
|
||
<tr>
|
||
<td>endTime</td>
|
||
<td>String</td>
|
||
<td>✓</td>
|
||
<td>—</td>
|
||
<td>End time (HH:MM format)</td>
|
||
</tr>
|
||
<tr>
|
||
<td>location</td>
|
||
<td>String</td>
|
||
<td>✗</td>
|
||
<td><code>null</code></td>
|
||
<td>Shift location description</td>
|
||
</tr>
|
||
<tr>
|
||
<td>maxVolunteers</td>
|
||
<td>Int</td>
|
||
<td>✓</td>
|
||
<td>—</td>
|
||
<td>Maximum volunteer capacity</td>
|
||
</tr>
|
||
<tr>
|
||
<td>currentVolunteers</td>
|
||
<td>Int</td>
|
||
<td>✓</td>
|
||
<td><code>0</code></td>
|
||
<td>Current signup count</td>
|
||
</tr>
|
||
<tr>
|
||
<td>status</td>
|
||
<td>ShiftStatus</td>
|
||
<td>✓</td>
|
||
<td><code>OPEN</code></td>
|
||
<td>Status: OPEN, FULL, CANCELLED</td>
|
||
</tr>
|
||
<tr>
|
||
<td>isPublic</td>
|
||
<td>Boolean</td>
|
||
<td>✓</td>
|
||
<td><code>false</code></td>
|
||
<td>Public signup allowed</td>
|
||
</tr>
|
||
<tr>
|
||
<td>cutId</td>
|
||
<td>String</td>
|
||
<td>✗</td>
|
||
<td><code>null</code></td>
|
||
<td>Foreign key to Cut</td>
|
||
</tr>
|
||
<tr>
|
||
<td>createdBy</td>
|
||
<td>String</td>
|
||
<td>✗</td>
|
||
<td><code>null</code></td>
|
||
<td>Creator user ID (string, not FK)</td>
|
||
</tr>
|
||
<tr>
|
||
<td>createdAt</td>
|
||
<td>DateTime</td>
|
||
<td>✓</td>
|
||
<td><code>now()</code></td>
|
||
<td>Creation timestamp</td>
|
||
</tr>
|
||
<tr>
|
||
<td>updatedAt</td>
|
||
<td>DateTime</td>
|
||
<td>✓</td>
|
||
<td>Auto</td>
|
||
<td>Last update timestamp</td>
|
||
</tr>
|
||
</tbody>
|
||
</table>
|
||
<p><strong>Indexes:</strong>
|
||
- Foreign key: <code>cutId</code></p>
|
||
<p><strong>Relations:</strong>
|
||
- cut → Cut (onDelete: SetNull)
|
||
- signups → ShiftSignup[]
|
||
- canvassVisits → CanvassVisit[]
|
||
- canvassSessions → CanvassSession[]</p>
|
||
<h3 id="shiftsignup">ShiftSignup<a class="headerlink" href="#shiftsignup" title="Permanent link">¶</a></h3>
|
||
<p><strong>Table:</strong> <code>shift_signups</code>
|
||
<strong>Description:</strong> Shift signup tracking with source attribution.</p>
|
||
<table>
|
||
<thead>
|
||
<tr>
|
||
<th>Field</th>
|
||
<th>Type</th>
|
||
<th>Required</th>
|
||
<th>Default</th>
|
||
<th>Description</th>
|
||
</tr>
|
||
</thead>
|
||
<tbody>
|
||
<tr>
|
||
<td>id</td>
|
||
<td>String</td>
|
||
<td>✓</td>
|
||
<td><code>cuid()</code></td>
|
||
<td>Primary key</td>
|
||
</tr>
|
||
<tr>
|
||
<td>shiftId</td>
|
||
<td>String</td>
|
||
<td>✓</td>
|
||
<td>—</td>
|
||
<td>Foreign key to Shift</td>
|
||
</tr>
|
||
<tr>
|
||
<td>shiftTitle</td>
|
||
<td>String</td>
|
||
<td>✗</td>
|
||
<td><code>null</code></td>
|
||
<td>Denormalized shift title</td>
|
||
</tr>
|
||
<tr>
|
||
<td>userId</td>
|
||
<td>String</td>
|
||
<td>✗</td>
|
||
<td><code>null</code></td>
|
||
<td>Foreign key to User</td>
|
||
</tr>
|
||
<tr>
|
||
<td>userEmail</td>
|
||
<td>String</td>
|
||
<td>✓</td>
|
||
<td>—</td>
|
||
<td>User email (for guest signups)</td>
|
||
</tr>
|
||
<tr>
|
||
<td>userName</td>
|
||
<td>String</td>
|
||
<td>✗</td>
|
||
<td><code>null</code></td>
|
||
<td>User name</td>
|
||
</tr>
|
||
<tr>
|
||
<td>userPhone</td>
|
||
<td>String</td>
|
||
<td>✗</td>
|
||
<td><code>null</code></td>
|
||
<td>User phone</td>
|
||
</tr>
|
||
<tr>
|
||
<td>signupDate</td>
|
||
<td>DateTime</td>
|
||
<td>✓</td>
|
||
<td><code>now()</code></td>
|
||
<td>Signup timestamp</td>
|
||
</tr>
|
||
<tr>
|
||
<td>status</td>
|
||
<td>SignupStatus</td>
|
||
<td>✓</td>
|
||
<td><code>CONFIRMED</code></td>
|
||
<td>Status: CONFIRMED, CANCELLED</td>
|
||
</tr>
|
||
<tr>
|
||
<td>signupSource</td>
|
||
<td>SignupSource</td>
|
||
<td>✓</td>
|
||
<td><code>AUTHENTICATED</code></td>
|
||
<td>Source: AUTHENTICATED, PUBLIC, ADMIN</td>
|
||
</tr>
|
||
</tbody>
|
||
</table>
|
||
<p><strong>Indexes:</strong>
|
||
- Unique: <code>[shiftId, userEmail]</code> (prevent duplicate signups)
|
||
- Foreign key: <code>shiftId</code></p>
|
||
<p><strong>Relations:</strong>
|
||
- shift → Shift (onDelete: Cascade)
|
||
- user → User (onDelete: SetNull)</p>
|
||
<h3 id="cut">Cut<a class="headerlink" href="#cut" title="Permanent link">¶</a></h3>
|
||
<p><strong>Table:</strong> <code>cuts</code>
|
||
<strong>Description:</strong> GeoJSON polygon overlays for map filtering and canvassing.</p>
|
||
<table>
|
||
<thead>
|
||
<tr>
|
||
<th>Field</th>
|
||
<th>Type</th>
|
||
<th>Required</th>
|
||
<th>Default</th>
|
||
<th>Description</th>
|
||
</tr>
|
||
</thead>
|
||
<tbody>
|
||
<tr>
|
||
<td>id</td>
|
||
<td>String</td>
|
||
<td>✓</td>
|
||
<td><code>cuid()</code></td>
|
||
<td>Primary key</td>
|
||
</tr>
|
||
<tr>
|
||
<td>name</td>
|
||
<td>String</td>
|
||
<td>✓</td>
|
||
<td>—</td>
|
||
<td>Cut name</td>
|
||
</tr>
|
||
<tr>
|
||
<td>description</td>
|
||
<td>String</td>
|
||
<td>✗</td>
|
||
<td><code>null</code></td>
|
||
<td>Cut description (long text)</td>
|
||
</tr>
|
||
<tr>
|
||
<td>color</td>
|
||
<td>String</td>
|
||
<td>✓</td>
|
||
<td><code>"#3388ff"</code></td>
|
||
<td>Polygon fill color (hex)</td>
|
||
</tr>
|
||
<tr>
|
||
<td>opacity</td>
|
||
<td>Decimal(3,2)</td>
|
||
<td>✓</td>
|
||
<td><code>0.3</code></td>
|
||
<td>Polygon opacity (0.00-1.00)</td>
|
||
</tr>
|
||
<tr>
|
||
<td>category</td>
|
||
<td>CutCategory</td>
|
||
<td>✗</td>
|
||
<td><code>null</code></td>
|
||
<td>Category: CUSTOM, WARD, NEIGHBORHOOD, DISTRICT</td>
|
||
</tr>
|
||
<tr>
|
||
<td>isPublic</td>
|
||
<td>Boolean</td>
|
||
<td>✓</td>
|
||
<td><code>false</code></td>
|
||
<td>Public visibility flag</td>
|
||
</tr>
|
||
<tr>
|
||
<td>isOfficial</td>
|
||
<td>Boolean</td>
|
||
<td>✓</td>
|
||
<td><code>false</code></td>
|
||
<td>Official boundary flag</td>
|
||
</tr>
|
||
<tr>
|
||
<td>geojson</td>
|
||
<td>String</td>
|
||
<td>✓</td>
|
||
<td>—</td>
|
||
<td>GeoJSON polygon data (long text)</td>
|
||
</tr>
|
||
<tr>
|
||
<td>bounds</td>
|
||
<td>String</td>
|
||
<td>✗</td>
|
||
<td><code>null</code></td>
|
||
<td>Bounding box JSON (long text)</td>
|
||
</tr>
|
||
<tr>
|
||
<td>showLocations</td>
|
||
<td>Boolean</td>
|
||
<td>✓</td>
|
||
<td><code>true</code></td>
|
||
<td>Show locations on map</td>
|
||
</tr>
|
||
<tr>
|
||
<td>exportEnabled</td>
|
||
<td>Boolean</td>
|
||
<td>✓</td>
|
||
<td><code>true</code></td>
|
||
<td>Export enabled flag</td>
|
||
</tr>
|
||
<tr>
|
||
<td>assignedTo</td>
|
||
<td>String</td>
|
||
<td>✗</td>
|
||
<td><code>null</code></td>
|
||
<td>Assigned user ID (string, not FK)</td>
|
||
</tr>
|
||
<tr>
|
||
<td>filterSettings</td>
|
||
<td>Json</td>
|
||
<td>✗</td>
|
||
<td><code>null</code></td>
|
||
<td>Filter configuration object</td>
|
||
</tr>
|
||
<tr>
|
||
<td>lastCanvassed</td>
|
||
<td>DateTime</td>
|
||
<td>✗</td>
|
||
<td><code>null</code></td>
|
||
<td>Last canvass timestamp</td>
|
||
</tr>
|
||
<tr>
|
||
<td>completionPercentage</td>
|
||
<td>Int</td>
|
||
<td>✓</td>
|
||
<td><code>0</code></td>
|
||
<td>Canvass completion percentage</td>
|
||
</tr>
|
||
<tr>
|
||
<td>createdByUserId</td>
|
||
<td>String</td>
|
||
<td>✗</td>
|
||
<td><code>null</code></td>
|
||
<td>Foreign key to User (creator)</td>
|
||
</tr>
|
||
<tr>
|
||
<td>createdAt</td>
|
||
<td>DateTime</td>
|
||
<td>✓</td>
|
||
<td><code>now()</code></td>
|
||
<td>Creation timestamp</td>
|
||
</tr>
|
||
<tr>
|
||
<td>updatedAt</td>
|
||
<td>DateTime</td>
|
||
<td>✓</td>
|
||
<td>Auto</td>
|
||
<td>Last update timestamp</td>
|
||
</tr>
|
||
</tbody>
|
||
</table>
|
||
<p><strong>Indexes:</strong> None</p>
|
||
<p><strong>Relations:</strong>
|
||
- createdByUser → User (onDelete: SetNull)
|
||
- shifts → Shift[]
|
||
- canvassSessions → CanvassSession[]</p>
|
||
<h3 id="mapsettings">MapSettings<a class="headerlink" href="#mapsettings" title="Permanent link">¶</a></h3>
|
||
<p><strong>Table:</strong> <code>map_settings</code>
|
||
<strong>Description:</strong> Singleton for map center/zoom and walk sheet configuration.</p>
|
||
<table>
|
||
<thead>
|
||
<tr>
|
||
<th>Field</th>
|
||
<th>Type</th>
|
||
<th>Required</th>
|
||
<th>Default</th>
|
||
<th>Description</th>
|
||
</tr>
|
||
</thead>
|
||
<tbody>
|
||
<tr>
|
||
<td>id</td>
|
||
<td>String</td>
|
||
<td>✓</td>
|
||
<td><code>cuid()</code></td>
|
||
<td>Primary key (always "default")</td>
|
||
</tr>
|
||
<tr>
|
||
<td>latitude</td>
|
||
<td>Decimal(10,8)</td>
|
||
<td>✗</td>
|
||
<td><code>null</code></td>
|
||
<td>Map center latitude</td>
|
||
</tr>
|
||
<tr>
|
||
<td>longitude</td>
|
||
<td>Decimal(11,8)</td>
|
||
<td>✗</td>
|
||
<td><code>null</code></td>
|
||
<td>Map center longitude</td>
|
||
</tr>
|
||
<tr>
|
||
<td>zoom</td>
|
||
<td>Int</td>
|
||
<td>✗</td>
|
||
<td><code>null</code></td>
|
||
<td>Default map zoom level</td>
|
||
</tr>
|
||
<tr>
|
||
<td>walkSheetTitle</td>
|
||
<td>String</td>
|
||
<td>✗</td>
|
||
<td><code>null</code></td>
|
||
<td>Walk sheet header title</td>
|
||
</tr>
|
||
<tr>
|
||
<td>walkSheetSubtitle</td>
|
||
<td>String</td>
|
||
<td>✗</td>
|
||
<td><code>null</code></td>
|
||
<td>Walk sheet header subtitle</td>
|
||
</tr>
|
||
<tr>
|
||
<td>walkSheetFooter</td>
|
||
<td>String</td>
|
||
<td>✗</td>
|
||
<td><code>null</code></td>
|
||
<td>Walk sheet footer text (long text)</td>
|
||
</tr>
|
||
<tr>
|
||
<td>qrCode1Url</td>
|
||
<td>String</td>
|
||
<td>✗</td>
|
||
<td><code>null</code></td>
|
||
<td>QR code 1 URL</td>
|
||
</tr>
|
||
<tr>
|
||
<td>qrCode1Label</td>
|
||
<td>String</td>
|
||
<td>✗</td>
|
||
<td><code>null</code></td>
|
||
<td>QR code 1 label</td>
|
||
</tr>
|
||
<tr>
|
||
<td>qrCode2Url</td>
|
||
<td>String</td>
|
||
<td>✗</td>
|
||
<td><code>null</code></td>
|
||
<td>QR code 2 URL</td>
|
||
</tr>
|
||
<tr>
|
||
<td>qrCode2Label</td>
|
||
<td>String</td>
|
||
<td>✗</td>
|
||
<td><code>null</code></td>
|
||
<td>QR code 2 label</td>
|
||
</tr>
|
||
<tr>
|
||
<td>qrCode3Url</td>
|
||
<td>String</td>
|
||
<td>✗</td>
|
||
<td><code>null</code></td>
|
||
<td>QR code 3 URL</td>
|
||
</tr>
|
||
<tr>
|
||
<td>qrCode3Label</td>
|
||
<td>String</td>
|
||
<td>✗</td>
|
||
<td><code>null</code></td>
|
||
<td>QR code 3 label</td>
|
||
</tr>
|
||
<tr>
|
||
<td>createdBy</td>
|
||
<td>String</td>
|
||
<td>✗</td>
|
||
<td><code>null</code></td>
|
||
<td>Creator user ID (string, not FK)</td>
|
||
</tr>
|
||
<tr>
|
||
<td>createdAt</td>
|
||
<td>DateTime</td>
|
||
<td>✓</td>
|
||
<td><code>now()</code></td>
|
||
<td>Creation timestamp</td>
|
||
</tr>
|
||
<tr>
|
||
<td>updatedAt</td>
|
||
<td>DateTime</td>
|
||
<td>✓</td>
|
||
<td>Auto</td>
|
||
<td>Last update timestamp</td>
|
||
</tr>
|
||
</tbody>
|
||
</table>
|
||
<p><strong>Indexes:</strong> None</p>
|
||
<p><strong>Relations:</strong> None (singleton)</p>
|
||
<hr />
|
||
<h2 id="canvassing">Canvassing<a class="headerlink" href="#canvassing" title="Permanent link">¶</a></h2>
|
||
<h3 id="canvasssession">CanvassSession<a class="headerlink" href="#canvasssession" title="Permanent link">¶</a></h3>
|
||
<p><strong>Table:</strong> <code>canvass_sessions</code>
|
||
<strong>Description:</strong> Canvassing session lifecycle with status tracking.</p>
|
||
<table>
|
||
<thead>
|
||
<tr>
|
||
<th>Field</th>
|
||
<th>Type</th>
|
||
<th>Required</th>
|
||
<th>Default</th>
|
||
<th>Description</th>
|
||
</tr>
|
||
</thead>
|
||
<tbody>
|
||
<tr>
|
||
<td>id</td>
|
||
<td>String</td>
|
||
<td>✓</td>
|
||
<td><code>cuid()</code></td>
|
||
<td>Primary key</td>
|
||
</tr>
|
||
<tr>
|
||
<td>userId</td>
|
||
<td>String</td>
|
||
<td>✓</td>
|
||
<td>—</td>
|
||
<td>Foreign key to User</td>
|
||
</tr>
|
||
<tr>
|
||
<td>cutId</td>
|
||
<td>String</td>
|
||
<td>✓</td>
|
||
<td>—</td>
|
||
<td>Foreign key to Cut</td>
|
||
</tr>
|
||
<tr>
|
||
<td>shiftId</td>
|
||
<td>String</td>
|
||
<td>✗</td>
|
||
<td><code>null</code></td>
|
||
<td>Foreign key to Shift</td>
|
||
</tr>
|
||
<tr>
|
||
<td>status</td>
|
||
<td>CanvassSessionStatus</td>
|
||
<td>✓</td>
|
||
<td><code>ACTIVE</code></td>
|
||
<td>Status: ACTIVE, COMPLETED, ABANDONED</td>
|
||
</tr>
|
||
<tr>
|
||
<td>startedAt</td>
|
||
<td>DateTime</td>
|
||
<td>✓</td>
|
||
<td><code>now()</code></td>
|
||
<td>Session start timestamp</td>
|
||
</tr>
|
||
<tr>
|
||
<td>endedAt</td>
|
||
<td>DateTime</td>
|
||
<td>✗</td>
|
||
<td><code>null</code></td>
|
||
<td>Session end timestamp</td>
|
||
</tr>
|
||
<tr>
|
||
<td>startLatitude</td>
|
||
<td>Decimal(10,8)</td>
|
||
<td>✗</td>
|
||
<td><code>null</code></td>
|
||
<td>Starting latitude</td>
|
||
</tr>
|
||
<tr>
|
||
<td>startLongitude</td>
|
||
<td>Decimal(11,8)</td>
|
||
<td>✗</td>
|
||
<td><code>null</code></td>
|
||
<td>Starting longitude</td>
|
||
</tr>
|
||
</tbody>
|
||
</table>
|
||
<p><strong>Indexes:</strong>
|
||
- Foreign key: <code>userId</code>
|
||
- Foreign key: <code>cutId</code>
|
||
- Foreign key: <code>shiftId</code></p>
|
||
<p><strong>Relations:</strong>
|
||
- user → User (onDelete: Cascade)
|
||
- cut → Cut (onDelete: Cascade)
|
||
- shift → Shift (onDelete: SetNull)
|
||
- visits → CanvassVisit[]
|
||
- trackingSession → TrackingSession (one-to-one)</p>
|
||
<h3 id="canvassvisit">CanvassVisit<a class="headerlink" href="#canvassvisit" title="Permanent link">¶</a></h3>
|
||
<p><strong>Table:</strong> <code>canvass_visits</code>
|
||
<strong>Description:</strong> Visit recording with outcome tracking.</p>
|
||
<table>
|
||
<thead>
|
||
<tr>
|
||
<th>Field</th>
|
||
<th>Type</th>
|
||
<th>Required</th>
|
||
<th>Default</th>
|
||
<th>Description</th>
|
||
</tr>
|
||
</thead>
|
||
<tbody>
|
||
<tr>
|
||
<td>id</td>
|
||
<td>String</td>
|
||
<td>✓</td>
|
||
<td><code>cuid()</code></td>
|
||
<td>Primary key</td>
|
||
</tr>
|
||
<tr>
|
||
<td>addressId</td>
|
||
<td>String</td>
|
||
<td>✓</td>
|
||
<td>—</td>
|
||
<td>Foreign key to Address</td>
|
||
</tr>
|
||
<tr>
|
||
<td>userId</td>
|
||
<td>String</td>
|
||
<td>✓</td>
|
||
<td>—</td>
|
||
<td>Foreign key to User</td>
|
||
</tr>
|
||
<tr>
|
||
<td>shiftId</td>
|
||
<td>String</td>
|
||
<td>✗</td>
|
||
<td><code>null</code></td>
|
||
<td>Foreign key to Shift</td>
|
||
</tr>
|
||
<tr>
|
||
<td>sessionId</td>
|
||
<td>String</td>
|
||
<td>✗</td>
|
||
<td><code>null</code></td>
|
||
<td>Foreign key to CanvassSession</td>
|
||
</tr>
|
||
<tr>
|
||
<td>outcome</td>
|
||
<td>VisitOutcome</td>
|
||
<td>✓</td>
|
||
<td>—</td>
|
||
<td>Outcome: NOT_HOME, REFUSED, MOVED, ALREADY_VOTED, SPOKE_WITH, LEFT_LITERATURE, COME_BACK_LATER</td>
|
||
</tr>
|
||
<tr>
|
||
<td>supportLevel</td>
|
||
<td>SupportLevel</td>
|
||
<td>✗</td>
|
||
<td><code>null</code></td>
|
||
<td>Support level: 1, 2, 3, 4</td>
|
||
</tr>
|
||
<tr>
|
||
<td>signRequested</td>
|
||
<td>Boolean</td>
|
||
<td>✓</td>
|
||
<td><code>false</code></td>
|
||
<td>Sign requested flag</td>
|
||
</tr>
|
||
<tr>
|
||
<td>signSize</td>
|
||
<td>String</td>
|
||
<td>✗</td>
|
||
<td><code>null</code></td>
|
||
<td>Sign size</td>
|
||
</tr>
|
||
<tr>
|
||
<td>notes</td>
|
||
<td>String</td>
|
||
<td>✗</td>
|
||
<td><code>null</code></td>
|
||
<td>Visit notes (long text)</td>
|
||
</tr>
|
||
<tr>
|
||
<td>durationSeconds</td>
|
||
<td>Int</td>
|
||
<td>✗</td>
|
||
<td><code>null</code></td>
|
||
<td>Visit duration in seconds</td>
|
||
</tr>
|
||
<tr>
|
||
<td>visitedAt</td>
|
||
<td>DateTime</td>
|
||
<td>✓</td>
|
||
<td><code>now()</code></td>
|
||
<td>Visit timestamp</td>
|
||
</tr>
|
||
</tbody>
|
||
</table>
|
||
<p><strong>Indexes:</strong>
|
||
- Foreign key: <code>addressId</code>
|
||
- Foreign key: <code>userId</code>
|
||
- Foreign key: <code>shiftId</code>
|
||
- Foreign key: <code>sessionId</code>
|
||
- Non-unique: <code>visitedAt</code> (temporal queries)</p>
|
||
<p><strong>Relations:</strong>
|
||
- address → Address (onDelete: Cascade)
|
||
- user → User (onDelete: Cascade)
|
||
- shift → Shift (onDelete: SetNull)
|
||
- session → CanvassSession (onDelete: SetNull)</p>
|
||
<h3 id="trackingsession">TrackingSession<a class="headerlink" href="#trackingsession" title="Permanent link">¶</a></h3>
|
||
<p><strong>Table:</strong> <code>tracking_sessions</code>
|
||
<strong>Description:</strong> GPS tracking sessions with distance calculation.</p>
|
||
<table>
|
||
<thead>
|
||
<tr>
|
||
<th>Field</th>
|
||
<th>Type</th>
|
||
<th>Required</th>
|
||
<th>Default</th>
|
||
<th>Description</th>
|
||
</tr>
|
||
</thead>
|
||
<tbody>
|
||
<tr>
|
||
<td>id</td>
|
||
<td>String</td>
|
||
<td>✓</td>
|
||
<td><code>cuid()</code></td>
|
||
<td>Primary key</td>
|
||
</tr>
|
||
<tr>
|
||
<td>userId</td>
|
||
<td>String</td>
|
||
<td>✓</td>
|
||
<td>—</td>
|
||
<td>Foreign key to User</td>
|
||
</tr>
|
||
<tr>
|
||
<td>canvassSessionId</td>
|
||
<td>String</td>
|
||
<td>✗</td>
|
||
<td><code>null</code></td>
|
||
<td>Foreign key to CanvassSession (unique, one-to-one)</td>
|
||
</tr>
|
||
<tr>
|
||
<td>startedAt</td>
|
||
<td>DateTime</td>
|
||
<td>✓</td>
|
||
<td><code>now()</code></td>
|
||
<td>Tracking start timestamp</td>
|
||
</tr>
|
||
<tr>
|
||
<td>endedAt</td>
|
||
<td>DateTime</td>
|
||
<td>✗</td>
|
||
<td><code>null</code></td>
|
||
<td>Tracking end timestamp</td>
|
||
</tr>
|
||
<tr>
|
||
<td>isActive</td>
|
||
<td>Boolean</td>
|
||
<td>✓</td>
|
||
<td><code>true</code></td>
|
||
<td>Active tracking flag</td>
|
||
</tr>
|
||
<tr>
|
||
<td>totalPoints</td>
|
||
<td>Int</td>
|
||
<td>✓</td>
|
||
<td><code>0</code></td>
|
||
<td>Total GPS points recorded</td>
|
||
</tr>
|
||
<tr>
|
||
<td>totalDistanceM</td>
|
||
<td>Float</td>
|
||
<td>✓</td>
|
||
<td><code>0</code></td>
|
||
<td>Total distance in meters</td>
|
||
</tr>
|
||
<tr>
|
||
<td>lastLatitude</td>
|
||
<td>Decimal(10,8)</td>
|
||
<td>✗</td>
|
||
<td><code>null</code></td>
|
||
<td>Last recorded latitude</td>
|
||
</tr>
|
||
<tr>
|
||
<td>lastLongitude</td>
|
||
<td>Decimal(11,8)</td>
|
||
<td>✗</td>
|
||
<td><code>null</code></td>
|
||
<td>Last recorded longitude</td>
|
||
</tr>
|
||
<tr>
|
||
<td>lastRecordedAt</td>
|
||
<td>DateTime</td>
|
||
<td>✗</td>
|
||
<td><code>null</code></td>
|
||
<td>Last GPS point timestamp</td>
|
||
</tr>
|
||
</tbody>
|
||
</table>
|
||
<p><strong>Indexes:</strong>
|
||
- Unique: <code>canvassSessionId</code>
|
||
- Foreign key: <code>userId</code>
|
||
- Non-unique: <code>isActive</code>
|
||
- Composite: <code>[isActive, lastRecordedAt]</code> (cleanup queries)</p>
|
||
<p><strong>Relations:</strong>
|
||
- user → User (onDelete: Cascade)
|
||
- canvassSession → CanvassSession (onDelete: SetNull)
|
||
- trackPoints → TrackPoint[]</p>
|
||
<h3 id="trackpoint">TrackPoint<a class="headerlink" href="#trackpoint" title="Permanent link">¶</a></h3>
|
||
<p><strong>Table:</strong> <code>track_points</code>
|
||
<strong>Description:</strong> GPS breadcrumb trail with event types.</p>
|
||
<table>
|
||
<thead>
|
||
<tr>
|
||
<th>Field</th>
|
||
<th>Type</th>
|
||
<th>Required</th>
|
||
<th>Default</th>
|
||
<th>Description</th>
|
||
</tr>
|
||
</thead>
|
||
<tbody>
|
||
<tr>
|
||
<td>id</td>
|
||
<td>String</td>
|
||
<td>✓</td>
|
||
<td><code>cuid()</code></td>
|
||
<td>Primary key</td>
|
||
</tr>
|
||
<tr>
|
||
<td>trackingSessionId</td>
|
||
<td>String</td>
|
||
<td>✓</td>
|
||
<td>—</td>
|
||
<td>Foreign key to TrackingSession</td>
|
||
</tr>
|
||
<tr>
|
||
<td>latitude</td>
|
||
<td>Decimal(10,8)</td>
|
||
<td>✓</td>
|
||
<td>—</td>
|
||
<td>GPS latitude</td>
|
||
</tr>
|
||
<tr>
|
||
<td>longitude</td>
|
||
<td>Decimal(11,8)</td>
|
||
<td>✓</td>
|
||
<td>—</td>
|
||
<td>GPS longitude</td>
|
||
</tr>
|
||
<tr>
|
||
<td>accuracy</td>
|
||
<td>Float</td>
|
||
<td>✗</td>
|
||
<td><code>null</code></td>
|
||
<td>GPS accuracy in meters</td>
|
||
</tr>
|
||
<tr>
|
||
<td>recordedAt</td>
|
||
<td>DateTime</td>
|
||
<td>✓</td>
|
||
<td><code>now()</code></td>
|
||
<td>GPS point timestamp</td>
|
||
</tr>
|
||
<tr>
|
||
<td>eventType</td>
|
||
<td>TrackPointEvent</td>
|
||
<td>✗</td>
|
||
<td><code>null</code></td>
|
||
<td>Event: LOCATION_ADDED, VISIT_RECORDED, SESSION_STARTED, SESSION_ENDED</td>
|
||
</tr>
|
||
</tbody>
|
||
</table>
|
||
<p><strong>Indexes:</strong>
|
||
- Composite: <code>[trackingSessionId, recordedAt]</code> (temporal queries)
|
||
- Non-unique: <code>recordedAt</code></p>
|
||
<p><strong>Relations:</strong>
|
||
- trackingSession → TrackingSession (onDelete: Cascade)</p>
|
||
<hr />
|
||
<h2 id="email-templates">Email Templates<a class="headerlink" href="#email-templates" title="Permanent link">¶</a></h2>
|
||
<h3 id="emailtemplate">EmailTemplate<a class="headerlink" href="#emailtemplate" title="Permanent link">¶</a></h3>
|
||
<p><strong>Table:</strong> <code>email_templates</code>
|
||
<strong>Description:</strong> Email template master records with category organization.</p>
|
||
<table>
|
||
<thead>
|
||
<tr>
|
||
<th>Field</th>
|
||
<th>Type</th>
|
||
<th>Required</th>
|
||
<th>Default</th>
|
||
<th>Description</th>
|
||
</tr>
|
||
</thead>
|
||
<tbody>
|
||
<tr>
|
||
<td>id</td>
|
||
<td>String</td>
|
||
<td>✓</td>
|
||
<td><code>cuid()</code></td>
|
||
<td>Primary key</td>
|
||
</tr>
|
||
<tr>
|
||
<td>key</td>
|
||
<td>String</td>
|
||
<td>✓</td>
|
||
<td>—</td>
|
||
<td>Template key (unique, e.g., "campaign-email")</td>
|
||
</tr>
|
||
<tr>
|
||
<td>name</td>
|
||
<td>String</td>
|
||
<td>✓</td>
|
||
<td>—</td>
|
||
<td>Display name</td>
|
||
</tr>
|
||
<tr>
|
||
<td>description</td>
|
||
<td>String</td>
|
||
<td>✗</td>
|
||
<td><code>null</code></td>
|
||
<td>Template description (long text)</td>
|
||
</tr>
|
||
<tr>
|
||
<td>category</td>
|
||
<td>EmailTemplateCategory</td>
|
||
<td>✓</td>
|
||
<td>—</td>
|
||
<td>Category: INFLUENCE, MAP, SYSTEM</td>
|
||
</tr>
|
||
<tr>
|
||
<td>subjectLine</td>
|
||
<td>String</td>
|
||
<td>✓</td>
|
||
<td>—</td>
|
||
<td>Subject line with {{VAR}} support</td>
|
||
</tr>
|
||
<tr>
|
||
<td>htmlContent</td>
|
||
<td>String</td>
|
||
<td>✓</td>
|
||
<td>—</td>
|
||
<td>HTML template (long text)</td>
|
||
</tr>
|
||
<tr>
|
||
<td>textContent</td>
|
||
<td>String</td>
|
||
<td>✓</td>
|
||
<td>—</td>
|
||
<td>Plain text template (long text)</td>
|
||
</tr>
|
||
<tr>
|
||
<td>isSystem</td>
|
||
<td>Boolean</td>
|
||
<td>✓</td>
|
||
<td><code>false</code></td>
|
||
<td>System template (prevent deletion)</td>
|
||
</tr>
|
||
<tr>
|
||
<td>isActive</td>
|
||
<td>Boolean</td>
|
||
<td>✓</td>
|
||
<td><code>true</code></td>
|
||
<td>Active status</td>
|
||
</tr>
|
||
<tr>
|
||
<td>createdByUserId</td>
|
||
<td>String</td>
|
||
<td>✓</td>
|
||
<td>—</td>
|
||
<td>Foreign key to User (creator)</td>
|
||
</tr>
|
||
<tr>
|
||
<td>updatedByUserId</td>
|
||
<td>String</td>
|
||
<td>✗</td>
|
||
<td><code>null</code></td>
|
||
<td>Foreign key to User (last updater)</td>
|
||
</tr>
|
||
<tr>
|
||
<td>createdAt</td>
|
||
<td>DateTime</td>
|
||
<td>✓</td>
|
||
<td><code>now()</code></td>
|
||
<td>Creation timestamp</td>
|
||
</tr>
|
||
<tr>
|
||
<td>updatedAt</td>
|
||
<td>DateTime</td>
|
||
<td>✓</td>
|
||
<td>Auto</td>
|
||
<td>Last update timestamp</td>
|
||
</tr>
|
||
</tbody>
|
||
</table>
|
||
<p><strong>Indexes:</strong>
|
||
- Unique: <code>key</code>
|
||
- Non-unique: <code>category</code>
|
||
- Non-unique: <code>isActive</code></p>
|
||
<p><strong>Relations:</strong>
|
||
- createdBy → User
|
||
- updatedBy → User
|
||
- variables → EmailTemplateVariable[]
|
||
- versions → EmailTemplateVersion[]
|
||
- testLogs → EmailTemplateTestLog[]</p>
|
||
<h3 id="emailtemplatevariable">EmailTemplateVariable<a class="headerlink" href="#emailtemplatevariable" title="Permanent link">¶</a></h3>
|
||
<p><strong>Table:</strong> <code>email_template_variables</code>
|
||
<strong>Description:</strong> Template variable definitions with validation.</p>
|
||
<table>
|
||
<thead>
|
||
<tr>
|
||
<th>Field</th>
|
||
<th>Type</th>
|
||
<th>Required</th>
|
||
<th>Default</th>
|
||
<th>Description</th>
|
||
</tr>
|
||
</thead>
|
||
<tbody>
|
||
<tr>
|
||
<td>id</td>
|
||
<td>String</td>
|
||
<td>✓</td>
|
||
<td><code>cuid()</code></td>
|
||
<td>Primary key</td>
|
||
</tr>
|
||
<tr>
|
||
<td>templateId</td>
|
||
<td>String</td>
|
||
<td>✓</td>
|
||
<td>—</td>
|
||
<td>Foreign key to EmailTemplate</td>
|
||
</tr>
|
||
<tr>
|
||
<td>key</td>
|
||
<td>String</td>
|
||
<td>✓</td>
|
||
<td>—</td>
|
||
<td>Variable key (e.g., "USER_NAME")</td>
|
||
</tr>
|
||
<tr>
|
||
<td>label</td>
|
||
<td>String</td>
|
||
<td>✓</td>
|
||
<td>—</td>
|
||
<td>Variable label (e.g., "User Name")</td>
|
||
</tr>
|
||
<tr>
|
||
<td>description</td>
|
||
<td>String</td>
|
||
<td>✗</td>
|
||
<td><code>null</code></td>
|
||
<td>Variable description (long text)</td>
|
||
</tr>
|
||
<tr>
|
||
<td>isRequired</td>
|
||
<td>Boolean</td>
|
||
<td>✓</td>
|
||
<td><code>true</code></td>
|
||
<td>Required flag</td>
|
||
</tr>
|
||
<tr>
|
||
<td>isConditional</td>
|
||
<td>Boolean</td>
|
||
<td>✓</td>
|
||
<td><code>false</code></td>
|
||
<td>Conditional variable (used in {{#if}})</td>
|
||
</tr>
|
||
<tr>
|
||
<td>sampleValue</td>
|
||
<td>String</td>
|
||
<td>✗</td>
|
||
<td><code>null</code></td>
|
||
<td>Sample value for testing (long text)</td>
|
||
</tr>
|
||
<tr>
|
||
<td>sortOrder</td>
|
||
<td>Int</td>
|
||
<td>✓</td>
|
||
<td><code>0</code></td>
|
||
<td>Display order</td>
|
||
</tr>
|
||
</tbody>
|
||
</table>
|
||
<p><strong>Indexes:</strong>
|
||
- Unique: <code>[templateId, key]</code> (unique variable keys per template)
|
||
- Foreign key: <code>templateId</code></p>
|
||
<p><strong>Relations:</strong>
|
||
- template → EmailTemplate (onDelete: Cascade)</p>
|
||
<h3 id="emailtemplateversion">EmailTemplateVersion<a class="headerlink" href="#emailtemplateversion" title="Permanent link">¶</a></h3>
|
||
<p><strong>Table:</strong> <code>email_template_versions</code>
|
||
<strong>Description:</strong> Template version history with auto-increment version numbers.</p>
|
||
<table>
|
||
<thead>
|
||
<tr>
|
||
<th>Field</th>
|
||
<th>Type</th>
|
||
<th>Required</th>
|
||
<th>Default</th>
|
||
<th>Description</th>
|
||
</tr>
|
||
</thead>
|
||
<tbody>
|
||
<tr>
|
||
<td>id</td>
|
||
<td>String</td>
|
||
<td>✓</td>
|
||
<td><code>cuid()</code></td>
|
||
<td>Primary key</td>
|
||
</tr>
|
||
<tr>
|
||
<td>templateId</td>
|
||
<td>String</td>
|
||
<td>✓</td>
|
||
<td>—</td>
|
||
<td>Foreign key to EmailTemplate</td>
|
||
</tr>
|
||
<tr>
|
||
<td>versionNumber</td>
|
||
<td>Int</td>
|
||
<td>✓</td>
|
||
<td>—</td>
|
||
<td>Auto-increment version number per template</td>
|
||
</tr>
|
||
<tr>
|
||
<td>subjectLine</td>
|
||
<td>String</td>
|
||
<td>✓</td>
|
||
<td>—</td>
|
||
<td>Subject line snapshot</td>
|
||
</tr>
|
||
<tr>
|
||
<td>htmlContent</td>
|
||
<td>String</td>
|
||
<td>✓</td>
|
||
<td>—</td>
|
||
<td>HTML content snapshot (long text)</td>
|
||
</tr>
|
||
<tr>
|
||
<td>textContent</td>
|
||
<td>String</td>
|
||
<td>✓</td>
|
||
<td>—</td>
|
||
<td>Plain text snapshot (long text)</td>
|
||
</tr>
|
||
<tr>
|
||
<td>changeNotes</td>
|
||
<td>String</td>
|
||
<td>✗</td>
|
||
<td><code>null</code></td>
|
||
<td>Version notes (long text)</td>
|
||
</tr>
|
||
<tr>
|
||
<td>createdByUserId</td>
|
||
<td>String</td>
|
||
<td>✓</td>
|
||
<td>—</td>
|
||
<td>Foreign key to User</td>
|
||
</tr>
|
||
<tr>
|
||
<td>createdAt</td>
|
||
<td>DateTime</td>
|
||
<td>✓</td>
|
||
<td><code>now()</code></td>
|
||
<td>Version timestamp</td>
|
||
</tr>
|
||
</tbody>
|
||
</table>
|
||
<p><strong>Indexes:</strong>
|
||
- Unique: <code>[templateId, versionNumber]</code> (sequential version numbers)
|
||
- Composite: <code>[templateId, createdAt(sort: Desc)]</code> (recent versions)</p>
|
||
<p><strong>Relations:</strong>
|
||
- template → EmailTemplate (onDelete: Cascade)
|
||
- createdBy → User</p>
|
||
<h3 id="emailtemplatetestlog">EmailTemplateTestLog<a class="headerlink" href="#emailtemplatetestlog" title="Permanent link">¶</a></h3>
|
||
<p><strong>Table:</strong> <code>email_template_test_logs</code>
|
||
<strong>Description:</strong> Test email audit logs.</p>
|
||
<table>
|
||
<thead>
|
||
<tr>
|
||
<th>Field</th>
|
||
<th>Type</th>
|
||
<th>Required</th>
|
||
<th>Default</th>
|
||
<th>Description</th>
|
||
</tr>
|
||
</thead>
|
||
<tbody>
|
||
<tr>
|
||
<td>id</td>
|
||
<td>String</td>
|
||
<td>✓</td>
|
||
<td><code>cuid()</code></td>
|
||
<td>Primary key</td>
|
||
</tr>
|
||
<tr>
|
||
<td>templateId</td>
|
||
<td>String</td>
|
||
<td>✓</td>
|
||
<td>—</td>
|
||
<td>Foreign key to EmailTemplate</td>
|
||
</tr>
|
||
<tr>
|
||
<td>recipientEmail</td>
|
||
<td>String</td>
|
||
<td>✓</td>
|
||
<td>—</td>
|
||
<td>Test recipient email</td>
|
||
</tr>
|
||
<tr>
|
||
<td>testData</td>
|
||
<td>Json</td>
|
||
<td>✓</td>
|
||
<td>—</td>
|
||
<td>Sample variable values JSON</td>
|
||
</tr>
|
||
<tr>
|
||
<td>success</td>
|
||
<td>Boolean</td>
|
||
<td>✓</td>
|
||
<td>—</td>
|
||
<td>Test success flag</td>
|
||
</tr>
|
||
<tr>
|
||
<td>errorMessage</td>
|
||
<td>String</td>
|
||
<td>✗</td>
|
||
<td><code>null</code></td>
|
||
<td>Error message (long text)</td>
|
||
</tr>
|
||
<tr>
|
||
<td>messageId</td>
|
||
<td>String</td>
|
||
<td>✗</td>
|
||
<td><code>null</code></td>
|
||
<td>Nodemailer message ID</td>
|
||
</tr>
|
||
<tr>
|
||
<td>sentByUserId</td>
|
||
<td>String</td>
|
||
<td>✓</td>
|
||
<td>—</td>
|
||
<td>Foreign key to User</td>
|
||
</tr>
|
||
<tr>
|
||
<td>sentAt</td>
|
||
<td>DateTime</td>
|
||
<td>✓</td>
|
||
<td><code>now()</code></td>
|
||
<td>Send timestamp</td>
|
||
</tr>
|
||
</tbody>
|
||
</table>
|
||
<p><strong>Indexes:</strong>
|
||
- Composite: <code>[templateId, sentAt(sort: Desc)]</code> (recent tests)</p>
|
||
<p><strong>Relations:</strong>
|
||
- template → EmailTemplate (onDelete: Cascade)
|
||
- sentBy → User</p>
|
||
<hr />
|
||
<h2 id="landing-pages">Landing Pages<a class="headerlink" href="#landing-pages" title="Permanent link">¶</a></h2>
|
||
<h3 id="landingpage">LandingPage<a class="headerlink" href="#landingpage" title="Permanent link">¶</a></h3>
|
||
<p><strong>Table:</strong> <code>landing_pages</code>
|
||
<strong>Description:</strong> GrapesJS editor output with MkDocs export support.</p>
|
||
<table>
|
||
<thead>
|
||
<tr>
|
||
<th>Field</th>
|
||
<th>Type</th>
|
||
<th>Required</th>
|
||
<th>Default</th>
|
||
<th>Description</th>
|
||
</tr>
|
||
</thead>
|
||
<tbody>
|
||
<tr>
|
||
<td>id</td>
|
||
<td>String</td>
|
||
<td>✓</td>
|
||
<td><code>cuid()</code></td>
|
||
<td>Primary key</td>
|
||
</tr>
|
||
<tr>
|
||
<td>slug</td>
|
||
<td>String</td>
|
||
<td>✓</td>
|
||
<td>—</td>
|
||
<td>URL slug (unique)</td>
|
||
</tr>
|
||
<tr>
|
||
<td>title</td>
|
||
<td>String</td>
|
||
<td>✓</td>
|
||
<td>—</td>
|
||
<td>Page title</td>
|
||
</tr>
|
||
<tr>
|
||
<td>description</td>
|
||
<td>String</td>
|
||
<td>✗</td>
|
||
<td><code>null</code></td>
|
||
<td>Page description (long text)</td>
|
||
</tr>
|
||
<tr>
|
||
<td>blocks</td>
|
||
<td>Json</td>
|
||
<td>✓</td>
|
||
<td>—</td>
|
||
<td>GrapesJS editor JSON</td>
|
||
</tr>
|
||
<tr>
|
||
<td>htmlOutput</td>
|
||
<td>String</td>
|
||
<td>✗</td>
|
||
<td><code>null</code></td>
|
||
<td>Rendered HTML (long text)</td>
|
||
</tr>
|
||
<tr>
|
||
<td>cssOutput</td>
|
||
<td>String</td>
|
||
<td>✗</td>
|
||
<td><code>null</code></td>
|
||
<td>Rendered CSS (long text)</td>
|
||
</tr>
|
||
<tr>
|
||
<td>editorMode</td>
|
||
<td>EditorMode</td>
|
||
<td>✓</td>
|
||
<td><code>VISUAL</code></td>
|
||
<td>Editor mode: VISUAL, CODE</td>
|
||
</tr>
|
||
<tr>
|
||
<td>mkdocsPath</td>
|
||
<td>String</td>
|
||
<td>✗</td>
|
||
<td><code>null</code></td>
|
||
<td>Path in mkdocs/overrides/</td>
|
||
</tr>
|
||
<tr>
|
||
<td>mkdocsStubPath</td>
|
||
<td>String</td>
|
||
<td>✗</td>
|
||
<td><code>null</code></td>
|
||
<td>Path to .md stub in mkdocs/docs/</td>
|
||
</tr>
|
||
<tr>
|
||
<td>mkdocsExportMode</td>
|
||
<td>MkdocsExportMode</td>
|
||
<td>✓</td>
|
||
<td><code>THEMED</code></td>
|
||
<td>Export mode: THEMED, STANDALONE</td>
|
||
</tr>
|
||
<tr>
|
||
<td>mkdocsHideNav</td>
|
||
<td>Boolean</td>
|
||
<td>✓</td>
|
||
<td><code>true</code></td>
|
||
<td>Hide navigation in MkDocs</td>
|
||
</tr>
|
||
<tr>
|
||
<td>mkdocsHideToc</td>
|
||
<td>Boolean</td>
|
||
<td>✓</td>
|
||
<td><code>true</code></td>
|
||
<td>Hide table of contents in MkDocs</td>
|
||
</tr>
|
||
<tr>
|
||
<td>mkdocsSkipExport</td>
|
||
<td>Boolean</td>
|
||
<td>✓</td>
|
||
<td><code>false</code></td>
|
||
<td>Skip MkDocs export flag</td>
|
||
</tr>
|
||
<tr>
|
||
<td>published</td>
|
||
<td>Boolean</td>
|
||
<td>✓</td>
|
||
<td><code>false</code></td>
|
||
<td>Published status</td>
|
||
</tr>
|
||
<tr>
|
||
<td>seoTitle</td>
|
||
<td>String</td>
|
||
<td>✗</td>
|
||
<td><code>null</code></td>
|
||
<td>SEO title override</td>
|
||
</tr>
|
||
<tr>
|
||
<td>seoDescription</td>
|
||
<td>String</td>
|
||
<td>✗</td>
|
||
<td><code>null</code></td>
|
||
<td>SEO description (long text)</td>
|
||
</tr>
|
||
<tr>
|
||
<td>seoImage</td>
|
||
<td>String</td>
|
||
<td>✗</td>
|
||
<td><code>null</code></td>
|
||
<td>SEO image URL</td>
|
||
</tr>
|
||
<tr>
|
||
<td>createdAt</td>
|
||
<td>DateTime</td>
|
||
<td>✓</td>
|
||
<td><code>now()</code></td>
|
||
<td>Creation timestamp</td>
|
||
</tr>
|
||
<tr>
|
||
<td>updatedAt</td>
|
||
<td>DateTime</td>
|
||
<td>✓</td>
|
||
<td>Auto</td>
|
||
<td>Last update timestamp</td>
|
||
</tr>
|
||
</tbody>
|
||
</table>
|
||
<p><strong>Indexes:</strong>
|
||
- Unique: <code>slug</code></p>
|
||
<p><strong>Relations:</strong> None</p>
|
||
<h3 id="pageblock">PageBlock<a class="headerlink" href="#pageblock" title="Permanent link">¶</a></h3>
|
||
<p><strong>Table:</strong> <code>page_blocks</code>
|
||
<strong>Description:</strong> Reusable block library for GrapesJS editor.</p>
|
||
<table>
|
||
<thead>
|
||
<tr>
|
||
<th>Field</th>
|
||
<th>Type</th>
|
||
<th>Required</th>
|
||
<th>Default</th>
|
||
<th>Description</th>
|
||
</tr>
|
||
</thead>
|
||
<tbody>
|
||
<tr>
|
||
<td>id</td>
|
||
<td>String</td>
|
||
<td>✓</td>
|
||
<td><code>cuid()</code></td>
|
||
<td>Primary key</td>
|
||
</tr>
|
||
<tr>
|
||
<td>type</td>
|
||
<td>String</td>
|
||
<td>✓</td>
|
||
<td>—</td>
|
||
<td>Block type (hero, text, image, cta, features, testimonials, form)</td>
|
||
</tr>
|
||
<tr>
|
||
<td>label</td>
|
||
<td>String</td>
|
||
<td>✓</td>
|
||
<td>—</td>
|
||
<td>Block label</td>
|
||
</tr>
|
||
<tr>
|
||
<td>schema</td>
|
||
<td>Json</td>
|
||
<td>✓</td>
|
||
<td>—</td>
|
||
<td>Block configuration schema JSON</td>
|
||
</tr>
|
||
<tr>
|
||
<td>defaults</td>
|
||
<td>Json</td>
|
||
<td>✓</td>
|
||
<td>—</td>
|
||
<td>Default values JSON</td>
|
||
</tr>
|
||
<tr>
|
||
<td>thumbnail</td>
|
||
<td>String</td>
|
||
<td>✗</td>
|
||
<td><code>null</code></td>
|
||
<td>Thumbnail URL</td>
|
||
</tr>
|
||
<tr>
|
||
<td>category</td>
|
||
<td>String</td>
|
||
<td>✗</td>
|
||
<td><code>null</code></td>
|
||
<td>Block category</td>
|
||
</tr>
|
||
<tr>
|
||
<td>sortOrder</td>
|
||
<td>Int</td>
|
||
<td>✓</td>
|
||
<td><code>0</code></td>
|
||
<td>Display order</td>
|
||
</tr>
|
||
<tr>
|
||
<td>createdAt</td>
|
||
<td>DateTime</td>
|
||
<td>✓</td>
|
||
<td><code>now()</code></td>
|
||
<td>Creation timestamp</td>
|
||
</tr>
|
||
<tr>
|
||
<td>updatedAt</td>
|
||
<td>DateTime</td>
|
||
<td>✓</td>
|
||
<td>Auto</td>
|
||
<td>Last update timestamp</td>
|
||
</tr>
|
||
</tbody>
|
||
</table>
|
||
<p><strong>Indexes:</strong> None</p>
|
||
<p><strong>Relations:</strong> None</p>
|
||
<hr />
|
||
<h2 id="site-settings">Site Settings<a class="headerlink" href="#site-settings" title="Permanent link">¶</a></h2>
|
||
<h3 id="sitesettings">SiteSettings<a class="headerlink" href="#sitesettings" title="Permanent link">¶</a></h3>
|
||
<p><strong>Table:</strong> <code>site_settings</code>
|
||
<strong>Description:</strong> Global site configuration singleton for branding, theme, SMTP, and feature toggles.</p>
|
||
<table>
|
||
<thead>
|
||
<tr>
|
||
<th>Field</th>
|
||
<th>Type</th>
|
||
<th>Required</th>
|
||
<th>Default</th>
|
||
<th>Description</th>
|
||
</tr>
|
||
</thead>
|
||
<tbody>
|
||
<tr>
|
||
<td>id</td>
|
||
<td>String</td>
|
||
<td>✓</td>
|
||
<td><code>cuid()</code></td>
|
||
<td>Primary key (always "default")</td>
|
||
</tr>
|
||
<tr>
|
||
<td>organizationName</td>
|
||
<td>String</td>
|
||
<td>✓</td>
|
||
<td><code>"Changemaker Lite"</code></td>
|
||
<td>Organization name</td>
|
||
</tr>
|
||
<tr>
|
||
<td>organizationShortName</td>
|
||
<td>String</td>
|
||
<td>✓</td>
|
||
<td><code>"CML"</code></td>
|
||
<td>Short name/acronym</td>
|
||
</tr>
|
||
<tr>
|
||
<td>organizationLogoUrl</td>
|
||
<td>String</td>
|
||
<td>✗</td>
|
||
<td><code>null</code></td>
|
||
<td>Logo URL</td>
|
||
</tr>
|
||
<tr>
|
||
<td>organizationFaviconUrl</td>
|
||
<td>String</td>
|
||
<td>✗</td>
|
||
<td><code>null</code></td>
|
||
<td>Favicon URL</td>
|
||
</tr>
|
||
<tr>
|
||
<td>adminColorPrimary</td>
|
||
<td>String</td>
|
||
<td>✓</td>
|
||
<td><code>"#9d4edd"</code></td>
|
||
<td>Admin primary color (hex)</td>
|
||
</tr>
|
||
<tr>
|
||
<td>adminColorBgBase</td>
|
||
<td>String</td>
|
||
<td>✓</td>
|
||
<td><code>"#1a1025"</code></td>
|
||
<td>Admin background color (hex)</td>
|
||
</tr>
|
||
<tr>
|
||
<td>publicColorPrimary</td>
|
||
<td>String</td>
|
||
<td>✓</td>
|
||
<td><code>"#3498db"</code></td>
|
||
<td>Public primary color (hex)</td>
|
||
</tr>
|
||
<tr>
|
||
<td>publicColorBgBase</td>
|
||
<td>String</td>
|
||
<td>✓</td>
|
||
<td><code>"#0d1b2a"</code></td>
|
||
<td>Public background color (hex)</td>
|
||
</tr>
|
||
<tr>
|
||
<td>publicColorBgContainer</td>
|
||
<td>String</td>
|
||
<td>✓</td>
|
||
<td><code>"#1b2838"</code></td>
|
||
<td>Public container color (hex)</td>
|
||
</tr>
|
||
<tr>
|
||
<td>publicHeaderGradient</td>
|
||
<td>String</td>
|
||
<td>✓</td>
|
||
<td><code>"linear-gradient(135deg, #005a9c 0%, #007acc 100%)"</code></td>
|
||
<td>Public header gradient (CSS)</td>
|
||
</tr>
|
||
<tr>
|
||
<td>footerText</td>
|
||
<td>String</td>
|
||
<td>✓</td>
|
||
<td><code>"Powered by Changemaker Lite"</code></td>
|
||
<td>Footer text</td>
|
||
</tr>
|
||
<tr>
|
||
<td>loginSubtitle</td>
|
||
<td>String</td>
|
||
<td>✓</td>
|
||
<td><code>"Admin"</code></td>
|
||
<td>Login page subtitle</td>
|
||
</tr>
|
||
<tr>
|
||
<td>emailFromName</td>
|
||
<td>String</td>
|
||
<td>✓</td>
|
||
<td><code>"Changemaker Lite"</code></td>
|
||
<td>Email from name</td>
|
||
</tr>
|
||
<tr>
|
||
<td>smtpHost</td>
|
||
<td>String</td>
|
||
<td>✓</td>
|
||
<td><code>""</code></td>
|
||
<td>SMTP host (empty = use env)</td>
|
||
</tr>
|
||
<tr>
|
||
<td>smtpPort</td>
|
||
<td>Int</td>
|
||
<td>✓</td>
|
||
<td><code>0</code></td>
|
||
<td>SMTP port (0 = use env)</td>
|
||
</tr>
|
||
<tr>
|
||
<td>smtpUser</td>
|
||
<td>String</td>
|
||
<td>✓</td>
|
||
<td><code>""</code></td>
|
||
<td>SMTP username (empty = use env)</td>
|
||
</tr>
|
||
<tr>
|
||
<td>smtpPass</td>
|
||
<td>String</td>
|
||
<td>✓</td>
|
||
<td><code>""</code></td>
|
||
<td>SMTP password (empty = use env)</td>
|
||
</tr>
|
||
<tr>
|
||
<td>smtpFromAddress</td>
|
||
<td>String</td>
|
||
<td>✓</td>
|
||
<td><code>""</code></td>
|
||
<td>SMTP from address (empty = use env)</td>
|
||
</tr>
|
||
<tr>
|
||
<td>smtpActiveProvider</td>
|
||
<td>String</td>
|
||
<td>✓</td>
|
||
<td><code>"mailhog"</code></td>
|
||
<td>Active provider: "mailhog", "production"</td>
|
||
</tr>
|
||
<tr>
|
||
<td>emailTestMode</td>
|
||
<td>Boolean</td>
|
||
<td>✓</td>
|
||
<td><code>true</code></td>
|
||
<td>Email test mode flag</td>
|
||
</tr>
|
||
<tr>
|
||
<td>testEmailRecipient</td>
|
||
<td>String</td>
|
||
<td>✓</td>
|
||
<td><code>""</code></td>
|
||
<td>Test email recipient</td>
|
||
</tr>
|
||
<tr>
|
||
<td>enableInfluence</td>
|
||
<td>Boolean</td>
|
||
<td>✓</td>
|
||
<td><code>true</code></td>
|
||
<td>Enable Influence module</td>
|
||
</tr>
|
||
<tr>
|
||
<td>enableMap</td>
|
||
<td>Boolean</td>
|
||
<td>✓</td>
|
||
<td><code>true</code></td>
|
||
<td>Enable Map module</td>
|
||
</tr>
|
||
<tr>
|
||
<td>enableNewsletter</td>
|
||
<td>Boolean</td>
|
||
<td>✓</td>
|
||
<td><code>true</code></td>
|
||
<td>Enable Newsletter module</td>
|
||
</tr>
|
||
<tr>
|
||
<td>enableLandingPages</td>
|
||
<td>Boolean</td>
|
||
<td>✓</td>
|
||
<td><code>true</code></td>
|
||
<td>Enable Landing Pages module</td>
|
||
</tr>
|
||
<tr>
|
||
<td>createdAt</td>
|
||
<td>DateTime</td>
|
||
<td>✓</td>
|
||
<td><code>now()</code></td>
|
||
<td>Creation timestamp</td>
|
||
</tr>
|
||
<tr>
|
||
<td>updatedAt</td>
|
||
<td>DateTime</td>
|
||
<td>✓</td>
|
||
<td>Auto</td>
|
||
<td>Last update timestamp</td>
|
||
</tr>
|
||
</tbody>
|
||
</table>
|
||
<p><strong>Indexes:</strong> None</p>
|
||
<p><strong>Relations:</strong> None (singleton)</p>
|
||
<hr />
|
||
<h2 id="media-drizzle-orm">Media (Drizzle ORM)<a class="headerlink" href="#media-drizzle-orm" title="Permanent link">¶</a></h2>
|
||
<h3 id="videos">videos<a class="headerlink" href="#videos" title="Permanent link">¶</a></h3>
|
||
<p><strong>Table:</strong> <code>videos</code>
|
||
<strong>Description:</strong> Video library with metadata extraction and engagement tracking.</p>
|
||
<table>
|
||
<thead>
|
||
<tr>
|
||
<th>Field</th>
|
||
<th>Type</th>
|
||
<th>Required</th>
|
||
<th>Default</th>
|
||
<th>Description</th>
|
||
</tr>
|
||
</thead>
|
||
<tbody>
|
||
<tr>
|
||
<td>id</td>
|
||
<td>serial</td>
|
||
<td>✓</td>
|
||
<td>Auto</td>
|
||
<td>Primary key (auto-increment)</td>
|
||
</tr>
|
||
<tr>
|
||
<td>path</td>
|
||
<td>text</td>
|
||
<td>✓</td>
|
||
<td>—</td>
|
||
<td>File path (unique)</td>
|
||
</tr>
|
||
<tr>
|
||
<td>filename</td>
|
||
<td>text</td>
|
||
<td>✓</td>
|
||
<td>—</td>
|
||
<td>File name</td>
|
||
</tr>
|
||
<tr>
|
||
<td>producer</td>
|
||
<td>text</td>
|
||
<td>✗</td>
|
||
<td><code>null</code></td>
|
||
<td>Producer name</td>
|
||
</tr>
|
||
<tr>
|
||
<td>creator</td>
|
||
<td>text</td>
|
||
<td>✗</td>
|
||
<td><code>null</code></td>
|
||
<td>Creator name</td>
|
||
</tr>
|
||
<tr>
|
||
<td>title</td>
|
||
<td>text</td>
|
||
<td>✗</td>
|
||
<td><code>null</code></td>
|
||
<td>Video title</td>
|
||
</tr>
|
||
<tr>
|
||
<td>durationSeconds</td>
|
||
<td>integer</td>
|
||
<td>✗</td>
|
||
<td><code>null</code></td>
|
||
<td>Duration in seconds (FFprobe)</td>
|
||
</tr>
|
||
<tr>
|
||
<td>quality</td>
|
||
<td>text</td>
|
||
<td>✗</td>
|
||
<td><code>null</code></td>
|
||
<td>Quality string (e.g., "1080p")</td>
|
||
</tr>
|
||
<tr>
|
||
<td>orientation</td>
|
||
<td>text</td>
|
||
<td>✗</td>
|
||
<td><code>null</code></td>
|
||
<td>Orientation: portrait, landscape, square</td>
|
||
</tr>
|
||
<tr>
|
||
<td>hasAudio</td>
|
||
<td>boolean</td>
|
||
<td>✓</td>
|
||
<td><code>true</code></td>
|
||
<td>Audio track present flag</td>
|
||
</tr>
|
||
<tr>
|
||
<td>fileSize</td>
|
||
<td>bigint</td>
|
||
<td>✗</td>
|
||
<td><code>null</code></td>
|
||
<td>File size in bytes</td>
|
||
</tr>
|
||
<tr>
|
||
<td>fileHash</td>
|
||
<td>text</td>
|
||
<td>✗</td>
|
||
<td><code>null</code></td>
|
||
<td>MD5 hash</td>
|
||
</tr>
|
||
<tr>
|
||
<td>width</td>
|
||
<td>integer</td>
|
||
<td>✗</td>
|
||
<td><code>null</code></td>
|
||
<td>Video width (FFprobe)</td>
|
||
</tr>
|
||
<tr>
|
||
<td>height</td>
|
||
<td>integer</td>
|
||
<td>✗</td>
|
||
<td><code>null</code></td>
|
||
<td>Video height (FFprobe)</td>
|
||
</tr>
|
||
<tr>
|
||
<td>lastValidated</td>
|
||
<td>timestamp</td>
|
||
<td>✗</td>
|
||
<td><code>null</code></td>
|
||
<td>Last validation timestamp</td>
|
||
</tr>
|
||
<tr>
|
||
<td>isValid</td>
|
||
<td>boolean</td>
|
||
<td>✓</td>
|
||
<td><code>true</code></td>
|
||
<td>Valid file flag</td>
|
||
</tr>
|
||
<tr>
|
||
<td>thumbnailPath</td>
|
||
<td>text</td>
|
||
<td>✗</td>
|
||
<td><code>null</code></td>
|
||
<td>Thumbnail file path</td>
|
||
</tr>
|
||
<tr>
|
||
<td>createdAt</td>
|
||
<td>timestamp</td>
|
||
<td>✓</td>
|
||
<td><code>now()</code></td>
|
||
<td>Creation timestamp</td>
|
||
</tr>
|
||
<tr>
|
||
<td>tags</td>
|
||
<td>jsonb</td>
|
||
<td>✗</td>
|
||
<td><code>null</code></td>
|
||
<td>Array of tag strings</td>
|
||
</tr>
|
||
<tr>
|
||
<td>directoryType</td>
|
||
<td>text</td>
|
||
<td>✗</td>
|
||
<td><code>null</code></td>
|
||
<td>Directory type: studios, gifs, private, inbox, curated, playback, compilations, videos, highlights</td>
|
||
</tr>
|
||
<tr>
|
||
<td>publicViewCount</td>
|
||
<td>integer</td>
|
||
<td>✗</td>
|
||
<td><code>null</code></td>
|
||
<td>Public view count (historical)</td>
|
||
</tr>
|
||
<tr>
|
||
<td>publicUpvoteCount</td>
|
||
<td>integer</td>
|
||
<td>✗</td>
|
||
<td><code>null</code></td>
|
||
<td>Public upvote count (historical)</td>
|
||
</tr>
|
||
<tr>
|
||
<td>publicCommentCount</td>
|
||
<td>integer</td>
|
||
<td>✗</td>
|
||
<td><code>null</code></td>
|
||
<td>Public comment count (historical)</td>
|
||
</tr>
|
||
<tr>
|
||
<td>publicCompletionCount</td>
|
||
<td>integer</td>
|
||
<td>✗</td>
|
||
<td><code>null</code></td>
|
||
<td>Public completion count (historical)</td>
|
||
</tr>
|
||
<tr>
|
||
<td>publicTotalWatchTime</td>
|
||
<td>integer</td>
|
||
<td>✗</td>
|
||
<td><code>null</code></td>
|
||
<td>Public total watch time (historical)</td>
|
||
</tr>
|
||
<tr>
|
||
<td>movedFromPublicAt</td>
|
||
<td>timestamp</td>
|
||
<td>✗</td>
|
||
<td><code>null</code></td>
|
||
<td>Timestamp when moved from public media</td>
|
||
</tr>
|
||
<tr>
|
||
<td>originalFilename</td>
|
||
<td>text</td>
|
||
<td>✗</td>
|
||
<td><code>null</code></td>
|
||
<td>Original filename before standardization</td>
|
||
</tr>
|
||
<tr>
|
||
<td>originalPath</td>
|
||
<td>text</td>
|
||
<td>✗</td>
|
||
<td><code>null</code></td>
|
||
<td>Original path before standardization</td>
|
||
</tr>
|
||
<tr>
|
||
<td>standardizedAt</td>
|
||
<td>timestamp</td>
|
||
<td>✗</td>
|
||
<td><code>null</code></td>
|
||
<td>Standardization timestamp</td>
|
||
</tr>
|
||
</tbody>
|
||
</table>
|
||
<p><strong>Indexes:</strong>
|
||
- Unique: <code>path</code>
|
||
- Non-unique: <code>orientation</code>
|
||
- Non-unique: <code>producer</code>
|
||
- Non-unique: <code>isValid</code>
|
||
- Non-unique: <code>directoryType</code>
|
||
- Composite: <code>[durationSeconds, fileSize, width, height]</code> (fingerprint)
|
||
- Composite: <code>[directoryType, isValid, orientation]</code> (common filtering)</p>
|
||
<p><strong>Relations:</strong> None (standalone)</p>
|
||
<h3 id="compilations">compilations<a class="headerlink" href="#compilations" title="Permanent link">¶</a></h3>
|
||
<p><strong>Table:</strong> <code>compilations</code>
|
||
<strong>Description:</strong> Video compilation tracking.</p>
|
||
<table>
|
||
<thead>
|
||
<tr>
|
||
<th>Field</th>
|
||
<th>Type</th>
|
||
<th>Required</th>
|
||
<th>Default</th>
|
||
<th>Description</th>
|
||
</tr>
|
||
</thead>
|
||
<tbody>
|
||
<tr>
|
||
<td>id</td>
|
||
<td>serial</td>
|
||
<td>✓</td>
|
||
<td>Auto</td>
|
||
<td>Primary key (auto-increment)</td>
|
||
</tr>
|
||
<tr>
|
||
<td>filename</td>
|
||
<td>text</td>
|
||
<td>✓</td>
|
||
<td>—</td>
|
||
<td>Compilation filename</td>
|
||
</tr>
|
||
<tr>
|
||
<td>path</td>
|
||
<td>text</td>
|
||
<td>✗</td>
|
||
<td><code>null</code></td>
|
||
<td>Compilation file path</td>
|
||
</tr>
|
||
<tr>
|
||
<td>durationSeconds</td>
|
||
<td>integer</td>
|
||
<td>✗</td>
|
||
<td><code>null</code></td>
|
||
<td>Total duration in seconds</td>
|
||
</tr>
|
||
<tr>
|
||
<td>videoIds</td>
|
||
<td>jsonb</td>
|
||
<td>✗</td>
|
||
<td><code>null</code></td>
|
||
<td>Array of video IDs included</td>
|
||
</tr>
|
||
<tr>
|
||
<td>settings</td>
|
||
<td>jsonb</td>
|
||
<td>✗</td>
|
||
<td><code>null</code></td>
|
||
<td>Compilation settings object</td>
|
||
</tr>
|
||
<tr>
|
||
<td>createdAt</td>
|
||
<td>timestamp</td>
|
||
<td>✓</td>
|
||
<td><code>now()</code></td>
|
||
<td>Creation timestamp</td>
|
||
</tr>
|
||
</tbody>
|
||
</table>
|
||
<p><strong>Indexes:</strong> None</p>
|
||
<p><strong>Relations:</strong> None (video IDs stored as JSON array)</p>
|
||
<h3 id="jobs">jobs<a class="headerlink" href="#jobs" title="Permanent link">¶</a></h3>
|
||
<p><strong>Table:</strong> <code>jobs</code>
|
||
<strong>Description:</strong> Job queue with resource category management.</p>
|
||
<table>
|
||
<thead>
|
||
<tr>
|
||
<th>Field</th>
|
||
<th>Type</th>
|
||
<th>Required</th>
|
||
<th>Default</th>
|
||
<th>Description</th>
|
||
</tr>
|
||
</thead>
|
||
<tbody>
|
||
<tr>
|
||
<td>id</td>
|
||
<td>serial</td>
|
||
<td>✓</td>
|
||
<td>Auto</td>
|
||
<td>Primary key (auto-increment)</td>
|
||
</tr>
|
||
<tr>
|
||
<td>type</td>
|
||
<td>text</td>
|
||
<td>✓</td>
|
||
<td>—</td>
|
||
<td>Job type (compilation, scan, organize, etc.)</td>
|
||
</tr>
|
||
<tr>
|
||
<td>status</td>
|
||
<td>text</td>
|
||
<td>✓</td>
|
||
<td><code>"pending"</code></td>
|
||
<td>Status: pending, queued, running, completed, failed, cancelled</td>
|
||
</tr>
|
||
<tr>
|
||
<td>progress</td>
|
||
<td>integer</td>
|
||
<td>✓</td>
|
||
<td><code>0</code></td>
|
||
<td>Progress percentage (0-100)</td>
|
||
</tr>
|
||
<tr>
|
||
<td>log</td>
|
||
<td>text</td>
|
||
<td>✗</td>
|
||
<td><code>null</code></td>
|
||
<td>Job log output</td>
|
||
</tr>
|
||
<tr>
|
||
<td>params</td>
|
||
<td>jsonb</td>
|
||
<td>✗</td>
|
||
<td><code>null</code></td>
|
||
<td>Job parameters object</td>
|
||
</tr>
|
||
<tr>
|
||
<td>startedAt</td>
|
||
<td>timestamp</td>
|
||
<td>✗</td>
|
||
<td><code>null</code></td>
|
||
<td>Job start timestamp</td>
|
||
</tr>
|
||
<tr>
|
||
<td>completedAt</td>
|
||
<td>timestamp</td>
|
||
<td>✗</td>
|
||
<td><code>null</code></td>
|
||
<td>Job completion timestamp</td>
|
||
</tr>
|
||
<tr>
|
||
<td>createdAt</td>
|
||
<td>timestamp</td>
|
||
<td>✓</td>
|
||
<td><code>now()</code></td>
|
||
<td>Creation timestamp</td>
|
||
</tr>
|
||
<tr>
|
||
<td>resourceCategory</td>
|
||
<td>text</td>
|
||
<td>✓</td>
|
||
<td><code>"cpu"</code></td>
|
||
<td>Resource category: gpu_ai, gpu_encode, cpu</td>
|
||
</tr>
|
||
<tr>
|
||
<td>vramRequired</td>
|
||
<td>integer</td>
|
||
<td>✓</td>
|
||
<td><code>0</code></td>
|
||
<td>VRAM required in MB</td>
|
||
</tr>
|
||
<tr>
|
||
<td>queuePosition</td>
|
||
<td>integer</td>
|
||
<td>✗</td>
|
||
<td><code>null</code></td>
|
||
<td>Queue position</td>
|
||
</tr>
|
||
<tr>
|
||
<td>waitingReason</td>
|
||
<td>text</td>
|
||
<td>✗</td>
|
||
<td><code>null</code></td>
|
||
<td>Reason for waiting</td>
|
||
</tr>
|
||
<tr>
|
||
<td>priority</td>
|
||
<td>integer</td>
|
||
<td>✓</td>
|
||
<td><code>5</code></td>
|
||
<td>Job priority (lower = higher priority)</td>
|
||
</tr>
|
||
<tr>
|
||
<td>pipelineId</td>
|
||
<td>integer</td>
|
||
<td>✗</td>
|
||
<td><code>null</code></td>
|
||
<td>Pipeline ID (for pipeline jobs)</td>
|
||
</tr>
|
||
<tr>
|
||
<td>pipelineStepId</td>
|
||
<td>integer</td>
|
||
<td>✗</td>
|
||
<td><code>null</code></td>
|
||
<td>Pipeline step ID</td>
|
||
</tr>
|
||
</tbody>
|
||
</table>
|
||
<p><strong>Indexes:</strong>
|
||
- Composite: <code>[status, priority, createdAt]</code> (queue processing)
|
||
- Composite: <code>[resourceCategory, status]</code> (resource filtering)
|
||
- Non-unique: <code>pipelineId</code></p>
|
||
<p><strong>Relations:</strong> None (pipeline relations are external)</p>
|
||
<hr />
|
||
<h2 id="related-documentation">Related Documentation<a class="headerlink" href="#related-documentation" title="Permanent link">¶</a></h2>
|
||
<ul>
|
||
<li><a href="../">Database Overview</a> — Complete ER diagram and architecture</li>
|
||
<li><a href="../migrations/">Migration Workflow</a> — Prisma and Drizzle migration processes</li>
|
||
<li><a href="../seeding/">Seeding</a> — Default data and seed script</li>
|
||
<li><a href="../indexes/">Indexes</a> — Index strategy and performance</li>
|
||
<li><a href="../models/auth/">Auth Models</a> — User and authentication models</li>
|
||
<li><a href="../models/influence/">Influence Models</a> — Campaign and advocacy models</li>
|
||
<li><a href="../models/map/">Map Models</a> — Location, shift, and cut models</li>
|
||
<li><a href="../models/canvass/">Canvassing Models</a> — Session and visit tracking</li>
|
||
<li><a href="../models/email-templates/">Email Template Models</a> — Template system models</li>
|
||
<li><a href="../models/pages/">Landing Page Models</a> — Page builder models</li>
|
||
<li><a href="../models/settings/">Settings Models</a> — Site and map settings</li>
|
||
<li><a href="../models/media/">Media Models</a> — Video library models (Drizzle)</li>
|
||
</ul>
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
</article>
|
||
</div>
|
||
|
||
|
||
<script>var target=document.getElementById(location.hash.slice(1));target&&target.name&&(target.checked=target.name.startsWith("__tabbed_"))</script>
|
||
</div>
|
||
|
||
<button type="button" class="md-top md-icon" data-md-component="top" hidden>
|
||
|
||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M13 20h-2V8l-5.5 5.5-1.42-1.42L12 4.16l7.92 7.92-1.42 1.42L13 8z"/></svg>
|
||
Back to top
|
||
</button>
|
||
|
||
</main>
|
||
|
||
<footer class="md-footer">
|
||
|
||
|
||
|
||
<nav class="md-footer__inner md-grid" aria-label="Footer" >
|
||
|
||
|
||
<a href="../" class="md-footer__link md-footer__link--prev" aria-label="Previous: Database Documentation">
|
||
<div class="md-footer__button md-icon">
|
||
|
||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M20 11v2H8l5.5 5.5-1.42 1.42L4.16 12l7.92-7.92L13.5 5.5 8 11z"/></svg>
|
||
</div>
|
||
<div class="md-footer__title">
|
||
<span class="md-footer__direction">
|
||
Previous
|
||
</span>
|
||
<div class="md-ellipsis">
|
||
Database Documentation
|
||
</div>
|
||
</div>
|
||
</a>
|
||
|
||
|
||
|
||
<a href="../migrations/" class="md-footer__link md-footer__link--next" aria-label="Next: Migrations">
|
||
<div class="md-footer__title">
|
||
<span class="md-footer__direction">
|
||
Next
|
||
</span>
|
||
<div class="md-ellipsis">
|
||
Migrations
|
||
</div>
|
||
</div>
|
||
<div class="md-footer__button md-icon">
|
||
|
||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M4 11v2h12l-5.5 5.5 1.42 1.42L19.84 12l-7.92-7.92L10.5 5.5 16 11z"/></svg>
|
||
</div>
|
||
</a>
|
||
|
||
</nav>
|
||
|
||
|
||
<div class="md-footer-meta md-typeset">
|
||
<div class="md-footer-meta__inner md-grid">
|
||
<div class="md-copyright">
|
||
|
||
<div class="md-copyright__highlight">
|
||
Copyright © 2024 The Bunker Operations – <a href="#__consent">Change cookie settings</a>
|
||
|
||
</div>
|
||
|
||
|
||
</div>
|
||
|
||
|
||
<div class="md-social">
|
||
|
||
|
||
|
||
|
||
|
||
<a href="https://gitea.bnkops.com/admin" target="_blank" rel="noopener" title="Gitea Repository" class="md-social__link">
|
||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><!--! Font Awesome Free 7.1.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2025 Fonticons, Inc.--><path d="M173.9 397.4c0 2-2.3 3.6-5.2 3.6-3.3.3-5.6-1.3-5.6-3.6 0-2 2.3-3.6 5.2-3.6 3-.3 5.6 1.3 5.6 3.6m-31.1-4.5c-.7 2 1.3 4.3 4.3 4.9 2.6 1 5.6 0 6.2-2s-1.3-4.3-4.3-5.2c-2.6-.7-5.5.3-6.2 2.3m44.2-1.7c-2.9.7-4.9 2.6-4.6 4.9.3 2 2.9 3.3 5.9 2.6 2.9-.7 4.9-2.6 4.6-4.6-.3-1.9-3-3.2-5.9-2.9M252.8 8C114.1 8 8 113.3 8 252c0 110.9 69.8 205.8 169.5 239.2 12.8 2.3 17.3-5.6 17.3-12.1 0-6.2-.3-40.4-.3-61.4 0 0-70 15-84.7-29.8 0 0-11.4-29.1-27.8-36.6 0 0-22.9-15.7 1.6-15.4 0 0 24.9 2 38.6 25.8 21.9 38.6 58.6 27.5 72.9 20.9 2.3-16 8.8-27.1 16-33.7-55.9-6.2-112.3-14.3-112.3-110.5 0-27.5 7.6-41.3 23.6-58.9-2.6-6.5-11.1-33.3 2.6-67.9 20.9-6.5 69 27 69 27 20-5.6 41.5-8.5 62.8-8.5s42.8 2.9 62.8 8.5c0 0 48.1-33.6 69-27 13.7 34.7 5.2 61.4 2.6 67.9 16 17.7 25.8 31.5 25.8 58.9 0 96.5-58.9 104.2-114.8 110.5 9.2 7.9 17 22.9 17 46.4 0 33.7-.3 75.4-.3 83.6 0 6.5 4.6 14.4 17.3 12.1C436.2 457.8 504 362.9 504 252 504 113.3 391.5 8 252.8 8M105.2 352.9c-1.3 1-1 3.3.7 5.2 1.6 1.6 3.9 2.3 5.2 1 1.3-1 1-3.3-.7-5.2-1.6-1.6-3.9-2.3-5.2-1m-10.8-8.1c-.7 1.3.3 2.9 2.3 3.9 1.6 1 3.6.7 4.3-.7.7-1.3-.3-2.9-2.3-3.9-2-.6-3.6-.3-4.3.7m32.4 35.6c-1.6 1.3-1 4.3 1.3 6.2 2.3 2.3 5.2 2.6 6.5 1 1.3-1.3.7-4.3-1.3-6.2-2.2-2.3-5.2-2.6-6.5-1m-11.4-14.7c-1.6 1-1.6 3.6 0 5.9s4.3 3.3 5.6 2.3c1.6-1.3 1.6-3.9 0-6.2-1.4-2.3-4-3.3-5.6-2"/></svg>
|
||
</a>
|
||
|
||
|
||
|
||
|
||
|
||
<a href="https://listmonk.bnkops.com/subscription/form" target="_blank" rel="noopener" title="Newsletter" class="md-social__link">
|
||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 576 512"><!--! Font Awesome Free 7.1.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2025 Fonticons, Inc.--><path d="M536.4-26.3c9.8-3.5 20.6-1 28 6.3s9.8 18.2 6.3 28l-178 496.9c-5 13.9-18.1 23.1-32.8 23.1-14.2 0-27-8.6-32.3-21.7l-64.2-158c-4.5-11-2.5-23.6 5.2-32.6l94.5-112.4c5.1-6.1 4.7-15-.9-20.6s-14.6-6-20.6-.9l-112.4 94.3c-9.1 7.6-21.6 9.6-32.6 5.2L38.1 216.8c-13.1-5.3-21.7-18.1-21.7-32.3 0-14.7 9.2-27.8 23.1-32.8z"/></svg>
|
||
</a>
|
||
|
||
</div>
|
||
|
||
</div>
|
||
</div>
|
||
</footer>
|
||
|
||
</div>
|
||
<div class="md-dialog" data-md-component="dialog">
|
||
<div class="md-dialog__inner md-typeset"></div>
|
||
</div>
|
||
|
||
|
||
|
||
|
||
|
||
<script id="__config" type="application/json">{"annotate": null, "base": "../../..", "features": ["announce.dismiss", "content.action.edit", "content.action.view", "content.code.annotate", "content.code.copy", "content.tooltips", "navigation.expand", "navigation.footer", "navigation.indexes", "navigation.path", "navigation.prune", "navigation.sections", "navigation.tabs", "navigation.tabs.sticky", "navigation.top", "navigation.tracking", "search.highlight", "search.share", "search.suggest", "toc.follow"], "search": "../../../assets/javascripts/workers/search.2c215733.min.js", "tags": null, "translations": {"clipboard.copied": "Copied to clipboard", "clipboard.copy": "Copy to clipboard", "search.result.more.one": "1 more on this page", "search.result.more.other": "# more on this page", "search.result.none": "No matching documents", "search.result.one": "1 matching document", "search.result.other": "# matching documents", "search.result.placeholder": "Type to start searching", "search.result.term.missing": "Missing", "select.version": "Select version"}, "version": null}</script>
|
||
|
||
|
||
<script src="../../../assets/javascripts/bundle.79ae519e.min.js"></script>
|
||
|
||
<script src="../../../javascripts/home.js"></script>
|
||
|
||
<script src="../../../javascripts/github-widget.js"></script>
|
||
|
||
<script src="../../../javascripts/gitea-widget.js"></script>
|
||
|
||
<script src="../../../assets/js/env-config.js"></script>
|
||
|
||
<script src="../../../assets/js/video-player.js"></script>
|
||
|
||
|
||
</body>
|
||
</html> |