[RACC] INKSPIRE — Marketplace premium de tatuajes en Chile 🇨🇱✨#265
[RACC] INKSPIRE — Marketplace premium de tatuajes en Chile 🇨🇱✨#265rchamycruz wants to merge 67 commits into
Conversation
Se crea la estructura base para la entrega 1 Documentación del proyecto final + gitignore inicial + readme con lo solicitado del proyecto
Se corrige el readme.md con lo solicitado.
Se instala openspec y se inicializa con openspec init para Claude y Github Copilot
Correccion openspec
Inicializa Specboot de LIDR
… for OpenSpec - Introduced `opsx-explore.prompt.md` to facilitate exploration of ideas and problem-solving without implementation. - Created `opsx-propose.prompt.md` for proposing new changes and generating necessary artifacts in one step. - Added `opsx-sync.prompt.md` to sync delta specs from changes to main specs, allowing for intelligent merging. - Implemented `openspec-apply-change` skill to manage task implementation from OpenSpec changes. - Developed `openspec-archive-change` skill for archiving completed changes in the experimental workflow. - Established `openspec-explore` skill to guide users through exploration and clarification of requirements. - Created `openspec-propose` skill for generating complete proposals with design and tasks. - Added `openspec-sync-specs` skill to update main specs with changes from delta specs. - Introduced a configuration file `config.yaml` for project context and artifact rules.
- Changed language standards in base-standards.md to require Spanish for all technical artifacts. - Updated data-model.md to reflect the new application name (INK-LINK) and modified comments accordingly. - Revised development_guide.md to align with the INK-LINK project. - Adjusted documentation-standards.md to mandate Spanish for all documentation. - Updated frontend-standards.md to reflect the transition from LTI to INK-LINK, including changes in technology stack from React to Angular 20. - Added a new prompt for modifying backend and frontend developer specifications to adopt the new tech stack (NetCore 10 C#, PostgreSQL, Angular 20).
…s in technical product owner agent
…del documentation - Introduced a new agent `tech-lead` to facilitate the decomposition of user stories into detailed implementation tasks, including guidelines for task structure and methodology. - Added comprehensive data model documentation for the INK-LINK application, detailing entity descriptions, field definitions, relationships, and an entity-relationship diagram.
- Added `cancelled_at` field to Booking entity in data model. - Revised CU-03 in documentation to clarify client review process without automatic notifications. - Updated project stack references to .NET Core 10 and Angular 20 across documentation. - Removed placeholder content from API spec file and marked videos and before/after pairs as Won't-Have for MVP. - Documented inconsistencies in a new issue file and outlined execution plan for resolution. - Adjusted anti no-show feature to Won't-Have in both readme and documentation.
… filtering artists, searching artists, viewing artist profiles, filtering by certification, booking slots, payment process, reservation history, chatbot quoting, interactive map, rating artists, and displaying brand sponsorships
- Enhanced the prompt registry in `00-all-prompts.md` with detailed metadata for each prompt executed during sessions. - Added a new file `all-us.md` containing a comprehensive backlog of user stories, including descriptions, acceptance criteria, and technical notes for each story. - Organized user stories into Must-Have and Should-Have categories with corresponding story points.
- Enhanced API specification with detailed endpoints for authentication, artist listings, bookings, reviews, and payments. - Added comprehensive schemas for user authentication, artist profiles, bookings, reviews, and payment processes. - Updated data model to remove deprecated fields from the Review entity and added relationship_type to Sponsorship. - Revised development guide to reflect accurate setup instructions for the INK-LINK project. - Addressed documentation coherence issues and clarified user story scopes. - Created issues for resolving gaps in dependencies and ensuring alignment with user stories.
…ing process and enhance user experience
…king, and review functionalities - Add backend support for searching artists with full-text search capabilities (US0005). - Create a frontend search bar with autocomplete for artists (US0005). - Implement backend endpoint for fetching complete artist profiles by slug (US0006). - Develop frontend artist profile page displaying portfolio and reviews (US0006). - Create reusable certification badge component for artists (US0007). - Implement backend availability endpoints for booking slots (US0008). - Develop frontend weekly calendar and booking summary components (US0008). - Integrate payment processing with Flow Chile for booking deposits (US0009). - Create frontend payment flow and confirmation screens (US0009). - Implement backend endpoints for user booking history and attendance confirmation (US0010). - Develop frontend "My Reservations" page with booking details and confirmation options (US0010). - Add backend quote calculation endpoint for tattoo pricing (US0011). - Create frontend chatbot for guided tattoo quoting process (US0011). - Implement geospatial artist search endpoint using PostGIS (US0012). - Develop interactive map view for exploring artists with Leaflet (US0012). - Create backend review submission endpoint with rating recalculation (US0013). - Develop frontend review form for multi-dimensional artist ratings (US0013). - Implement sponsorship section in artist profiles and badges in artist cards (US0014).
…mentos permanentes y skill prompt-registry - fixs/issue-004.md: informe de inconsistencias (api-spec, README, docs obsoletas, infra) + decisiones pendientes - Nuevos documentos permanentes: PROJECT_STATUS, DEVELOPMENT_PLAN, ARCHITECTURE, CONTRIBUTING, PROMPT_REGISTRY - Nueva skill prompt-registry (ai-specs/skills) con symlinks .claude/.cursor - development_guide.md: bloque duplicado eliminado + nota de estado objetivo - Registro de prompts actualizado (sesión 5) y MASTER_BOOTSTRAP_PROMPT versionado Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…MVP, README completo
- api-spec.yml regenerado (v2.0.0): numeración US corregida, schemas alineados a data-model,
nuevos endpoints /showcase, /artists/{id}/availability, /bookings/hold, /quotes/calculate,
pagos renombrados a /payments/create|confirm|return y regla 409 corregida (pending_payment)
- US0010: CA10-CA11 cancelación como alcance MVP (us0010.md + all-us.md)
- readme.md: secciones 2-7 completadas enlazando la documentación existente
- base-standards.md: §5 modelo recomendado (no obligatorio), §7 OpenSpec opcional/futuro
- issue-004 §G: registro de decisiones aplicadas; PROJECT_STATUS desbloqueado
- Registro de prompts actualizado (prompt 45)
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…y CI - backend/: Web API .NET 10 por capas (Controllers/Domain/Application/Infrastructure/Seed), health endpoint, xUnit + WebApplicationFactory (1/1 test verde), puerto 5000, CORS para localhost:4200, appsettings.Development.example.json - frontend/: workspace Angular 20 (scss, sin SSR), environments con apiUrl, fileReplacements producción, build y tests verdes (2/2) - docker-compose.yml: PostgreSQL 16 + PostGIS, MinIO con bucket inklink-images; perfil 'full' para stack completo dockerizado (api + web con nginx) - Dockerfiles multi-stage backend y frontend - .github/workflows/ci.yml: build + tests de ambos proyectos en cada PR - global.json fija SDK 10.0.302; .gitignore ampliado (.NET, Angular, secretos) - Microsoft.OpenApi fijado en 2.10.0 (corrige vulnerabilidad NU1903 transitiva) Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
… seed completo - 13 entidades del modelo de datos con enums como VARCHAR (HasConversion<string>) - InkLinkDbContext: Fluent API con índices únicos (email, slug, booking_id), índices de consulta (commune, is_published, rating_avg, booking_date, status, is_active), JSONB para reference_images, snake_case naming, TIMESTAMPTZ - Migración InitialSchema generada - DatabaseSeeder: 3 clientes + 5 artistas + 1 admin (bcrypt Test1234!), 12 estilos, perfiles completos con coordenadas reales de Santiago, 12 items de portafolio c/u, agenda Ma-Sa 10-19, 3 certificaciones, 2 premios, 2 auspicios. Idempotente. Activable con dotnet run --seed - Test de integración TestContainers (postgis:16-3.4): migración + seed + query por email + coherencia de datos — 2/2 tests verdes Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
- AuthService: email case-insensitive, verificación BCrypt, null genérico ante cualquier fallo (sin revelar existencia del email) - JwtTokenGenerator: HS256, claims user_id/email/role/first_name, artist_profile_id solo para artistas, expiración 24h configurable - AuthController: POST /api/auth/login (200/400/401) + GET /api/auth/me protegido con [Authorize] - FluentValidation para LoginRequest; rate limiting 5 req/min por IP en login - JWT Bearer configurado; secret vía configuración (override Jwt__Secret) - 7 tests unitarios escritos antes de implementar (red-green): login ok, password/email inválidos, case-insensitive, claims, artist_profile_id, 24h - Verificado E2E contra PostgreSQL dockerizado con datos seed Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
- AuthService Angular con signals (currentUser, isAuthenticated), localStorage con expiración, logout que limpia sesión y redirige - LoginComponent standalone: formulario reactivo Material (email+password), validaciones, error genérico 'Credenciales inválidas', toggle visibilidad, redirect a returnUrl post-login, mobile-first - authGuard funcional: redirige a /login?returnUrl= si no hay sesión - authInterceptor: adjunta Bearer a requests del API; 401 => logout - Página protegida /mi-cuenta (demuestra CA6/CA7) + toolbar con sesión - Angular Material 20 + animations + tema azure-blue - 9/9 tests unitarios verdes (AuthService, authGuard, LoginComponent, App) Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…pts actualizados Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
[Docs] Preparación Entrega 2 — análisis, documentos permanentes y api-spec v2.0.0
[Fase 0] Fundaciones — scaffolding .NET 10 + Angular 20, Docker y CI
Create a shared skill that enforces INK·LINK's dark premium design system across all frontend work. Ensures visual consistency by documenting: - CSS custom property tokens (--ink-* palette) - Typography rules (Inter + Playfair Display) - Component patterns (navbar, cards, hero, forms, account) - Layout grid system and responsive breakpoints - Animation standards and accessibility guidelines - Explicit prohibitions and per-component checklist Skill is available to: - Claude via .claude/skills/ symlink to ai-specs/ - Copilot via .github/skills/ SKILL.md - Copilot prompts via .github/prompts/ quick-reference Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
[DOCS] Add UI/UX Design System Skill for Claude & Copilot
Add prompt registry entries for: - Session 6: US0003 backend/frontend, MinIO seed, UI/UX dark theme - Session 7: UI/UX design system skill, PR creation, plan analysis Total: 7 sessions, 53 prompts documented. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
[DOCS] UI/UX Design System Skill + Registro de prompts sesiones 6-7
TASK0001 - Backend GET /api/artists con filtros combinados: - ArtistQueryService con query builder dinámico (AND logic) - Filtros: style, minPrice, maxPrice, minRating, certified, available, type - Paginación con page/pageSize (máx 50) - ArtistsController con validación de inputs - 10 tests TDD con TestContainers (todos en verde) TASK0002 - Frontend panel de filtros reactivo: - ArtistFilterService con signals, debounce en precio (300ms) - FilterPanelComponent: estilos (checkboxes), precio (range), rating (stars), certificación/disponibilidad (toggles), tipo (radio) - ArtistsPageComponent: sidebar desktop / bottom-sheet mobile, contador de resultados, skeleton loading, estado vacío, sync query params URL - 27 tests en verde Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
- Add 'Artistas' nav link in toolbar (visible to all users) - Add 'Explorar y filtrar artistas' CTA between hero and sections - Fix 'Ver más' links in showcase sections to route to /artistas - Verify ArtistCard works in artists page context Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
- Add Material Icons font to index.html (fixes 'star' text instead of icon) - Override MDC label text color vars for checkbox/radio/slide-toggle (fixes black text invisible on dark background) - Change style filter from single-select to multi-select (styles: string[]) with OR logic — artists matching any selected style are returned - Backend: ArtistFilterRequest.Styles is now string[]?, query uses slugs.Contains() for OR filtering - Add test: MultipleStyleFilters_Returns_Artists_With_Any_Of_The_Styles - Remove star rating number label, keep icon only - Fix radio button label color with .mat-mdc-radio-button override Backend: 27/27 tests ✅ Frontend: 27/27 tests ✅ Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
The seed uses JPEG photos as fake brand logos. The previous CSS applied filter: brightness(0) invert(1) which turned JPEGs to solid white — invisible on dark background. Fix: wrap each logo in a translucent white pill (rgba 12% opacity) with border, remove brightness/invert filter. Works with any image format. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
[US0004] Filtrar artistas por estilo, precio, rating y certificación
* docs: update PROJECT_STATUS + prompt registry for US0004 done / US0005 start - PROJECT_STATUS: US0004 Done (PR #8 merged), US0005 En desarrollo - prompts/00-all-prompts.md: Session 8 registered (prompts 54-58) covers US0004 impl, nav fixes, dark theme fixes, multi-select, sponsor logos fix, PR and merge Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * feat(us0005): text search for artists — backend ILIKE + frontend SearchBar Backend: - ArtistFilterRequest: add Search field - ArtistQueryService: ILIKE filter on name/bio/commune/style + GetSuggestionsAsync - ArtistsController: GET /api/artists/suggestions?q= endpoint - ArtistSearchTests: 9 new TDD integration tests (36/36 pass) Frontend: - ArtistFilters: add search?: string - ArtistSuggestionsResponse interface - ArtistFilterService: search in buildParams + hydrateFilters + clearFilters - SearchBarComponent: debounce 300ms, suggestions dropdown, dark theme - ArtistsPageComponent: SearchBar integrated in hero section - URL sync for search param Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * fix: search dropdown stacking context — move to own section with z-index Move <app-search-bar> out of hero into dedicated __search-section with position: relative; z-index: 20 to create proper stacking context. Dropdown now appears correctly above results without overlap issues. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * fix: search dropdown uses position:fixed to bypass sticky sidebar stacking context Root cause: position:sticky on sidebar creates a CSS stacking context that paints on top of the dropdown regardless of z-index. Fix: dropdown now uses position:fixed with JavaScript-calculated top/left/width from getBoundingClientRect(). z-index: 9999 ensures it always floats above everything. Repositions on scroll and resize events. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --------- Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
…views (#10) * docs: update PROJECT_STATUS + prompt registry for US0005 done / US0006 start - PROJECT_STATUS: US0005 Done (PR #9 merged), US0006 En desarrollo - prompts/00-all-prompts.md: Session 9 registered (prompts 59-63) covers US0005 impl, search dropdown fixes, PR merge, US0006 kickoff Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * feat(us0006): artist profile page — GET /api/artists/{slug} + ArtistProfileComponent Backend: - ArtistsDtos: PortfolioItemDto, CertificationDto, AwardDto, AvailableSlotDto, ArtistProfileDto, ReviewDto, ReviewListResponse - ArtistQueryService: GetArtistBySlugAsync + GetArtistReviewsAsync (eager load, no N+1) - ArtistsController: GET /api/artists/{slug} + GET /api/artists/{slug}/reviews - ArtistProfileTests: 11 new TDD integration tests (47/47 pass) Frontend: - artist-profile.models.ts: all DTO interfaces - ArtistProfileService: getArtistProfile + getArtistReviews - ArtistProfileComponent: hero + portfolio grid + lightbox + tarifas + certs + awards + sponsors + availability preview + paginated reviews - app.routes.ts: /artista/:slug route (lazy) - 4 component tests (37/37 pass) Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * feat: use real tattoo images from docs/tattoo-styles.yml in seed data Add TattooImageCatalog.cs with 12 style arrays (120+ real URLs) sourced from Wikimedia Commons and Flickr (CC BY, CC BY-SA, CC BY-NC-ND, Public Domain). Update DatabaseSeeder to use TattooImageCatalog.GetUrl(style, index) for all 12 portfolio items per artist. Falls back to picsum if style not found. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * fix: artist card images + awards badge in home and /artistas Backend: - ArtistCardDto: add FeaturedImageUrl (featured portfolio item) + HasAwards - ArtistQueryService.ToArtistCard: populate FeaturedImageUrl from portfolio, HasAwards from Awards.Any(), include Awards in all queries - ShowcaseService.ToArtistCard: same additions for consistency Frontend: - ArtistCard model: add featuredImageUrl + hasAwards fields - ArtistCardComponent.cardImage: uses featuredImageUrl before profilePhotoUrl - ArtistCardComponent: add cardHasAwards computed signal - artist-card.html: add award badge (emoji_events icon, gold color, right:36px) - artist-card.scss: __badge--award modifier (gold, offset from certified badge) Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * fix: artist card shows portfolio image + awards badge Backend: - ArtistCardDto: add FeaturedImageUrl (first portfolio item) + HasAwards bool - ArtistQueryService.ToArtistCard: map FeaturedImageUrl + HasAwards, include Awards - ShowcaseService.ToArtistCard: same fields for consistency - Both Available and non-Available paths include Awards Frontend: - ArtistCard model: add featuredImageUrl? + hasAwards? fields - cardImage computed: fallback chain item.imageUrl -> featuredImageUrl -> profilePhotoUrl - artist-card.component.html: add trophy badge (emoji_events) when hasAwards - artist-card.component.scss: split badge into --certified (green) and --award (gold) Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --------- Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
- Crea CertificationBadgeComponent standalone (sm/md) con aria-label - Integra badge en ArtistCard (body, debajo de meta info) - Integra badge en ArtistProfileComponent (sidebar certificaciones, size=md) - Reemplaza div manual 'cert-badge' en perfil con el componente - 5 tests TDD → 42/42 frontend tests en verde - Actualiza PROJECT_STATUS.md: US0007 Done - Registra sesiones 10-11 en prompts/00-all-prompts.md (prompts 64-69) Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
* docs: actualiza PROJECT_STATUS y HANDOFF — US0007 mergeada, US0008 en desarrollo
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
* feat(us0008): TASK0001 — endpoints de disponibilidad semanal y hold temporal
- GET /api/artists/{id}/availability?week= genera slots desde la grilla
semanal excluyendo bookings confirmados, holds activos, blocked dates
y horarios pasados
- POST /api/bookings/hold crea booking pending_payment con TTL de 5 min,
deposito = min_session_price * deposit_percentage / 100
- Race condition serializada con SELECT FOR UPDATE por artista
- Limpieza lazy de holds expirados al crear un nuevo hold
- 12 tests de integracion (Testcontainers) en verde; suite completa 59/59
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
* feat(us0008): TASK0002 — calendario semanal y resumen de reserva con countdown
- WeeklyCalendarComponent: vista semanal con navegacion solo a futuro,
slots disponibles/ocupados, skeleton y reintento en error
- BookingSummaryComponent (ruta /reserva, authGuard): artista, fecha,
hora, duracion, rango de precio, deposito y countdown de 5 minutos;
al expirar deshabilita el pago y ofrece volver a elegir horario
- Integracion en perfil de artista: seleccion de slot crea el hold;
sin sesion redirige a login con returnUrl y slot preseleccionado
en query params (CA5); 409 muestra mensaje de horario tomado
- BookingService con signal currentBooking para el resumen
- 12 tests nuevos; suite frontend 54/54 en verde
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
* docs(us0008): cierre de US — PROJECT_STATUS, HANDOFF y registro de prompts (sesión 12)
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
* fix(artist-profile): widget de disponibilidad usaba 0=domingo en vez de 0=lunes
El modelo de datos define day_of_week con 0=lunes...6=domingo, pero el
widget del sidebar (US0006) mapeaba los indices con el array partiendo
en domingo, mostrando lunes-viernes cuando el seed define martes-sabado.
El calendario de reserva (US0008) ya usaba la convencion correcta, lo
que hacia evidente la incongruencia. Test de regresion agregado; suite
frontend 55/55.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
---------
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
#13) * feat(us0009): TASK0001 — integración Flow (crear orden + webhook) mock-first - IFlowClient con FlowClient real (firma HMAC-SHA256 sobre parámetros ordenados según API de Flow) y MockFlowClient activo mientras no haya credenciales sandbox (Flow:UseMock=true) - POST /api/payments/create: valida owner (403), booking pagable (409), crea Payment pending con platform_fee 7% configurable y artist_amount; el retry reutiliza el Payment con una orden Flow nueva (CA5) - POST /api/payments/confirm (webhook idempotente): pago OK → Payment completed + Booking confirmed sin aprobación del artista (CA3, CA9); rechazo mantiene pending y el TTL del hold libera el slot (CA6) - GET /api/payments/return: sincroniza estado y redirige a la SPA (/reservas/{id}?status=success|failed) - POST /api/payments/mock-outcome (solo UseMock): simula el resultado del checkout y dispara el webhook como lo haría Flow - GET /api/bookings/{id} (owner-only) para la pantalla de confirmación; BookingDto ahora refleja status y hasReview reales - 9 tests de integración; suite backend 68/68 en verde Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> * feat(us0009): TASK0002 — flujo de pago y pantalla de confirmación - BookingSummary: 'Pagar depósito' llama a /payments/create y redirige al checkout de Flow (CA1); error muestra mensaje y permite reintentar - PaymentReturnComponent (/reservas/:bookingId, authGuard): confirmación con nº de reserva, artista, fecha, hora y monto pagado (CA4); rechazo muestra error con 'Reintentar pago' que crea una orden nueva (CA5); confía en el estado real del booking si el webhook llega tarde - MockCheckoutComponent (/pago-simulado): checkout simulado mientras no haya credenciales sandbox de Flow; botones de pago exitoso/rechazo - BookingService: getBooking, createPayment, sendMockOutcome, redirectTo - 7 tests nuevos; suite frontend 61/61 en verde Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> * docs(us0009): cierre de US — PROJECT_STATUS, HANDOFF y registro de prompts Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> * docs: corrige comando de infra local — los servicios son db y storage, no postgres/minio Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> * fix(i18n): registra locale es-CL — las fechas de DatePipe salían en inglés La app nunca registró un locale, por lo que DatePipe usaba en-US por defecto ('Thursday 16 July 2026' en el resumen de reserva). Se registra es-CL globalmente en app.config.ts; afecta a todas las fechas de la app (resumen, confirmación, reseñas). Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> * docs: registra como pendiente diferido la integración Flow real con sandbox Decisión 2026-07-15: US0009 queda mock-first; la conexión con la cuenta sandbox de Flow se retomará más adelante (credenciales + UseMock=false + prueba e2e). No bloquea el resto del backlog. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> --------- Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
…14) * feat(us0010): TASK0001 — historial de bookings, confirmar asistencia y cancelar - GET /api/bookings/me: historial paginado del cliente autenticado con filtro por status; próximas primero (asc), luego pasadas (desc); incluye resumen del artista y flag hasReview (CA1-CA3, CA6) - POST /api/bookings/{id}/complete: confirmed + sesión terminada → completed; 403 si no es owner, 409 si futura o estado inválido (CA8-CA9) - POST /api/bookings/{id}/cancel: confirmed + fecha futura → cancelled con cancelled_at; el slot vuelve a estar disponible; sin reembolso automático en el MVP (CA10-CA11) - Refactor: mapeo Booking→DTO compartido en BookingMapper; GetBooking movido de AvailabilityService a BookingService - 11 tests de integración; suite backend 79/79 en verde Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> * feat(us0010): TASK0002 — página Mis Reservas con acciones por estado - MyBookingsComponent (/mis-reservas, authGuard): listado paginado con skeleton, estado vacío con CTA a vitrina (CA7) y toast de feedback - BookingCardComponent: artista clickeable, fecha/hora, badge por estado (confirmada=azul, completada=verde, cancelada=rojo, CA4), detalle expandible (CA5), confirmación inline antes de completar/cancelar recordando la política de cancelación (CA10); CTA Calificar visible en completadas sin reseña, deshabilitado hasta US0013 (CA6) - Enlace 'Mis reservas' en el menú autenticado (CA1); el CTA de la confirmación de pago ahora apunta a /mis-reservas - BookingService: getMyBookings, completeBooking, cancelBooking - 13 tests nuevos; suite frontend 74/74 en verde Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> * docs(us0010): cierre de US — PROJECT_STATUS, HANDOFF y registro de prompts Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> * fix(us0010): holds expirados no aparecen en el historial; los vivos permiten retomar el pago Caso borde reportado: un hold que expiraba sin pagar quedaba visible en Mis Reservas como 'Pendiente de pago' sin acción posible (reserva zombi). El slot sí se liberaba correctamente (la disponibilidad ignora holds expirados y el próximo hold los elimina), el problema era solo de listado. - GET /bookings/me excluye pending_payment con expires_at vencido - Los pending_payment con hold vivo ahora muestran 'Continuar pago' (nueva orden Flow + redirect al checkout); si expira justo al hacer click, se recarga la lista con aviso - Tests de regresión backend (12) y frontend (78) en verde Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> --------- Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
* feat(us0013): calificar artista post-sesion backend y frontend * docs: login-samples + issue-005 foto reseña pendiente - login-samples.md: credenciales de ejemplo del seed (todos usan Test1234!) - fixs/issue-005.md: foto de tatuaje en reseña no persiste (tattooPhotoUrl siempre null; upload presigned-URL pendiente, CA5 US0013 no cumplida) Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --------- Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
* feat(us0012): explorar artistas en mapa interactivo TASK0001 — Backend: - GET /api/artists/geo?lat&lng&radiusKm — PostGIS ST_DWithin via raw NpgsqlConnection (evita conflictos con naming conventions de EF Core) - GeoFilterRequest DTO con filtros opcionales de US0004 - GeoService: max 100 resultados, ordenados por distancia, filtros combinables (estilos, precio, rating, certificado, tipo) - ArtistsController: endpoint /geo + validacion IsValidGeoRequest - 5 tests TDD: dentro/fuera de radio, no-publicados, filtro certified, 400 TASK0002 — Frontend: - leaflet + leaflet.markercluster instalados; CSS en angular.json - MapService: GET /api/artists/geo - MapViewComponent (ruta /mapa): - Geolocalización con fallback a Santiago (-33.4489, -70.6693) - Mapa Leaflet + OpenStreetMap tiles - Clustering automático con MarkerClusterGroup - Marcadores con thumbnail del artista (circle fallback) - Popup por artista: foto, nombre, rating, estilo, comuna, CTAs Ver perfil / Reservar - Selector de radio: 1km / 5km / 10km / Ciudad - Toggle vista mapa ↔ lista (ArtistCardComponent reutilizado) - Filtros de US0004 integrados (estilos, rating, certified, tipo) - app.routes.ts: ruta /mapa lazy-loaded - app.html: link Mapa en navegacion principal - GeoFilters interface en artist-filter.models.ts - 9 tests en verde Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * fix(us0012): fix map render - remove Angular Material, keep container always in DOM - Rewrote MapViewComponent without @angular/material (not installed) - Moved #mapContainer outside @if so ViewChild(static:true) resolves correctly - Use CSS map-wrapper--hidden class to toggle visibility instead of *ngIf - Use setViewMode() replacing onViewModeChange(MatButtonToggleChange) - Fixed SCSS: removed orphaned blocks and dead mat-* class references - Updated tests: spy initializeMap to prevent Leaflet errors in headless env - 9/9 frontend tests pass, build succeeds Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * fix(us0012): constrain map to viewport height - prevent overflow - Changed .map-page from min-height to height: calc(100vh - 64px) with overflow:hidden - Set .map-wrapper min-height:0 so flex:1 computes height correctly for absolute child - Set .list-wrapper overflow-y:auto for scrollable list within constrained page Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * fix(us0012): CSS de Leaflet vía styles.scss, reemplazo de imagen seed y cierre de documentación - Mueve los CSS de Leaflet/MarkerCluster de angular.json a src/styles.scss (el dev server no recarga angular.json; ver fixs/issue-006.md + issue-map.png) - Reemplaza imagen seed de lettering (Flickr CC BY-NC-SA) por Corpus_Vile.JPG (Wikimedia Commons, dominio público) en TattooImageCatalog y tattoo-styles.yml - Refactor de map-view.component.html sin Angular Material (pendiente de sesión anterior) - Actualiza PROJECT_STATUS, HANDOFF y registro de prompts (sesión 13) - Suites en verde: backend 93/93, frontend 101/101 Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> --------- Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
* feat(us0014): TASK0001 — backend alinea perfil con api-spec: sponsorships con relationshipType
GET /api/artists/{slug} ahora devuelve sponsorships[] (id, brandName,
brandLogoUrl, relationshipType en minúsculas según enum de api-spec)
en lugar de sponsorBadges sin tipo. ArtistCard no cambia.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
* feat(us0014): TASK0001 — seed con los 3 tipos de relación de auspicio
- Matías: Eternal Ink (ambassador) + Cheyenne (certified); Fernanda: Dynamic Color (sponsored)
- docker-compose y seed-images.ps1 suben los 3 logos de marca a MinIO
- Test de seed exige 3 sponsorships cubriendo los 3 tipos
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
* feat(us0014): TASK0001 — sección "Auspiciado por" en perfil y badges de marca en cards
- SponsorshipSectionComponent: logo + nombre + tipo de relación como badge
(Embajador/Auspiciado/Certificado), fallback con inicial si el logo falla,
oculta la sección sin sponsors (CA1, CA2, CA4)
- SponsorBadgesComponent compartido para cards: máx 3 logos + "+N más",
fallback a nombre de marca (CA3)
- Modelos alineados a api-spec: ArtistProfileDto.sponsorships con relationshipType
- 11 tests nuevos; suite frontend 112/112
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
* docs(us0014): cierre de US — estado, handoff, registro de prompts y fix seed-images
- PROJECT_STATUS y HANDOFF: US0012 ✅ Done (PR #16), US0014 🟣 en revisión
- CAs de us0014.md y criterios de done de task0001.md marcados
- Registro de prompts: prompt 80 (sesión 13)
- scripts/seed-images.ps1: fix del fallback Docker en Windows (alias mc no
persistía entre contenedores efímeros y --network host no funciona en
Docker Desktop; ahora un solo contenedor unido a la red del compose)
- Suites en verde: backend 94/94, frontend 112/112
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
* docs(us0014): referencia al PR #17 en PROJECT_STATUS y HANDOFF
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
---------
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
…egún cotización (#18) * docs(us0011): decisión depósito-según-cotización (issue-007) y CA9 - fixs/issue-007.md: inconsistencia depósito fijo vs chatbot; decisión del usuario: el hold recalcula la cotización server-side y el depósito usa máx(mínimo cotizado, min_session_price) como base; sin cotización, fallback actual - CA9 agregado en us0011.md y all-us.md; nota técnica de servicio único - api-spec: QuoteResponse.factors (aditivo) y descripción de depositAmount con piso Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> * feat(us0011): TASK0001 — POST /api/quotes/calculate con fórmula determinística - QuoteCalculatorService: base = max(min_session_price, hourly_rate × horas por tamaño coin=1/palm=2/hand=4/arm=6); factores multiplicativos cover-up +30%, color +20%, zona difícil +15%; rango [base×0.8, base×1.3] - depositAmount con piso min_session_price (CA9 / issue-007) - Endpoint público con validaciones: artista publicado (404), estilo (404), tamaño (422) - 10 tests de integración Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> * feat(us0011): hold calcula estimado y depósito desde la cotización (CA8-CA9) Con sizeReference válido el hold recalcula la fórmula server-side (nunca acepta montos del cliente) y el booking hereda el rango cotizado; depósito con piso min_session_price (issue-007). Sin datos de cotización o tamaño no reconocido, fallback al comportamiento previo. 3 tests nuevos (15/15). Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> * feat(us0011): GET /api/styles — catálogo público de estilos (id, name, slug) El chatbot necesita resolver los slugs de estilos del artista a ids para QuoteRequest. Agregado a api-spec.yml (aditivo). Test de integración (11/11). Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> * feat(us0011): TASK0002 — chatbot wizard conversacional de cotización - QuoteChatbotComponent: overlay con 5 pasos (zona, tamaño, estilo del artista, referencias opcionales, color/cover-up), conversación derivada del estado (atrás = limpiar respuesta, CA6), rango + depósito + factores al final (CA3), CTA reservar que salta al calendario (CA5) - QuoteService: calculate/getStyles + draft en memoria y localStorage si autenticado (CA7); el hold envía los datos de la cotización (CA8) - CTAs del hero "Cotizar"/"Reservar" ahora funcionales (CA1) - 14 tests nuevos; suite frontend 126/126 Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> * docs(us0011): cierre de US — CAs, estado, handoff y registro de prompts - CAs de us0011.md marcados (CA8 con nota: referencias solo preview local, upload a storage pendiente como issue-005) - PROJECT_STATUS y HANDOFF: US0014 ✅ Done (PR #17), US0011 🟣 en revisión - Registro de prompts: 81-82 (sesión 13) - Suites en verde: backend 108/108, frontend 126/126 Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> * docs(us0011): referencia al PR #18 y conteos de tests actualizados Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> --------- Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
…os (#19) * chore(flow): configuración segura de credenciales sandbox de Flow - backend.csproj: UserSecretsId para `dotnet user-secrets` (secretos locales fuera del repo) - appsettings.Development.example.json: sección Flow alineada a FlowSettings (UseMock/ApiBaseUrl/FrontendBaseUrl) - docker-compose: Flow__UseMock/ApiKey/SecretKey desde .env (gitignored) - .env.example nuevo con las variables documentadas Las claves nunca se commitean: user-secrets o appsettings.Development.json (gitignored) en local; variables de entorno en producción. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> * fix(us0008): limpieza de holds expirados fallaba si el hold inició un pago La limpieza perezosa borraba el booking expirado sin borrar antes su fila de payments (FK violation), dejando bloqueados todos los holds futuros del artista. Detectado probando el sandbox de Flow. Ahora se eliminan primero los pagos pendientes de esos holds. Test de regresión (13/13). Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> * feat(flow): FlowClient expone el cuerpo del error de Flow en fallos HTTP Antes EnsureSuccessStatusCode ocultaba el motivo (p. ej. code 1620 email inválido); ahora la excepción incluye el JSON de error de Flow. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> * docs(flow): guía de pruebas del sandbox — levantar proyecto, tarjetas y flujo e2e - docs/flow-sandbox-testing.md: cómo levantar el proyecto, configurar credenciales sin exponerlas, flujo de prueba completo (email real del pagador, tarjetas Webpay de integración, confirm manual del webhook en local por la limitación de localhost) y verificación - readme.md §2.6: comandos de arranque/tests + tarjetas de prueba + enlace - development_guide.md: puntero a la nueva guía Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> * fix(tests): PaymentTests fuerzan Flow:UseMock=true (hermeticidad) WebApplicationFactory corre en entorno Development y cargaba el appsettings.Development.json local; con credenciales sandbox configuradas (UseMock=false) los 5 tests de pago intentaban pegarle a Flow real. Suite backend 95/95. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> --------- Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
…ro de prompts (#20) * docs: register session 14 prompts (87-94) - US0012 map fixes Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * docs: sincroniza estado tras merges de PR #18 y #19 — backlog completo - PROJECT_STATUS: 13/13 US ✅ (backlog 80 SP completo), bloqueo #3 de Flow resuelto (validado e2e contra sandbox), sin bloqueos activos, conteos 109/126, próximos pasos → entrega final - HANDOFF: estado detallado con la validación del sandbox, hallazgos del PR #19 y contexto de BD dev (email real de la clienta seed) - Nota de trazabilidad actualizada: prompts de US0012 recuperados en la sesión 14 (registro de Copilot) Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> --------- Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
* docs(entrega): consolida readme para la entrega final - §7 Pull requests: tabla completa de los 20 PRs mergeados + 3 documentados en detalle (#13 Flow mock-first, #18 chatbot + decisión issue-007, #19 validación sandbox e2e) - §2.4: infraestructura real (CI GitHub Actions existente, secretos por entorno, alcance de despliegue) - §2.6: 235 tests en verde (109 backend + 126 frontend), frameworks reales - §4: endpoints /styles y availability agregados a la tabla - §0.4: nota de alcance de despliegue - Registro de prompts: sesión 15 (prompt 95) Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> * docs(entrega): completa prompts.md — registro curado de las 15 sesiones Secciones 2.4/2.5/2.6/6/7 que estaban "PENDIENTE" completadas con los prompts más representativos (máx 3 por sección, verbatim, sin eliminar existentes); §4 actualizada con la spec v2.0.0 como fuente de verdad y la decisión de issue-007. Nota obsoleta de §4 retirada. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> --------- Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
…4 B5) (#22) - Nota de vigencia global: la visión v1 se acotó a flujo 100% cliente; backlog vigente all-us.md y contrato api-spec.yml - CU-01: sin registro ni notificaciones; depósito según cotización (issue-007) - CU-02: artista = datos seed, fuera del MVP (issue-003) - CU-03: US0013 sin foto de curación 90 días ni respuesta del artista - C4 nivel 3: nota as-built remitiendo a ARCHITECTURE.md - Apéndice stack: Angular Material + SCSS (no Tailwind) - Registro de prompts: 97 Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
…pts (#23) Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
…9) (#24) * docs(rediseno): plan de rediseño Figma + código de referencia exportado desde Figma Make Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_014ACbKPTZukaGQNFgr9FpzB * style(rediseno): fase 0 — tokens Figma, tema Material oscuro/dorado y rebrand INKSPIRE - Variables CSS globales actualizadas a la paleta del prototipo (#0D0D0D / #D4AF37 / #1E1E1E, radio 16px) - Tema Angular Material M3 oscuro con tokens de sistema fijados a la marca (reemplaza azure-blue) - Playfair Display reemplazada por var(--ink-font-display) (Inter/Geist) en todos los componentes - Marca visible INK·LINK renombrada a INKSPIRE (título, meta, nav, títulos de página, spec) - Claves de localStorage inklink_* intactas para no invalidar sesiones Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_014ACbKPTZukaGQNFgr9FpzB * style(rediseno): fase 0 — ajustes de nav y rebrand INKSPIRE en login Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_014ACbKPTZukaGQNFgr9FpzB * feat(rediseno): home con estructura del prototipo Figma (VistaHome) - Shell global: nav fija transparente con blur al hacer scroll, nav movil inferior y footer INKSPIRE - Hero full-viewport con buscador funcional (search + estilo via query params al listado), tags rapidos y stats - Secciones: confianza, carrusel top_rated, estilos populares, banner, cerca de ti, como funciona, premiados, resenas de comunidad, newsletter y CTA final - Tarjeta de artista redisenada segun TarjetaArtista del prototipo (badges, rating, chips de estilo, precio/hr) - Utilidades compartidas (btn-gold, chips, gold-label, icon-tile) movidas a styles.scss - Budget anyComponentStyle ajustado a 10kB/20kB por la landing completa - Specs de showcase-page actualizados a la nueva estructura; 126/126 tests en verde Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_014ACbKPTZukaGQNFgr9FpzB * feat(rediseno): perfil de artista con estructura del prototipo Figma (VistaPerfilArtista) - Hero backdrop con obra destacada + header con avatar dorado, badges (verificado/sanitario/premiado/auspiciado), rating y chips de estilos - Tabs Portafolio / Resenas / Info & tarifas segun el prototipo - Resenas: resumen agregado con barras de 4 dimensiones + tarjetas por resena - Info: sobre mi, grid de tarifas y politicas, certificaciones, premios, auspicios y panel de ubicacion - Booking card sticky en desktop (precio/hr, deposito, Cotizar con IA, Reservar) y booking bar fija en movil - Flujos intactos: chatbot cotizador, calendario semanal de reserva, hold de slot y lightbox - 126/126 tests en verde Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_014ACbKPTZukaGQNFgr9FpzB * docs(rediseno): estado del rediseno Figma en PROJECT_STATUS y HANDOFF * feat(rediseno): listado de artistas con filtros Figma + favoritos + datos seed ampliados - Filtro de comuna (select dropdown) en panel de filtros del listado - Filtro 'Solo premiados' (toggle, client-side sobre hasAwards) - Slider de precio máx. por hora en vez de inputs min/max - FavoritesService con persistencia en localStorage - Botón favorito (corazón) en tarjeta de artista - Seed ampliado: 14 artistas con reviews, certificaciones, premios y auspicios - Filtro de comuna en Home conectado a /artistas via queryParam search - 126/126 tests en verde; ng build producción OK Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * docs(rediseno): actualizar HANDOFF con estado de fase 3 completada Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * fix(rediseno): corregir 4 issues del Home Figma - fix-001: Portfolio images ya no se repiten entre artistas (offset * 12 + picsum fallback) - fix-002: Estilos populares muestra 12 estilos (uno por estilo, no solo el más popular) - fix-003: Botón 'Cotiza con IA' navega al perfil del artista top con ?cotizar=1 y auto-abre chatbot - fix-004: Botón 'Cerca de mí' agregado al Home con estilo dorado, navega a /mapa Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * fix(seed): reemplazar imágenes Flickr/Wikimedia por Unsplash del Figma - TattooImageCatalog reescrito con 12 imágenes Unsplash del prototipo Figma - Rotación por artista (mismo enfoque que Figma) para portfolios variados - Creado fixs/figma-images.yml como referencia única de imágenes del diseño - Creado fixs/issue-008.md documentando el problema de imágenes incorrectas - Tests actualizados para reflejar 14 artistas (23 usuarios) en seed expandido - ShowcaseTests: popular_styles tiene su propio límite fijo (1 por estilo) Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * fix: resolve 7 issues (009-015) — chatbot, carousel, scroll, payment, map, account, reviews - fix-009: Cotizar con IA opens general chatbot modal (no artist required) - fix-010: Estilos populares carousel single-row (removed flex-wrap) - fix-011: Scroll restoration on route change (withInMemoryScrolling) - fix-012: Flow payment mock enabled in Development config - fix-013: PostGIS extension auto-created before migrations - fix-014: Account page text visible with theme CSS variables - fix-015: Reviewable bookings seeded (completed without reviews) Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * fix: chatbot general quote, carousel arrows, better hold errors (016-018) - fix-016: QuoteCalculatorService handles Guid.Empty by averaging all artists - fix-017: Popular styles carousel with wrapper, padding, and arrow buttons - fix-018: Booking hold shows specific error messages per HTTP status Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * fix: handle stale JWT after DB reseed (500 on hold) Root cause: after dropping/reseeding the DB, existing JWTs contain user IDs that no longer exist, causing FK violation on bookings insert. - AvailabilityService: validate client exists before creating hold - Artist profile: show HTTP status code in hold error message - Add console.error for debugging hold failures Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * fix(chatbot): send Guid.Empty instead of empty string for general quote Empty string '' cannot deserialize to Guid, causing 400. Now sends '00000000-0000-0000-0000-000000000000' which the backend handles via CalculateGeneralAsync (averaging all published artists). Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * fix(chatbot): ocultar botón reservar en modo general + docs y reglas de trazabilidad - fix-019: botón 'Reservar' oculto cuando chatbot es general (sin artista) - docs/base-standards.md §8: nueva sección de trazabilidad de issues (registro en fixs/, plan con checks, actualización obligatoria de docs) - PROJECT_STATUS.md: tabla de issues 008-019 resueltos - HANDOFF.md: estado detallado actualizado con todos los cambios de sesión Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --------- Co-authored-by: Claude Fable 5 <noreply@anthropic.com> Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Renombrado de marca en 27 archivos: readme, arquitectura, contributing, handoff, project status, plan de rediseño, api-spec, data model, documentación técnica, user stories, issues, prompts, agents y skills. Namespaces de código (InkLink.Api, InkLinkDbContext) se mantienen como identificadores técnicos internos — no son visibles al usuario. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
|
Important Review skippedToo many files! This PR contains 453 files, which is 353 over the limit of 100. To get a review, narrow the scope: Upgrade to a paid plan to raise the limit. Usage-priced reviews support at most 300 files. ⚙️ Run configurationConfiguration used: defaults Review profile: CHILL Plan: Pro Plus Run ID: ⛔ Files ignored due to path filters (5)
📒 Files selected for processing (453)
You can disable this status message by setting the ✨ Finishing Touches🧪 Generate unit tests (beta)
Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: 2822002927
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
| confirmationUrl: $"{_flowSettings.ApiBaseUrl}/api/payments/confirm", | ||
| cancellationToken); | ||
|
|
||
| payment.FlowTransactionId = order.Token; |
There was a problem hiding this comment.
Preserve Flow tokens across retries
When a client opens checkout, clicks retry, and then completes the first Flow page, this assignment has already overwritten the only stored token with the newer order token. The webhook/return for the paid earlier token is then treated as unknown in ConfirmAsync, so the user can be charged while the booking remains unconfirmed; either keep every outstanding Flow token/order or cancel/reuse the existing one instead of replacing it.
Useful? React with 👍 / 👎.
| dotnet-version: 10.0.x | ||
|
|
||
| - name: Restore | ||
| run: dotnet restore |
There was a problem hiding this comment.
Specify the backend solution in CI
In this workflow the backend steps run from backend/, which contains both backend.csproj and backend.slnx; Microsoft documents MSB1011 as Specify which project or solution file to use when more than one exists (https://learn.microsoft.com/en-us/visualstudio/msbuild/errors/msb1011). The restore step will fail before build/test unless the workflow passes backend.slnx or a specific project path.
Useful? React with 👍 / 👎.
| } | ||
|
|
||
| var now = DateTime.UtcNow; | ||
| if (request.BookingDate.ToDateTime(start, DateTimeKind.Utc) <= now) |
There was a problem hiding this comment.
Compare booking times in local time
For same-day appointments in Chile, the DateOnly/TimeOnly values represent local shop time, but this converts them as if they were already UTC. For example, at 08:30 in Santiago, a 10:00 local slot is compared as 10:00 UTC and can be rejected as past even though it is still bookable locally; use the configured business timezone before comparing with UtcNow.
Useful? React with 👍 / 👎.
| api: | ||
| build: ./backend | ||
| container_name: inklink-api | ||
| profiles: ["full"] |
There was a problem hiding this comment.
Run migrations in the full Docker stack
When the documented full profile is started against a fresh db_data volume, this API service uses the Dockerfile entrypoint without passing --seed, while Program.cs only calls Database.MigrateAsync() inside the args.Contains("--seed") block. The container can start successfully but every database-backed endpoint then hits missing tables, so the compose service needs a migration/seed command or startup migration path.
Useful? React with 👍 / 👎.
…tivo El puerto 5432 chocaba con otro contenedor Postgres local (otro proyecto AI4Devs), causando fallos de autenticación al conectar por localhost. Se remapea inklink-db a 5434 en docker-compose y appsettings. También se agrega la sección 1.3.1 de análisis competitivo LatAm en la documentación técnica.
Título y body listos para usar al abrir el PR de cierre del proyecto.
🎨 INKSPIRE — La vitrina digital del tatuaje
🚀 ¿Qué es INKSPIRE?
INKSPIRE es un marketplace premium de tatuajes que conecta clientes con artistas certificados en Chile. Desde la búsqueda hasta el pago del depósito, todo en una sola plataforma — sin DMs, sin sorpresas.
🏗️ Stack tecnológico
✨ Funcionalidades implementadas (13 US · 80 Story Points)
🔐 Autenticación
🔍 Descubrimiento
💬 Cotización inteligente
📅 Reserva y pago
⭐ Post-sesión
📊 Métricas del proyecto
fixs/🎨 Diseño
Rediseño completo basado en prototipo Figma con tema oscuro premium:
#0D0D0Dfondo ·#D4AF37dorado ·#161616tarjetas📁 Estructura del repositorio
🏃 Cómo ejecutar
Login de prueba:
camila.rojas@example.cl/Test1234!📚 Documentación completa
readme.md— Ficha del proyecto y guía de entregaARCHITECTURE.md— Arquitectura del sistemadocs/documentacion.md— Lean Canvas, casos de uso, C4docs/api-spec.yml— Especificación OpenAPI 3.0docs/data-model.md— Modelo de datos (13 entidades)PROJECT_STATUS.md— Estado actual del proyectoprompts/00-all-prompts.md— Registro de prompts IADesarrollado con 💛 y mucha IA por Rodrigo A. Chamy Cruz (RACC) — AI4Devs 2026