Desenvolvedores
src_
collections
cursos
Curso.ts

📚 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.