Skip to content
38 changes: 38 additions & 0 deletions backend/src/interfaces/apiInterfaces.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
/**
* Interfaces for API requests and responses
*/

// API response structure
export interface ApiResponse<T = any> {
success: boolean;
message?: string;
data?: T;
error?: string;
errors?: any[];
stack?: string;
meta?: {
pagination?: {
page: number;
limit: number;
total: number;
totalPages: number;
};
[key: string]: any;
};
}

// Pagination parameters
export interface PaginationParams {
page?: number;
limit?: number;
sortBy?: string;
sortDirection?: 'asc' | 'desc';
}

// Error response interface
export interface ErrorResponse {
status: number;
message: string;
errors?: any[];
stack?: string;
}
71 changes: 71 additions & 0 deletions backend/src/routes/authRoutes.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,71 @@
import { Router } from 'express';
import { ApiResponseUtil } from '../utils/apiResponse';

const router = Router();

/**
* @route POST /api/auth/register
* @desc Register a new user
* @access Public
*/
router.post('/register', (req, res) => {
// This will be implemented in issue #92 (JWT authentication system)
ApiResponseUtil.success(res, null, 'Register route - will be implemented in issue #92');
});

/**
* @route POST /api/auth/login
* @desc Login a user
* @access Public
*/
router.post('/login', (req, res) => {
// This will be implemented in issue #92 (JWT authentication system)
ApiResponseUtil.success(res, null, 'Login route - will be implemented in issue #92');
});

/**
* @route GET /api/auth/me
* @desc Get current user profile
* @access Private
*/
router.get('/me', (req, res) => {
ApiResponseUtil.success(res, null, 'Current user route - will be implemented in issue #92');
});

/**
* @route POST /api/auth/logout
* @desc Logout a user
* @access Private
*/
router.post('/logout', (req, res) => {
ApiResponseUtil.success(res, null, 'Logout route - will be implemented in issue #92');
});

/**
* @route POST /api/auth/refresh-token
* @desc Refresh access token using refresh token
* @access Public (with refresh token)
*/
router.post('/refresh-token', (req, res) => {
ApiResponseUtil.success(res, null, 'Refresh token route - will be implemented in issue #92');
});

/**
* @route POST /api/auth/forgot-password
* @desc Send password reset email
* @access Public
*/
router.post('/forgot-password', (req, res) => {
ApiResponseUtil.success(res, null, 'Forgot password route - will be implemented in issue #92');
});

/**
* @route POST /api/auth/reset-password
* @desc Reset password with token
* @access Public (with reset token)
*/
router.post('/reset-password', (req, res) => {
ApiResponseUtil.success(res, null, 'Reset password route - will be implemented in issue #92');
});

export default router;
70 changes: 70 additions & 0 deletions backend/src/routes/availabilityRoutes.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,70 @@
import { Router } from 'express';
import { ApiResponseUtil } from '../utils/apiResponse';

const router = Router();

/**
* @route GET /api/availability
* @desc Get availability for a specific date range and user(s)
* @access Private
*/
router.get('/', (req, res) => {
// Will be implemented later
ApiResponseUtil.success(res, [], 'Get availability');
});

/**
* @route POST /api/availability
* @desc Create or update user availability
* @access Private
*/
router.post('/', (req, res) => {
ApiResponseUtil.success(res, null, 'Create availability route');
});

/**
* @route GET /api/availability/:id
* @desc Get availability by ID
* @access Private (Admin, Owner, and Authorized Team Members)
*/
router.get('/:id', (req, res) => {
ApiResponseUtil.success(res, null, `Get availability ${req.params.id}`);
});

/**
* @route PUT /api/availability/:id
* @desc Update availability by ID
* @access Private (Admin and Owner)
*/
router.put('/:id', (req, res) => {
ApiResponseUtil.success(res, null, `Update availability ${req.params.id}`);
});

/**
* @route DELETE /api/availability/:id
* @desc Delete availability by ID
* @access Private (Admin and Owner)
*/
router.delete('/:id', (req, res) => {
ApiResponseUtil.success(res, null, `Delete availability ${req.params.id}`);
});

/**
* @route GET /api/availability/team/:teamId
* @desc Get availability for an entire team
* @access Private (Admin and Team Members)
*/
router.get('/team/:teamId', (req, res) => {
ApiResponseUtil.success(res, [], `Get team ${req.params.teamId} availability`);
});

/**
* @route GET /api/availability/matches
* @desc Find matching availability between interviewers and candidates
* @access Private (Admin and Team Members)
*/
router.get('/matches', (req, res) => {
ApiResponseUtil.success(res, [], 'Get matching availabilities');
});

