Mentorship: mentor profiles + availability model (Phase 6.1, 6.2)
Nadie ha tomado este issue todavía.
Evaluación
- Dificultad
- 5/5
- Tiempo estimado
- Más de una semana
- Aptitud para principiantes
- 48/100
Línea de trabajo
Empieza leyendo Members/MembersTestHarness.cs y MemberProfileService para entender las convenciones de validación y pruebas; después, sigue IEndpointModule.MapEndpoints y el patrón del contexto de EF Core propiedad del módulo. El trabajo está terminado cuando tanto los endpoints de perfil como los de reemplazo completo de disponibilidad hacen cumplir las reglas indicadas, usan códigos de error estables de Result, validan las zonas IANA con NodaTime y la matriz de validación de xUnit pasa.
Escrito por el modelo de indexación a partir del texto del issue.
Descripción
Scope
New CommunityPro.Mentorship module (schema mentorship): mentor opt-in and weekly availability. This is the foundation ticket — model + timezone groundwork; requests/booking build on it.
Data model
public sealed class MentorProfile
{
public Guid MemberId { get; set; } // == AppUser.Id
public string Headline { get; set; }
public string TimezoneId { get; set; } // IANA id, e.g. "Africa/Lagos" — validate against NodaTime TZDB
public List<string> ExpertiseTags { get; set; }
public int Capacity { get; set; } // max concurrent mentees
public bool IsAcceptingMentees { get; set; } // auto-false at capacity, manual toggle too
}
public sealed class AvailabilitySlot
{
public Guid Id { get; set; }
public Guid MentorId { get; set; }
public DayOfWeek Day { get; set; }
public TimeOnly Start { get; set; } // local to MentorProfile.TimezoneId
public TimeOnly End { get; set; }
}
Endpoints (prefix /mentorship, active-member policy)
| Method | Path | Notes |
|---|---|---|
| PUT | /mentorship/mentors/me |
upsert opt-in: headline, timezone, tags, capacity, accepting toggle |
| PUT | /mentorship/mentors/me/availability |
replace-all slot list |
Rules
- Use NodaTime for all timezone work — validate
TimezoneIdagainst the TZDB; do not hand-roll DST math (this module's #1 gotcha; Lagos is UTC+1 year-round but mentors/mentees won't all be). - Slot validation:
End > Start, no overlapping slots on the same day, sane bounds (e.g. 15-min granularity). - Capacity ≥ 1, tags length-capped and deduped (mirror the skills validation in
MemberProfileService). - Mentor is a flag in this module, not an Identity role.
Error codes
mentorship.invalid_profile, mentorship.invalid_timezone, mentorship.invalid_slots
Acceptance criteria
- Invalid IANA id rejected; valid exotic ones (e.g.
Pacific/Chatham) accepted - Overlapping/inverted slots rejected
- Availability replace-all is transactional
- xUnit coverage for validation matrix
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
-
Workflows: a workflow stored with null conditions is skipped with an exception instead of runAbiertobug core
Dificultad 2/5 1-3 horas Aptitud para principiantes 72/100
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