Root Directory Structure
The project contains 42 Razor components organized across Layout, Pages, and Shared directories, plus 15+ service implementation files.
Components Directory
TheComponents/ directory houses all Blazor UI components:
Layout Components
Components/Layout/
Components/Layout/
Purpose: Application-wide layout componentsFiles:
MainLayout.razor- Primary layout with navigationDashboardLayout.razor- Dashboard-specific layout
@layout directive in pagesPages/Home.razor
Page Components
Components/Pages/
Components/Pages/
Purpose: Routable page components mapped to URLsStructure:Routing Example:
TourDetails.razor
Shared Components
Components/Shared/
Components/Shared/
Services Directory
TheServices/ directory contains all business logic organized by domain:
Authentication Services
Services/Auth/
Services/Auth/
Files:Location References:
AuthService.cs- User authentication, registration, profile managementIAuthServiceinterface - Service contractPasswordResetService.cs- Password reset functionalityUserSession.cs- Scoped session state management
- PBKDF2 password hashing (100,000 iterations)
- JWT token generation via
IJwtTokenService - User profile CRUD operations
- Role verification
- Last login tracking
AuthService.cs:37-91
- Password hashing:
AuthService.cs:205-216 - Password verification:
AuthService.cs:218-234 - Profile retrieval:
AuthService.cs:236-286
JWT Services
Services/JWT/
Services/JWT/
Files:JWT Claims:
JwtTokenService.cs- JWT generation and validationJwtOptions.cs- Configuration binding class
Program.cs:22
ClaimTypes.NameIdentifier- User IDClaimTypes.Email- User email- Custom claims for roles (if needed)
Tour Services
Services/Tour/
Services/Tour/
Files:
TourService.cs- Complete tour management service
- Tour CRUD operations (create, read, update, delete)
- Tour search with filters and geolocation
- Ticket type management (ages, prices, availability)
- Extra items (add-ons) per ticket
- Booking/reservation flow
- Date availability and pricing
- Tour statistics and analytics
- Invoice generation
sp_Tours_GetAll- Fetch all tourssp_Tours_GetById- Tour detailsp_Tours_Create- Create new toursp_Tours_Update- Update existing toursp_TourReservation_Create- Create bookingsp_TourReservation_GetByUser- User bookings- … (many more SPs for tickets, extras, stats)
Email Services
Services/Email/ and Services/Mail/
Services/Email/ and Services/Mail/
Email Implementation:Registration:
EmailService.cs- SMTP email sending using MailKitIEmailServiceinterfaceSmtpOptions.cs- Configuration options
MailService.cs- High-level mail operationsMailNotificationDispatcher.cs- Singleton mail queue dispatcher
appsettings.json:18-27
Program.cs:27-30
Payment Services
Services/Paypal/
Services/Paypal/
Files:Registration:HttpClient Factory: Used for resilient HTTP calls with connection pooling
PaypalService.cs- PayPal REST API integrationIPaypalServiceinterfacePaypalOptions.cs- Configuration binding
appsettings.json:28-33
Program.cs:31-32
Utility Services
Services/Utility/
Services/Utility/
Files:
AssistanceTextService.cs- Remote text assistance APICurrencyConversionService.cs- Real-time currency exchange ratesPostLikeService.cs- Tour like/unlike functionalityReviewService.cs- Tour reviews and ratingsFormularioTipoService.cs- Form type managementAppUpdateService.cs- Application update notifications
Program.cs:34-41
Core Services
Services/Core/
Services/Core/
Files:Purpose: Platform-wide settings (maintenance mode, feature flags, etc.)
SettingsService.cs- Application settings management
Program.cs:41
Data Transfer Objects (DTOs)
TheDtos/ directory contains all data transfer objects:
Dtos/
Dtos/
Files:
AuthDtos.cs- Authentication-related DTOsLoginRequest,RegisterRequest,AuthResultUserProfileDto,UpdateUserProfileRequest,ChangePasswordRequestHostAchievementDto
TourDtos.cs- Tour-related DTOs (largest file, 7067 bytes)TourDto,TourDetailDto,TourCreateRequestTourTicketTypeDto,TourExtraDto,TourItineraryDtoTourReservationDto,TourReservationTicketDtoTourStatsDto,TourFilterDto
SearchFilterDto.cs- Search filter parametersPostLikeDtos.cs- Like/unlike DTOsSlideDTO.cs- Image slider DTOsFormularioTipoDto.cs- Form type DTOsCoreSettingsDtos.cs- Settings DTOsAppUpdateDtos.cs- App update notification DTOs
Dtos/AuthDtos.cs (conceptual example)
Static Files (wwwroot)
Thewwwroot/ directory serves static assets:
wwwroot/
wwwroot/
Structure:Upload Handling:
- Tour images: Saved to
wwwroot/uploads/ - Naming: Usually
{TourId}_{timestamp}.jpg - Access: Served as static files at
/uploads/{filename}
template/Factura_Template.html (conceptual)
Configuration Files
Project File
AndanDo.csproj
AndanDo.csproj
AndanDo.csproj:1-28
net10.0target (can be downgraded tonet8.0if needed)- Nullable reference types enabled
- Implicit usings for common namespaces
- Blazor navigation exception suppression
Application Settings
appsettings.json
appsettings.json
appsettings.json:1-36
ConnectionStrings- Database connectionJwt- JWT token settingsSmtp- Email server configurationPayPal- Payment gateway settings
appsettings.Development.json
appsettings.Development.json
appsettings.Development.json
- More verbose logging
- Detailed error pages
- Can override connection strings for local database
Program.cs
Program.cs - Application Entry Point
Program.cs - Application Entry Point
Program.cs:1-70
- Lines 1-11: Imports and builder setup
- Lines 16-45: Service registration and DI configuration
- Lines 47-68: Middleware pipeline and routing
Naming Conventions
File Naming
Razor Components
PascalCase with
Example:
.razor extension
Example:
TourDetails.razorC# Classes
PascalCase with
Example:
.cs extension
Example:
AuthService.csCSS Files
kebab-case or match component name
Example:
Example:
NavMenu.razor.cssJavaScript
kebab-case with
Example:
.js extension
Example:
chart-helper.jsCode Conventions
C# Naming Standards
C# Naming Standards
Classes & Interfaces:
- PascalCase:
AuthService,ITourService - Interfaces start with
I:IAuthService
- PascalCase:
SignInAsync(),GetTourByIdAsync() - Async methods end with
Async
- PascalCase:
UserId,Email,PasswordHash
- camelCase with underscore prefix:
_connectionString,_jwtTokenService
- PascalCase:
Pbkdf2Iterations,Pbkdf2SaltSize
- camelCase:
userId,cancellationToken
Razor Component Conventions
Razor Component Conventions
Directives:Code Blocks:HTML/Markup:
- Use semantic HTML5 elements
- Follow Blazor component naming:
<ComponentName />
Database Conventions
Stored Procedure Naming
Stored Procedure Naming
Pattern:
sp_{Entity}_{Action}Examples:sp_Tours_GetAll- Get all tourssp_Tours_GetById- Get single toursp_Tours_Create- Create new toursp_Tours_Update- Update toursp_Usuarios_Registrar- Register usersp_TourReservation_Create- Create bookingsp_HostAchievements_GetByUser- Get user achievements
Usuarios,Tours,TourReservation,UsuarioRoles
UsuarioId,Email,ContrasenaHash,FechaCreacion
Development Workflow
File Location Guide
Adding a Page
Create
.razor file in Components/Pages/ with @page directiveAdding a Service
Create interface + implementation in
Services/{Domain}/Adding a DTO
Add record to existing or new file in
Dtos/Adding Static Assets
Place in
wwwroot/assets/ or wwwroot/uploads/Service Registration Checklist
When adding a new service:- Create interface in
Services/{Domain}/I{ServiceName}.cs - Create implementation in
Services/{Domain}/{ServiceName}.cs - Register in Program.cs:
- Inject in components:
Component Creation Checklist
When adding a new page:- Create
.razorfile inComponents/Pages/ - Add
@pagedirective with route - Inject required services
- Add to navigation (if needed) in
NavMenu.razororDashNavMenu.razor - Apply authorization (if needed):
Code Organization Best Practices
Separation of Concerns:
- Components: UI rendering and user interactions only
- Services: Business logic, data access, external APIs
- DTOs: Data contracts, no logic
- wwwroot: Static assets, no dynamic code
Next Steps
Architecture
Understand the system architecture and design patterns
Tech Stack
Explore the technologies and frameworks used
Database Schema
Learn about database tables and relationships
Contributing
Guidelines for contributing to the codebase