export default router;
76 changes: 76 additions & 0 deletions backend/src/routes/candidateRoutes.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,76 @@
import { Router } from 'express';
import { ApiResponseUtil } from '../utils/apiResponse';

const router = Router();

/**
* @route GET /api/candidates
* @desc Get all candidates (with pagination)
* @access Private (Admin and Interviewers)
*/
router.get('/', (req, res) => {
const mockCandidates = [
{ id: '1', name: 'Candidate 1', position: 'Frontend Developer' },
{ id: '2', name: 'Candidate 2', position: 'Backend Developer' },
];

ApiResponseUtil.paginated(
res,
mockCandidates,
1, // page
10, // limit
2, // total
'Get all candidates - will be implemented in issue #94'
);
});

/**
* @route POST /api/candidates
* @desc Create a new candidate
* @access Private (Admin)
*/
router.post('/', (req, res) => {
ApiResponseUtil.success(res, null, 'Create candidate route - will be implemented in issue #94');
});

/**
* @route GET /api/candidates/:id
* @desc Get candidate by ID
* @access Private (Admin, Interviewer, and Own User)
*/
router.get('/:id', (req, res) => {
ApiResponseUtil.success(res, null, `Get candidate ${req.params.id} - will be implemented in issue #94`);
});

/**
* @route PUT /api/candidates/:id
* @desc Update candidate by ID
* @access Private (Admin and Own User)
*/
router.put('/:id', (req, res) => {
ApiResponseUtil.success(res, null, `Update candidate ${req.params.id} - will be implemented in issue #94`);
});

/**
* @route DELETE /api/candidates/:id
* @desc Delete candidate by ID
* @access Private (Admin)
*/
router.delete('/:id', (req, res) => {
ApiResponseUtil.success(res, null, `Delete candidate ${req.params.id} - will be implemented in issue #94`);
});

/**
* @route GET /api/candidates/:id/availability
* @desc Get candidate availability
* @access Private (Admin, Interviewer, and Own User)
*/
router.get('/:id/availability', (req, res) => {
ApiResponseUtil.success(
res,
[],
`Get candidate ${req.params.id} availability - to be implemented`
);
});

export default router;
94 changes: 94 additions & 0 deletions backend/src/routes/groupRoutes.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,94 @@
import { Router } from 'express';
import { ApiResponseUtil } from '../utils/apiResponse';

const router = Router();

/**
* @route GET /api/groups
* @desc Get all groups (with pagination)
* @access Private (Admin)
*/
router.get('/', (req, res) => {
const mockGroups = [
{ id: '1', name: 'Engineering Group', description: 'For engineering candidates' },
{ id: '2', name: 'Marketing Group', description: 'For marketing candidates' },
];

ApiResponseUtil.paginated(
res,
mockGroups,
1, // page
10, // limit
2, // total
'Get all groups'
);
});

/**
* @route POST /api/groups
* @desc Create a new group
* @access Private (Admin)
*/
router.post('/', (req, res) => {
ApiResponseUtil.success(res, null, 'Create group route');
});

/**
* @route GET /api/groups/:id
* @desc Get group by ID
* @access Private (Admin and Team Members)
*/
router.get('/:id', (req, res) => {
ApiResponseUtil.success(res, null, `Get group ${req.params.id}`);
});

/**
* @route PUT /api/groups/:id
* @desc Update group by ID
* @access Private (Admin)
*/
router.put('/:id', (req, res) => {
ApiResponseUtil.success(res, null, `Update group ${req.params.id}`);
});

/**
* @route DELETE /api/groups/:id
* @desc Delete group by ID
* @access Private (Admin)
*/
router.delete('/:id', (req, res) => {
ApiResponseUtil.success(res, null, `Delete group ${req.params.id}`);
});

/**
* @route GET /api/groups/:id/members
* @desc Get all group members
* @access Private (Admin and Team Members)
*/
router.get('/:id/members', (req, res) => {
ApiResponseUtil.success(res, [], `Get group ${req.params.id} members`);
});

/**
* @route POST /api/groups/:id/members
* @desc Add member to group
* @access Private (Admin)
*/
router.post('/:id/members', (req, res) => {
ApiResponseUtil.success(res, null, `Add member to group ${req.params.id}`);
});

/**
* @route DELETE /api/groups/:id/members/:userId
* @desc Remove member from group
* @access Private (Admin)
*/
router.delete('/:id/members/:userId', (req, res) => {
ApiResponseUtil.success(
res,
null,
`Remove member ${req.params.userId} from group ${req.params.id}`
);
});

export default router;
Loading