@@ -6,13 +6,14 @@ import {
66 AllowedUsersNpubsResponse ,
77 BulkImportRequest ,
88 AllowedUsersNpub ,
9+ AllowedUsersMode ,
910 DEFAULT_TIERS
1011} from '@app/types/allowedUsers.types' ;
1112
1213// Settings Management
1314export const getAllowedUsersSettings = async ( ) : Promise < AllowedUsersSettings > => {
1415 const token = readToken ( ) ;
15- const response = await fetch ( `${ config . baseURL } /api/settings/allowed_users ` , {
16+ const response = await fetch ( `${ config . baseURL } /api/settings` , {
1617 headers : {
1718 'Authorization' : `Bearer ${ token } ` ,
1819 } ,
@@ -22,25 +23,49 @@ export const getAllowedUsersSettings = async (): Promise<AllowedUsersSettings> =
2223
2324 const text = await response . text ( ) ;
2425 try {
25- const data : AllowedUsersApiResponse = JSON . parse ( text ) ;
26+ const data = JSON . parse ( text ) ;
27+
28+ // Extract allowed_users from the new nested structure
29+ const allowedUsersData = data . settings ?. allowed_users ;
30+ if ( ! allowedUsersData ) {
31+ throw new Error ( 'No allowed_users data found in response' ) ;
32+ }
2633
2734 // Transform tiers from backend format to frontend format
28- let transformedTiers = data . allowed_users . tiers . map ( tier => ( {
29- data_limit : ( tier as any ) . datalimit || tier . data_limit || '' ,
30- price : tier . price
31- } ) ) ;
35+ let transformedTiers = [ ] ;
36+
37+ // Check if tiers exist in response, otherwise use defaults
38+ if ( allowedUsersData . tiers && Array . isArray ( allowedUsersData . tiers ) ) {
39+ transformedTiers = allowedUsersData . tiers . map ( ( tier : any ) => ( {
40+ name : tier . name || 'Unnamed Tier' ,
41+ price_sats : tier . price_sats || 0 ,
42+ monthly_limit_bytes : tier . monthly_limit_bytes || 0 ,
43+ unlimited : tier . unlimited || false
44+ } ) ) ;
45+ } else {
46+ // Use default tiers for the mode if none provided
47+ const mode = allowedUsersData . mode as AllowedUsersMode ;
48+ transformedTiers = DEFAULT_TIERS [ mode ] || DEFAULT_TIERS . free ;
49+ }
3250
3351 // For free mode, reconstruct full UI options with active tier marked
34- if ( data . allowed_users . mode === 'free' && transformedTiers . length === 1 ) {
35- const activeTierDataLimit = transformedTiers [ 0 ] . data_limit ;
52+ if ( allowedUsersData . mode === 'free' && transformedTiers . length === 1 ) {
53+ const activeTierBytes = transformedTiers [ 0 ] . monthly_limit_bytes ;
3654 transformedTiers = DEFAULT_TIERS . free . map ( defaultTier => ( {
3755 ...defaultTier ,
38- active : defaultTier . data_limit === activeTierDataLimit
56+ active : defaultTier . monthly_limit_bytes === activeTierBytes
3957 } ) ) ;
4058 }
4159
60+ // For personal mode, reconstruct with single unlimited tier
61+ if ( allowedUsersData . mode === 'personal' && transformedTiers . length === 1 ) {
62+ transformedTiers = DEFAULT_TIERS . personal ;
63+ }
64+
4265 const transformedSettings = {
43- ...data . allowed_users ,
66+ mode : allowedUsersData . mode || 'free' ,
67+ read_access : allowedUsersData . read_access || { enabled : true , scope : 'all_users' } ,
68+ write_access : allowedUsersData . write_access || { enabled : true , scope : 'all_users' } ,
4469 tiers : transformedTiers
4570 } ;
4671
@@ -53,33 +78,37 @@ export const getAllowedUsersSettings = async (): Promise<AllowedUsersSettings> =
5378export const updateAllowedUsersSettings = async ( settings : AllowedUsersSettings ) : Promise < { success : boolean , message : string } > => {
5479 const token = readToken ( ) ;
5580
56- // Filter tiers based on mode - for free mode , only send active tier
57- const tiersToSend = settings . mode === 'free'
81+ // Filter tiers based on mode - for free and personal modes , only send active tier
82+ const tiersToSend = ( settings . mode === 'free' || settings . mode === 'personal' )
5883 ? settings . tiers . filter ( tier => tier . active )
5984 : settings . tiers ;
6085
61- // Transform to nested format as expected by backend
86+ // Transform to nested format as expected by new unified backend API
6287 const nestedSettings = {
63- "allowed_users" : {
64- "mode" : settings . mode ,
65- "read_access" : {
66- "enabled" : settings . read_access . enabled ,
67- "scope" : settings . read_access . scope
68- } ,
69- "write_access" : {
70- "enabled" : settings . write_access . enabled ,
71- "scope" : settings . write_access . scope
72- } ,
73- "tiers" : tiersToSend . map ( tier => ( {
74- "datalimit" : tier . data_limit || "1 GB per month" , // Backend expects 'datalimit' not 'data_limit', fallback for empty values
75- "price" : tier . price || "0"
76- } ) )
88+ "settings" : {
89+ "allowed_users" : {
90+ "mode" : settings . mode ,
91+ "read_access" : {
92+ "enabled" : settings . read_access . enabled ,
93+ "scope" : settings . read_access . scope
94+ } ,
95+ "write_access" : {
96+ "enabled" : settings . write_access . enabled ,
97+ "scope" : settings . write_access . scope
98+ } ,
99+ "tiers" : tiersToSend . map ( tier => ( {
100+ "name" : tier . name ,
101+ "price_sats" : tier . price_sats ,
102+ "monthly_limit_bytes" : tier . monthly_limit_bytes ,
103+ "unlimited" : tier . unlimited
104+ } ) )
105+ }
77106 }
78107 } ;
79108
80109 console . log ( 'Sending to backend:' , JSON . stringify ( nestedSettings , null , 2 ) ) ;
81110
82- const response = await fetch ( `${ config . baseURL } /api/settings/allowed_users ` , {
111+ const response = await fetch ( `${ config . baseURL } /api/settings` , {
83112 method : 'POST' ,
84113 headers : {
85114 'Content-Type' : 'application/json' ,
@@ -97,9 +126,10 @@ export const updateAllowedUsersSettings = async (settings: AllowedUsersSettings)
97126 }
98127
99128 try {
100- return JSON . parse ( text ) ;
129+ return JSON . parse ( text ) || { success : true , message : 'Settings updated successfully' } ;
101130 } catch ( jsonError ) {
102- throw new Error ( `Invalid JSON response: ${ text } ` ) ;
131+ // If response is not JSON, assume success if status was OK
132+ return { success : true , message : 'Settings updated successfully' } ;
103133 }
104134} ;
105135
0 commit comments