1+ import 'dotenv/config' ;
2+ import { Hono } from "hono" ;
3+ import { db } from '../db.js' ;
4+ import { plansTable } from '../db/schema/plans.js' ;
5+ import { zValidator } from '@hono/zod-validator' ;
6+ import { PlanCreate , PlanUpdate } from '../schema/index.js' ;
7+ import { eq } from 'drizzle-orm' ;
8+
9+ const plansRouter = new Hono ( )
10+
11+ plansRouter . get ( "/" , async ( c ) => {
12+ const plans = await db . select ( ) . from ( plansTable )
13+
14+ return c . json ( {
15+ status : true ,
16+ data : plans ,
17+ } , 200 )
18+ } )
19+
20+ plansRouter . post ( "/" ,
21+ zValidator ( 'json' , PlanCreate ) ,
22+ async ( c ) => {
23+ const validateReq = c . req . valid ( 'json' )
24+ const api = await fetch ( `${ process . env . PAYSTACK_BASE_URL } /plan` , {
25+ method : "POST" ,
26+ headers : {
27+ "Authorization" : `Bearer ${ process . env . PAYSTACK_SECRET_KEY } ` ,
28+ 'Content-Type' : "application/json"
29+ } ,
30+ body : JSON . stringify ( validateReq )
31+ } )
32+
33+ const data = await api . json ( )
34+
35+ if ( ! data [ "status" ] ) {
36+ return c . json ( {
37+ status : false ,
38+ data : { }
39+ } , 500 )
40+ }
41+
42+ const plan = await db . insert ( plansTable )
43+ . values ( {
44+ name : data [ "data" ] [ "name" ] ,
45+ amount : data [ "data" ] [ "amount" ] ,
46+ interval : data [ "data" ] [ "interval" ] ,
47+ code : data [ "data" ] [ "plan_code" ] ,
48+ } )
49+ . returning ( )
50+
51+ return c . json ( {
52+ status : true ,
53+ data : plan [ 0 ]
54+ } , 201 )
55+ } )
56+
57+ plansRouter . put ( "/:id" ,
58+ zValidator ( 'json' , PlanUpdate ) ,
59+ async ( c ) => {
60+ const validatedReq = c . req . valid ( 'json' )
61+ const id = c . req . param ( 'id' )
62+ const result = await db . select ( { code : plansTable . code } ) . from ( plansTable )
63+ const { code } = result [ 0 ]
64+
65+ const api = await fetch ( `${ process . env . PAYSTACK_BASE_URL } /plan/${ code } ` , {
66+ method : "PUT" ,
67+ headers : {
68+ "Authorization" : `Bearer ${ process . env . PAYSTACK_SECRET_KEY } ` ,
69+ 'Content-Type' : "application/json"
70+ } ,
71+ body : JSON . stringify ( validatedReq )
72+ } )
73+
74+ const data = await api . json ( )
75+ console . log ( "Data: " , data )
76+
77+ if ( ! data [ "status" ] ) {
78+ return c . json ( {
79+ status : false ,
80+ data : { }
81+ } , 500 )
82+ }
83+
84+ const plan = await db . update ( plansTable )
85+ . set ( { ...validatedReq } )
86+ . where ( eq ( plansTable . id , parseInt ( id ) ) )
87+ . returning ( ) ;
88+
89+ return c . json ( {
90+ status : true ,
91+ data : plan [ 0 ]
92+ } , 200 )
93+ } )
94+
95+ export default plansRouter
0 commit comments