Skip to content

Backend Controllers

Controllers handle HTTP requests, validate input, call services, and return standardized responses. Located in /src/controllers/.

AuthController

File: auth.controller.ts

Handles authentication and registration endpoints.

Endpoints Handled

EndpointHandlerDescription
POST /auth/send-verification-codesendVerificationCodeSend SMS OTP
POST /auth/verify-codeverifyCodeVerify OTP, get token
POST /auth/resend-coderesendCodeResend OTP
POST /auth/register/userregisterUserComplete user registration
POST /auth/register/employerregisterEmployerComplete employer registration
POST /auth/login/userloginUserUser login
POST /auth/login/employerloginEmployerEmployer login
POST /auth/refreshrefreshTokenRefresh JWT tokens
POST /auth/logoutlogoutClear refresh token

Validation Schemas

typescript
export const sendVerificationCodeSchema = Joi.object({
  phone: Joi.string().required().pattern(/^\+[1-9]\d{1,14}$/),
  userType: Joi.string().valid('user', 'employer').required(),
});

export const registerUserSchema = Joi.object({
  verificationToken: Joi.string().required(),
  name: Joi.string().required().trim(),
  email: Joi.string().email().optional(),
  password: Joi.string().min(6).required(),
  location: Joi.string().required(),
  bio: Joi.string().optional(),
  role: Joi.string().valid('job_seeker', 'service_worker', 'client', 'hybrid').optional(),
});

export const loginUserSchema = Joi.object({
  phone: Joi.string().required(),
  password: Joi.string().required(),
});

JobController

File: job.controller.ts

Handles job listing CRUD operations.

Endpoints Handled

EndpointHandlerDescription
GET /jobsgetJobsList jobs (paginated)
GET /jobs/searchsearchJobsFull-text search
GET /jobs/:idgetJobGet single job
POST /jobscreateJobCreate job (employer auth)
PUT /jobs/:idupdateJobUpdate job (employer auth)
DELETE /jobs/:iddeleteJobDelete job (employer auth)

Validation Schemas

typescript
export const createJobSchema = Joi.object({
  title: Joi.string().required().trim(),
  company: Joi.string().required().trim(),
  location: Joi.string().required(),
  salary: Joi.number().required().min(0),
  currency: Joi.string().default('USD'),
  description: Joi.string().required(),
  requirements: Joi.array().items(Joi.string()).default([]),
  benefits: Joi.array().items(Joi.string()).default([]),
  jobType: Joi.string().valid('full_time', 'part_time', 'contract', 'internship', 'remote').required(),
  experienceLevel: Joi.string().valid('entry', 'mid', 'senior', 'executive').required(),
  hashtags: Joi.array().items(Joi.string()).default([]),
  email: Joi.string().email().required(),
  whatsappContact: Joi.string().optional(),
  expiryDate: Joi.date().required(),
  aiInterviewEnabled: Joi.boolean().default(false),
  autoInviteOnApply: Joi.boolean().default(false),
  interviewQuestions: Joi.number().min(5).max(20).default(10),
  interviewTimeLimit: Joi.number().min(5).max(60).default(15),
});

ApplicationController

File: application.controller.ts

Handles job applications.

Endpoints Handled

EndpointHandlerDescription
POST /applicationscreateApplicationSubmit application
GET /applications/usergetUserApplicationsUser's applications
GET /applications/employergetEmployerApplicationsEmployer's received apps
GET /applications/:idgetApplicationGet single application
PATCH /applications/:id/statusupdateApplicationStatusChange status
DELETE /applications/:iddeleteApplicationWithdraw application

UserController

File: user.controller.ts

Handles user profiles and related operations.

Endpoints Handled

EndpointHandlerDescription
GET /users/megetCurrentUserGet authenticated user
PUT /users/meupdateCurrentUserUpdate profile
POST /users/swipeaddSwipeHistoryRecord job swipe
POST /users/save/:jobIdsaveJobSave job
DELETE /users/save/:jobIdunsaveJobUnsave job
GET /users/savedgetSavedJobsGet saved jobs
GET /users/profile-completenessgetProfileCompletenessCheck profile completion
POST /users/educationaddEducationAdd education
PUT /users/education/:idupdateEducationUpdate education
DELETE /users/education/:iddeleteEducationDelete education
POST /users/experienceaddExperienceAdd experience
PUT /users/experience/:idupdateExperienceUpdate experience
DELETE /users/experience/:iddeleteExperienceDelete experience

ServicesController

File: services.controller.ts

Handles service worker profiles and discovery.

Endpoints Handled

EndpointHandlerDescription
POST /services/workercreateWorkerProfileCreate worker profile
GET /services/worker/megetMyWorkerProfileGet my worker profile
PUT /services/worker/meupdateWorkerProfileUpdate profile
PATCH /services/worker/availabilitytoggleAvailabilityToggle availability
GET /services/workers/nearbygetNearbyWorkersGPS-based search
GET /services/workers/feedgetWorkerFeedTikTok-style feed
POST /services/workers/:id/swipeswipeWorkerSwipe on worker
GET /services/workers/:id/likesgetWorkerLikesWho liked worker
GET /services/categoriesgetCategoriesList categories
POST /services/categoriescreateCategoryCreate category
GET /services/workers/searchsearchWorkersSearch workers

BookingsController

