Content: Post entity, tags, and approval workflow (Phase 4.1)
Nadie ha tomado este issue todavía.
Evaluación
- Dificultad
- 5/5
- Tiempo estimado
- Más de una semana
- Aptitud para principiantes
- 45/100
Línea de trabajo
Lee el módulo Members existente como referencia, incluido tests/CommunityPro.Tests/Members/MembersTestHarness.cs, y sigue las convenciones de IEndpointModule.MapEndpoints y las extensiones de DI. Después, traza el ContentDbContext, la migración del esquema de content, el servicio de transición de estado de Post y las pruebas para cada transición y comportamiento de los featured-slots; el trabajo estará terminado cuando estén cubiertos todos los criterios de aceptación y códigos de error enumerados.
Escrito por el modelo de indexación a partir del texto del issue.
Descripción
Scope
New CommunityPro.Content module: content Postgres schema, ContentDbContext, migrations, and the Post aggregate with its status workflow. Domain logic only — endpoints come in follow-up tickets.
Workflow
Draft → Submitted → (Approved ⇒ Published) | Rejected(reason) → Draft
Data model (content schema)
public sealed class Post
{
public Guid Id { get; set; }
public Guid AuthorId { get; set; }
public string Title { get; set; }
public string Slug { get; set; } // unique, generated from title, immutable after publish
public string Excerpt { get; set; }
public string ContentJson { get; set; } // TipTap JSON (stored for re-editing)
public string ContentHtml { get; set; } // sanitized render, produced server-side
public string? CoverImageUrl { get; set; } // Cloudinary
public List<string> Tags { get; set; } // jsonb; e.g. Engineering | Onboarding | Community Insights
public PostStatus Status { get; set; } // Draft | Submitted | Approved | Rejected | Published
public bool IsFeatured { get; set; } // single feature slot
public string? RejectionReason { get; set; }
public DateTimeOffset? PublishedAt { get; set; }
}
Rules
- Slug: generated, unique (DB constraint), immutable once published.
- Status transitions validated in a domain service returning
Result<T>— illegal transitions yieldcontent.invalid_state. IsFeaturedis a single slot: setting it clears the previous featured post (same pattern as members featured flag).- Rejection requires a reason; rejected posts return to
Draftkeeping the reason for the author to see.
Error codes
content.not_found, content.invalid_state, content.invalid_post
Acceptance criteria
- Module scaffold matches existing modules (Members is the reference): DbContext, schema,
IEndpointModulestub, DI extension - EF migration creates the table with slug unique constraint
- Transition table fully tested (every legal + illegal transition)
- Featured single-slot behavior tested
Conventions (project-wide, non-negotiable)
- .NET 9, records for immutable shapes, file-scoped namespaces, primary constructors where they read well. Minimal-API endpoints grouped per module via
IEndpointModule.MapEndpoints. Result<T>(SharedKernel) instead of exception-driven control flow. Endpoint results map failures to ProblemDetails with the stable error codes listed above — the frontend keys off them.- Module owns its EF Core
DbContextmapped to its own Postgres schema. Modules never reference each other's internals — cross-module needs go through a public contract interface or an in-process domain event (IEventPublisher). - All external calls (GitHub, Stripe, Brevo, Cloudinary, Meilisearch) behind interfaces owned by the consuming module.
- Every list endpoint paginated (offset is fine). xUnit tests in
tests/CommunityPro.Tests/<Module>/following the existing harness patterns (seeMembers/MembersTestHarness.cs).
- Lenguaje dominante
- C#
- Estrellas
- 0
- Forks
- 0
- Métricas de merge de PR
- Sin PR fusionados en 30 d
Preparar el entorno
- Incluye un Dockerfile o un archivo de Docker Compose
- Sin plantilla de pull request
- Sin guía de contribución
Primeros pasos
- Lee el issue completo y luego la guía de contribución del proyecto.
- Comenta en el issue que vas a ocuparte — evita que dos personas hagan lo mismo.
- Haz un fork del repositorio y trabaja en una rama.
- Abre un pull request que haga referencia al número del issue.
Más de CommunityPro/community-pro-api
-
cross-cutting decision
Dificultad 5/5 Más de una semana Aptitud para principiantes 35/100
-
cross-cutting
Dificultad 4/5 3-5 días Aptitud para principiantes 58/100
-
admin
Dificultad 5/5 Más de una semana Aptitud para principiantes 35/100
-
admin
Dificultad 5/5 Más de una semana Aptitud para principiantes 35/100
-
sponsorship
Dificultad 4/5 3-5 días Aptitud para principiantes 48/100
Todos los issues de CommunityPro/community-pro-api
Issues similares
-
[i18n] 安装实例完成后的成功提示未正确本地化Abierto
Dificultad 2/5 1-3 horas Aptitud para principiantes 62/100
PCL-Community/PCL-CE#3658 ·
Los mantenedores suelen responder en 1 día
-
Deploy & Patch-issues opprettes ikke: create-pnd-issues.yml har feilet hver uke siden 2025-09-08Abierto
Dificultad 2/5 1-3 horas Aptitud para principiantes 62/100
Altinn/altinn-auth#4359 ·
Los mantenedores suelen responder en 1 día
-
アプリ: チャット 優先: 中 提案
Dificultad 2/5 1-3 horas Aptitud para principiantes 70/100
yksr-melt/Meltype#243 · 1 comentario ·
Los mantenedores suelen responder en 1 día
-
type/automation type/tech-debt
Dificultad 1/5 Menos de una hora Aptitud para principiantes 72/100
Los mantenedores suelen responder en 1 día
-
High-DPI fixes for release/1.3: editor toolbar icons and Color Picker layout (patch included)Abiertono-stack-trace
Dificultad 2/5 1-3 horas Aptitud para principiantes 83/100
Los mantenedores suelen responder en 1 día