@@ -21,7 +21,7 @@ const getWebsiteById = cacheable(
2121 where : eq ( websites . id , id ) ,
2222 } ) ;
2323 } catch ( error ) {
24- console . error ( "Error fetching website by ID:" , error , { id } ) ;
24+ logger . error ( { error , websiteId : id } , "Error fetching website by ID" ) ;
2525 return null ;
2626 }
2727 } ,
@@ -41,42 +41,47 @@ async function authorizeWebsiteAccess(
4141 websiteId : string ,
4242 permission : "read" | "update" | "delete" | "transfer"
4343) {
44- const website = await getWebsiteById ( websiteId ) ;
44+ try {
45+ const website = await getWebsiteById ( websiteId ) ;
4546
46- if ( ! website ) {
47- throw new Error ( "Website not found" ) ;
48- }
47+ if ( ! website ) {
48+ throw new Error ( "Website not found" ) ;
49+ }
4950
50- // Public websites allow read access
51- if ( permission === "read" && website . isPublic ) {
52- return website ;
53- }
51+ // Public websites allow read access
52+ if ( permission === "read" && website . isPublic ) {
53+ return website ;
54+ }
5455
55- const session = await auth . api . getSession ( { headers } ) ;
56- const user = session ?. user ;
56+ const session = await auth . api . getSession ( { headers } ) ;
57+ const user = session ?. user ;
5758
58- if ( ! user ) {
59- throw new Error ( "Authentication is required for this action" ) ;
60- }
59+ if ( ! user ) {
60+ throw new Error ( "Authentication is required for this action" ) ;
61+ }
6162
62- if ( user . role === "ADMIN" ) {
63- return website ;
64- }
63+ if ( user . role === "ADMIN" ) {
64+ return website ;
65+ }
6566
66- if ( website . organizationId ) {
67- const { success } = await websitesApi . hasPermission ( {
68- headers,
69- body : { permissions : { website : [ permission ] } } ,
70- } ) ;
71- if ( ! success ) {
72- throw new Error ( "You do not have permission to perform this action" ) ;
67+ if ( website . organizationId ) {
68+ const { success } = await websitesApi . hasPermission ( {
69+ headers,
70+ body : { permissions : { website : [ permission ] } } ,
71+ } ) ;
72+ if ( ! success ) {
73+ throw new Error ( "You do not have permission to perform this action" ) ;
74+ }
75+ } else if ( website . userId !== user . id ) {
76+ // Check direct ownership
77+ throw new Error ( "You are not the owner of this website" ) ;
7378 }
74- } else if ( website . userId !== user . id ) {
75- // Check direct ownership
76- throw new Error ( "You are not the owner of this website" ) ;
77- }
7879
79- return website ;
80+ return website ;
81+ } catch ( error ) {
82+ logger . error ( { error, websiteId, permission } , "Failed to authorize website access" ) ;
83+ throw error ;
84+ }
8085}
8186
8287export const exportRoute = new Elysia ( { prefix : "/v1/export" } )
@@ -117,45 +122,46 @@ export const exportRoute = new Elysia({ prefix: "/v1/export" })
117122 ) ;
118123
119124 if ( dateError ) {
120- logger . warn ( {
121- message : "Export request with invalid dates" ,
122- requestId,
123- websiteId,
124- startDate : body . start_date ,
125- endDate : body . end_date ,
126- error : dateError ,
127- } ) ;
125+ logger . warn (
126+ {
127+ requestId,
128+ websiteId,
129+ startDate : body . start_date ,
130+ endDate : body . end_date ,
131+ error : dateError ,
132+ } ,
133+ "Export request with invalid dates"
134+ ) ;
128135 return createErrorResponse ( 400 , "INVALID_DATE_RANGE" , dateError ) ;
129136 }
130137
131138 const format = body . format || "json" ;
132139 if ( ! [ "csv" , "json" , "txt" , "proto" ] . includes ( format ) ) {
133- logger . warn ( {
134- message : "Export request with invalid format" ,
135- requestId,
136- websiteId,
137- format,
138- } ) ;
140+ logger . warn (
141+ { requestId, websiteId, format } ,
142+ "Export request with invalid format"
143+ ) ;
139144 return createErrorResponse (
140145 400 ,
141146 "INVALID_FORMAT" ,
142147 "Invalid export format. Supported formats: csv, json, txt, proto"
143148 ) ;
144149 }
145150
146- logger . info ( {
147- message : "Data export initiated" ,
148- requestId,
149- websiteId,
150- startDate : validatedDates . startDate ,
151- endDate : validatedDates . endDate ,
152- format,
153- userAgent : request . headers . get ( "user-agent" ) ,
154- ip :
155- request . headers . get ( "x-forwarded-for" ) ||
156- request . headers . get ( "x-real-ip" ) ,
157- timestamp : new Date ( ) . toISOString ( ) ,
158- } ) ;
151+ logger . info (
152+ {
153+ requestId,
154+ websiteId,
155+ startDate : validatedDates . startDate ,
156+ endDate : validatedDates . endDate ,
157+ format,
158+ userAgent : request . headers . get ( "user-agent" ) ,
159+ ip :
160+ request . headers . get ( "x-forwarded-for" ) ||
161+ request . headers . get ( "x-real-ip" ) ,
162+ } ,
163+ "Data export initiated"
164+ ) ;
159165
160166 const exportRequest : ExportRequest = {
161167 website_id : websiteId ,
@@ -166,16 +172,17 @@ export const exportRoute = new Elysia({ prefix: "/v1/export" })
166172
167173 const result = await processExport ( exportRequest ) ;
168174
169- logger . info ( {
170- message : "Data export completed successfully" ,
171- requestId,
172- websiteId,
173- filename : result . filename ,
174- fileSize : result . buffer . length ,
175- totalRecords : result . metadata . totalRecords ,
176- processingTime : Date . now ( ) - startTime ,
177- timestamp : new Date ( ) . toISOString ( ) ,
178- } ) ;
175+ logger . info (
176+ {
177+ requestId,
178+ websiteId,
179+ filename : result . filename ,
180+ fileSize : result . buffer . length ,
181+ totalRecords : result . metadata . totalRecords ,
182+ processingTime : Date . now ( ) - startTime ,
183+ } ,
184+ "Data export completed successfully"
185+ ) ;
179186
180187 return new Response ( result . buffer , {
181188 headers : {
@@ -185,19 +192,19 @@ export const exportRoute = new Elysia({ prefix: "/v1/export" })
185192 } ,
186193 } ) ;
187194 } catch ( error ) {
188- logger . error ( {
189- message : "Data export failed" ,
190- requestId ,
191- websiteId : body . website_id ,
192- error : error instanceof Error ? error . message : String ( error ) ,
193- stack : error instanceof Error ? error . stack : undefined ,
194- processingTime : Date . now ( ) - startTime ,
195- userAgent : request . headers . get ( "user-agent" ) ,
196- ip :
197- request . headers . get ( "x-forwarded-for" ) ||
198- request . headers . get ( "x-real-ip" ) ,
199- timestamp : new Date ( ) . toISOString ( ) ,
200- } ) ;
195+ logger . error (
196+ {
197+ error ,
198+ requestId ,
199+ websiteId : body . website_id ,
200+ processingTime : Date . now ( ) - startTime ,
201+ userAgent : request . headers . get ( "user-agent" ) ,
202+ ip :
203+ request . headers . get ( "x-forwarded-for" ) ||
204+ request . headers . get ( "x-real-ip" ) ,
205+ } ,
206+ "Data export failed"
207+ ) ;
201208
202209 if ( error instanceof Error ) {
203210 if ( error . message . includes ( "not found" ) ) {
0 commit comments