📚 Documentação do Arquivo Curso.ts
O arquivo Curso.ts, localizado na pasta cursos dentro de collections, define a coleção Cursos, responsável por armazenar informações sobre cursos oferecidos na plataforma. Ele inclui campos essenciais como nome, descrição, professores, módulos e status do curso.
🔧 Configuração da Coleção
import { CollectionConfig } from 'payload'
import {
lexicalEditor,
FixedToolbarFeature,
InlineToolbarFeature,
} from '@payloadcms/richtext-lexical'
import { modulos } from './Modulo'
import formatSlug from '@/hooks/formatSlug'
import { isAdminOrCreatedBy } from '@/access/isAdminOrCreatedBy'
export const Cursos: CollectionConfig = {
slug: 'cursos',
access: {
read: () => true,
create: isAdminOrCreatedBy,
update: isAdminOrCreatedBy,
delete: isAdminOrCreatedBy,
},
labels: {
singular: 'Curso',
plural: 'Cursos',
},
admin: {
useAsTitle: 'nomeCurso',
defaultColumns: ['nomeCurso', 'finalizado', 'updatedAt', 'createdBy'],
},
hooks: {
beforeChange: [
({ req, operation, data }) => {
if (operation === 'create' && req.user) {
data.createdBy = req.user.id
return data
}
},
],
},
fields: [
{
type: 'tabs',
tabs: [
{
label: 'Informações do Curso',
fields: [
{ name: 'nomeCurso', label: 'Nome', type: 'text', unique: true, required: true, maxLength: 100 },
{ name: 'descricao', label: 'Descrição', type: 'textarea', required: true, maxLength: 600 },
{ name: 'fotoBanner', label: 'Foto Banner', type: 'upload', relationTo: 'media', required: true },
{
name: 'planoEnsino',
label: 'Plano de Ensino',
type: 'richText',
required: true,
editor: lexicalEditor({
features: ({ defaultFeatures }) => [...defaultFeatures, FixedToolbarFeature(), InlineToolbarFeature()],
}),
},
{ name: 'videoTeaser', label: 'Vídeo Teaser', type: 'text', maxLength: 255 },
{ name: 'professores', label: 'Professores', type: 'array', fields: [{ type: 'text', name: 'professor', required: true }] },
{ name: 'tags', label: 'Tags', type: 'relationship', relationTo: 'tags', hasMany: true },
{ name: 'finalizado', label: 'Curso Finalizado?', type: 'radio', options: [{ label: 'Em andamento', value: 'false' }, { label: 'Já Finalizado', value: 'true' }], defaultValue: 'false', admin: { layout: 'horizontal' } },
{ name: 'nivel', label: 'Nível', type: 'select', options: [{ label: 'Iniciante', value: 'Iniciante' }, { label: 'Intermediário', value: 'Intermediário' }, { label: 'Avançado', value: 'Avançado' }], required: true },
{ name: 'requisitos', label: 'Requisitos', type: 'array', fields: [{ type: 'text', name: 'requisito', maxLength: 500 }] },
{ name: 'horas', label: 'Carga Horária Total (horas)', type: 'number' },
{ name: 'numeroInscritos', label: 'Número de Inscritos', type: 'number', defaultValue: 0, admin: { readOnly: true, width: '49%', position: 'sidebar' } },
{ name: 'createdBy', label: 'Criado por', type: 'relationship', relationTo: 'colaboradores', admin: { readOnly: true, condition: (data) => Boolean(data?.createdBy) } },
{ name: 'slug', label: 'URL do Curso (Link)', type: 'text', hooks: { beforeValidate: [formatSlug], beforeChange: [formatSlug], afterChange: [formatSlug] } },
],
},
{
label: 'Módulos e Aulas',
fields: [{ name: 'modulos', label: 'Módulos', type: 'array', fields: [modulos] }],
},
],
},
],
}
export default Cursos🏗️ Estrutura da Coleção
📌 Slug
O slug: 'cursos' define o identificador único usado nas rotas para esta coleção.
🔒 Controle de Acesso
A configuração de acesso restringe a criação, atualização e exclusão de cursos apenas a administradores ou criadores do conteúdo.
📑 Campos Principais
nomeCurso: Nome do curso (único e obrigatório).descricao: Breve descrição do curso.fotoBanner: Imagem representativa do curso.planoEnsino: Texto formatado com detalhes sobre o curso.videoTeaser: Link para um vídeo de apresentação.professores: Lista de professores responsáveis.tags: Palavras-chave associadas ao curso.finalizado: Indica se o curso está concluído.nivel: Nível de dificuldade do curso.requisitos: Pré-requisitos necessários para o curso.horas: Carga horária total.numeroInscritos: Número de alunos matriculados.createdBy: Criador do curso.slug: URL do curso, gerada automaticamente.
🔍 Conclusão
Essa configuração permite a gestão eficiente dos cursos na plataforma, garantindo que apenas usuários autorizados possam modificar os dados e fornecendo uma estrutura clara e organizada.