All files / services loanApi.ts

17.64% Statements 3/17
0% Branches 0/2
6.66% Functions 1/15
17.64% Lines 3/17

Press n or j to go to the next uncovered block, b, p or k for the previous block.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100                    1x 1x                                                                                                                                                                             1x  
import {api} from './api';
import type {
	CheckEligibilityResponse,
	Loan,
	LoanResponse,
	LoansResponse,
	PaymentScheduleItem,
	PendingLoansResponse
} from '../types/loan';
 
export const loanApi = api.injectEndpoints({
	endpoints: (builder) => ({
		checkEligibility: builder.query<CheckEligibilityResponse, void>({
			query: () => '/loans/eligibility',
			providesTags: ['Loan']
		}),
		getMyLoans: builder.query<LoansResponse, void>({
			query: () => '/loans',
			providesTags: ['Loan']
		}),
		getLoan: builder.query<{
			success: boolean;
			data: {
				loan: Loan;
				paymentSchedule?: PaymentScheduleItem[];
			};
		}, number>({
			query: (id) => `/loans/${id}`,
			providesTags: (_r, _e, id) => [{type: 'Loan', id}]
		}),
		requestLoan: builder.mutation<LoanResponse, { amount: string; termMonths: number }>({
			query: (body) => ({url: '/loans', method: 'POST', body}),
			invalidatesTags: ['Loan', 'AccountSummary', 'Account']
		}),
		getPendingLoans: builder.query<PendingLoansResponse, void>({
			query: () => '/admin/loans/pending',
			providesTags: ['Loan']
		}),
		getApprovedLoans: builder.query<LoansResponse, void>({
			query: () => '/admin/loans/approved',
			providesTags: ['Loan']
		}),
		getActiveLoans: builder.query<LoansResponse, void>({
			query: () => '/admin/loans/active',
			providesTags: ['Loan']
		}),
		approveLoan: builder.mutation<LoanResponse, {
			id: number;
			payload?: { approvedAmount?: string; approvedTermMonths?: number; interestRate?: string; notes?: string };
		}>({
			query: ({id, payload}) => ({url: `/admin/loans/${id}/approve`, method: 'POST', body: payload ?? {}}),
			invalidatesTags: ['Loan']
		}),
		denyLoan: builder.mutation<LoanResponse, { id: number; payload: { reason: string } }>({
			query: ({id, payload}) => ({url: `/admin/loans/${id}/deny`, method: 'POST', body: payload}),
			invalidatesTags: ['Loan']
		}),
		makePayment: builder.mutation<{
			success: boolean;
			message: string;
			data: { loan: Loan; paymentId: number; amountPaid: string };
		}, number>({
			query: (loanId) => ({url: `/loans/${loanId}/payment`, method: 'POST'}),
			invalidatesTags: ['Loan', 'Account', 'AccountSummary', 'Transaction']
		}),
		makeAdditionalPayment: builder.mutation<{
			success: boolean;
			message: string;
			data: { loan: Loan; paymentId: number; amountPaid: string };
		}, { loanId: number; amount: string }>({
			query: ({loanId, amount}) => ({url: `/loans/${loanId}/additional-payment`, method: 'POST', body: {amount}}),
			invalidatesTags: ['Loan', 'Account', 'AccountSummary', 'Transaction']
		}),
		acceptLoan: builder.mutation<LoanResponse, number>({
			query: (loanId) => ({url: `/loans/${loanId}/accept`, method: 'POST'}),
			invalidatesTags: ['Loan']
		}),
		declineLoan: builder.mutation<LoanResponse, { loanId: number; reason: string }>({
			query: ({loanId, reason}) => ({url: `/loans/${loanId}/decline`, method: 'POST', body: {reason}}),
			invalidatesTags: ['Loan']
		})
	})
});
 
export const {
	useCheckEligibilityQuery,
	useGetMyLoansQuery,
	useGetLoanQuery,
	useRequestLoanMutation,
	useGetPendingLoansQuery,
	useGetApprovedLoansQuery,
	useGetActiveLoansQuery,
	useApproveLoanMutation,
	useDenyLoanMutation,
	useMakePaymentMutation,
	useMakeAdditionalPaymentMutation,
	useAcceptLoanMutation,
	useDeclineLoanMutation
} = loanApi;