teqo/src/collections/CampaignInvite.ts
Francisco Ignácio Fontoura Solla 4806c417c8 Engineering Pass 3: consolidate patterns and lock them with guards.
Fold duplicated campanha access, loaders, list/filter/form shells, and scripts into shared modules; reorganize utilities by domain; stabilize e2e; and document prevention-first audit workflow so the same smells cannot creep back in.
2026-07-29 06:11:29 -03:00

109 lines
2.5 KiB
TypeScript

import type { CollectionConfig } from 'payload'
import {
canCreateCampaignInvite,
canMutateCampaignInvite,
canReadCampaignInvite,
canSetCampaignInviteSystemField,
} from '@/utilities/campaignAccess'
import { systemStampedActorField } from '@/utilities/campaignAuditFields'
import { campaignInviteExpiry } from '@/utilities/campaignInvite'
export const CampaignInvite: CollectionConfig = {
slug: 'campaignInvite',
labels: {
singular: 'Convite',
plural: 'Convites',
},
admin: {
group: 'Campanha',
useAsTitle: 'leadership',
defaultColumns: ['leadership', 'kind', 'expiresAt', 'usedAt', 'revokedAt', 'createdAt'],
},
access: {
create: canCreateCampaignInvite,
read: canReadCampaignInvite,
update: canMutateCampaignInvite,
delete: canMutateCampaignInvite,
},
indexes: [
{
fields: ['leadership', 'kind'],
},
],
fields: [
{
name: 'tokenHash',
type: 'text',
required: true,
unique: true,
index: true,
admin: {
hidden: true,
},
access: {
create: canSetCampaignInviteSystemField,
read: () => false,
update: canSetCampaignInviteSystemField,
},
},
{
name: 'leadership',
type: 'relationship',
relationTo: 'leadership',
label: 'Liderança',
required: true,
index: true,
},
{
name: 'kind',
type: 'select',
label: 'Tipo',
required: true,
index: true,
options: [
{ label: 'Acesso ao app', value: 'login' },
{ label: 'Completar cadastro', value: 'autopreenchimento' },
],
},
{
name: 'expiresAt',
type: 'date',
label: 'Expira em',
required: true,
index: true,
defaultValue: () => campaignInviteExpiry().toISOString(),
access: {
create: canSetCampaignInviteSystemField,
update: canSetCampaignInviteSystemField,
},
},
{
name: 'usedAt',
type: 'date',
label: 'Usado em',
index: true,
admin: {
readOnly: true,
},
access: {
create: canSetCampaignInviteSystemField,
update: canSetCampaignInviteSystemField,
},
},
{
name: 'revokedAt',
type: 'date',
label: 'Revogado em',
index: true,
admin: {
readOnly: true,
},
access: {
create: canSetCampaignInviteSystemField,
update: canSetCampaignInviteSystemField,
},
},
systemStampedActorField({ required: true, setAccess: canSetCampaignInviteSystemField }),
],
}