File: bookings.controller.ts

Handles service requests, quotes, and bookings.

Endpoints Handled

EndpointHandlerDescription
POST /bookings/requestscreateRequestPost service request
GET /bookings/requests/minegetMyRequestsClient's requests
GET /bookings/requests/nearbygetNearbyRequestsRequests near worker
GET /bookings/requests/:idgetRequestGet request details
PATCH /bookings/requests/:id/statusupdateRequestStatusUpdate status
POST /bookings/requests/:id/swipeswipeRequestWorker swipes on request
POST /bookings/quotescreateQuoteSubmit quote
GET /bookings/requests/:id/quotesgetQuotesGet quotes for request
POST /bookings/quotes/:id/acceptacceptQuoteAccept quote
POST /bookings/quotes/:id/rejectrejectQuoteReject quote
POST /bookingscreateBookingDirect booking
GET /bookings/clientgetClientBookingsClient's bookings
GET /bookings/workergetWorkerBookingsWorker's bookings
GET /bookings/:idgetBookingGet booking details
PATCH /bookings/:id/statusupdateBookingStatusUpdate status

MessagesController

File: messages.controller.ts

Handles messaging between users.

Endpoints Handled

EndpointHandlerDescription
GET /messages/conversationsgetConversationsList conversations
GET /messages/conversations/:idgetConversationGet with messages
GET /messages/conversations/:id/messagesgetMessagesPaginated messages
POST /messages/conversations/:id/messagessendMessageSend message
POST /messages/conversations/:id/readmarkAsReadMark as read
DELETE /messages/:messageIddeleteMessageDelete message
POST /messages/conversations/:id/typingupdateTypingStatusUpdate typing
GET /messages/conversations/:id/typinggetTypingUsersGet typing users
POST /messages/conversations/:id/pintogglePinToggle pin
POST /messages/conversations/:id/mutetoggleMuteToggle mute
POST /messages/conversations/:id/archivearchiveConversationArchive
POST /messages/conversations/:id/unarchiveunarchiveConversationUnarchive
GET /messages/unread-countgetUnreadCountTotal unread

CreditsController

File: credits.controller.ts

Handles credit wallet operations.

Endpoints Handled

EndpointHandlerDescription
GET /credits/balancegetBalanceGet credit balance
GET /credits/transactionsgetTransactionsTransaction history
GET /credits/packagesgetPackagesAvailable packages
GET /credits/currenciesgetCurrenciesSupported currencies
GET /credits/payment-methodsgetPaymentMethodsPayment options
POST /credits/payment-requestcreatePaymentRequestRequest to buy credits
POST /credits/payment-request/:id/referencesubmitPaymentReferenceSubmit payment ref
GET /credits/payment-requestsgetPaymentRequestsUser's requests
POST /credits/cashoutcreateCashoutRequestRequest cashout
GET /credits/cashout-requestsgetCashoutRequestsUser's cashout requests

BillingController

File: billing.controller.ts

Handles Stripe subscription billing.

Endpoints Handled

EndpointHandlerDescription
GET /billing/plansgetPlansGet subscription plans
POST /billing/checkoutcreateCheckoutCreate Stripe checkout
POST /billing/webhookhandleWebhookStripe webhook handler
GET /billing/modegetModeGet Stripe mode (test/live)

InterviewController

File: interview.controller.ts

Handles AI interview integration.

Endpoints Handled

EndpointHandlerDescription
POST /interviews/createcreateSessionCreate interview session
GET /interviews/status/:applicationIdgetStatusGet interview status
GET /interviews/pendinggetPendingInterviewsUser's pending interviews
GET /interviews/allgetAllInterviewsUser's all interviews
GET /interviews/session/:applicationIdgetSessionForUserGet session URL
PATCH /interviews/privacyupdatePrivacyToggle score visibility
POST /interviews/webhook/completedhandleWebhookOkia completion webhook

ExperienceController

File: experience.controller.ts

Handles Experience Lab operations.

Endpoints Handled

EndpointHandlerDescription
GET /experience/tracksgetTracksList all tracks
GET /experience/tracks/:sluggetTrackGet track by slug
POST /experience/tracks/:id/enrollenrollInTrackEnroll in track
GET /experience/enrollmentsgetEnrollmentsUser's enrollments
GET /experience/tasks/:idgetTaskGet task details
POST /experience/tasks/:id/submitsubmitTaskSubmit task answer
GET /experience/progressgetProgressUser's full progress
GET /experience/certificatesgetCertificatesUser's certificates
GET /experience/verify/:codeverifyCertificateVerify certificate
GET /experience/leaderboardgetLeaderboardTop users

Common Response Pattern

All controllers use the standardized ApiResponse:

typescript
static async getJob(req: Request, res: Response) {
  try {
    const { id } = req.params;
    const job = await JobService.getJobById(id);
    
    if (!job) {
      return ApiResponse.notFound(res, 'Job not found');
    }
    
    ApiResponse.success(res, job, 'Job retrieved successfully');
  } catch (error: any) {
    ApiResponse.serverError(res, error.message, error);
  }
}

Response Format

json
{
  "success": true,
  "data": { ... },
  "message": "Job retrieved successfully",
  "metadata": {
    "total": 100,
    "page": 1,
    "limit": 20,
    "hasNext": true
  }
}

One chat. Everything done.