feat(Issuers): add , edit, delete , toggle ,capability and currencies functionality

This commit is contained in:
ghazall-ag
2025-11-30 21:05:37 +03:30
parent 7cc442b600
commit 9d2e2c223c
9 changed files with 1004 additions and 68 deletions

View File

@@ -12,4 +12,5 @@ export { currencyAPI } from './currencyAPI';
export { countryAPI } from './countryAPI';
export { provinceAPI } from './provinceAPI';
export { cityAPI } from './cityAPI';
export { issuerAPI } from './issuerAPI';
export { listPermissions } from './permissionsAPI';

194
src/services/issuerAPI.js Normal file
View File

@@ -0,0 +1,194 @@
import api from './apiClient';
// -----------------------------
// Issuer API
// -----------------------------
export const issuerAPI = {
// GET /api/v1/Issuer (with pagination)
async list(params = {}) {
const { currentPage = 1, pageSize = 100, ...otherParams } = params;
const res = await api.get('/api/v1/Issuer', {
params: { currentPage, pageSize, ...otherParams },
skipAuthRedirect: true
});
return res?.data?.data?.data || [];
},
// GET /api/v1/Issuer/{id}
async getById(id) {
const res = await api.get(`/api/v1/Issuer/${encodeURIComponent(id)}`, {
skipAuthRedirect: true
});
console.log('Full API response:', res?.data);
console.log('API response data:', res?.data?.data);
return res?.data?.data;
},
// POST /api/v1/Issuer
async create(issuer) {
const payload = {
name: String(issuer?.name || ''),
supportEmail: String(issuer?.supportEmail || ''),
postalCode: String(issuer?.postalCode || ''),
addressDetails: String(issuer?.addressDetails || '')
};
// Include cityId - use null if empty or invalid
if (issuer?.cityId && issuer.cityId !== '' && issuer.cityId !== 'null' && issuer.cityId !== null) {
payload.cityId = issuer.cityId;
} else {
payload.cityId = null;
}
console.log('Issuer Create Payload:', payload);
const res = await api.post('/api/v1/Issuer', payload, { skipAuthRedirect: true });
return res?.data;
},
// PUT /api/v1/Issuer/{id}
async update(id, issuer) {
const payload = {
name: String(issuer?.name || ''),
supportEmail: String(issuer?.supportEmail || ''),
postalCode: String(issuer?.postalCode || ''),
addressDetails: String(issuer?.addressDetails || '')
};
// Include cityId - use null if empty or invalid
if (issuer?.cityId && issuer.cityId !== '' && issuer.cityId !== 'null' && issuer.cityId !== null) {
payload.cityId = issuer.cityId;
} else {
payload.cityId = null;
}
console.log('Issuer Update Payload:', payload);
const res = await api.put(`/api/v1/Issuer/${encodeURIComponent(id)}`, payload, {
skipAuthRedirect: true
});
return res?.data;
},
// DELETE /api/v1/Issuer/{id}
async remove(id) {
const res = await api.delete(`/api/v1/Issuer/${encodeURIComponent(id)}`, {
skipAuthRedirect: true
});
return res?.data;
},
// PATCH /api/v1/Issuer/{id}/ToggleActivation
async toggleActivation(id) {
const res = await api.patch(`/api/v1/Issuer/${encodeURIComponent(id)}/ToggleActivation`, null, {
skipAuthRedirect: true
});
return res?.data;
},
// GET /api/v1/Issuer/{id}/Capabilities
async getCapabilities(id) {
try {
const res = await api.get(`/api/v1/Issuer/${encodeURIComponent(id)}/Capabilities`, {
skipAuthRedirect: true
});
// Response structure: { data: [...], statusCode, isSuccess, ... }
const capabilities = res?.data?.data || [];
console.log('Capabilities from API:', capabilities);
return capabilities;
} catch (err) {
// Handle 404 gracefully - endpoint might not exist for some issuers
if (err?.response?.status === 404) {
console.warn('Capabilities endpoint not found (404), returning empty array');
return [];
}
throw err;
}
},
// PUT /api/v1/Issuer/{id}/Capabilities
async updateCapabilities(id, capabilities) {
// Filter out invalid capabilities and ensure all required fields are present
const validCapabilities = Array.isArray(capabilities) ? capabilities
.filter(cap => {
const capabilityValue = typeof cap === 'string' ? cap : (cap.capability || '');
return capabilityValue && String(capabilityValue).trim() !== '';
})
.map(cap => {
const capabilityValue = typeof cap === 'string' ? cap : (cap.capability || '');
const capabilityName = typeof cap === 'object' && cap.capabilityName ? cap.capabilityName : capabilityValue;
const hasCapability = typeof cap === 'object' ? (cap.hasCapability !== undefined ? cap.hasCapability : true) : true;
// Ensure capability is a valid string (not empty, not null, not undefined)
const capValue = String(capabilityValue).trim();
if (!capValue) {
return null; // Will be filtered out
}
return {
capability: capValue,
capabilityName: String(capabilityName).trim() || capValue,
hasCapability: Boolean(hasCapability)
};
})
.filter(cap => cap !== null) : [];
// Wrap in IssuerManageCapabilitiesCommand structure
const payload = {
capabilities: validCapabilities
};
console.log('Update Capabilities Payload:', JSON.stringify(payload, null, 2));
console.log('Valid capabilities count:', validCapabilities.length);
console.log('Capabilities details:', validCapabilities);
try {
const res = await api.put(`/api/v1/Issuer/${encodeURIComponent(id)}/Capabilities`, payload, {
skipAuthRedirect: true
});
return res?.data;
} catch (err) {
console.error('Capabilities update error details:', {
status: err?.response?.status,
data: err?.response?.data,
errors: err?.response?.data?.errors,
payload: payload
});
throw err;
}
},
// GET /api/v1/Issuer/{id}/AllowedCurrencies
async getAllowedCurrencies(id) {
try {
const res = await api.get(`/api/v1/Issuer/${encodeURIComponent(id)}/AllowedCurrencies`, {
skipAuthRedirect: true
});
// Response is a direct array: [{code, name, nativeName, symbol, numericCode, decimalPlaces}, ...]
const currencies = Array.isArray(res?.data) ? res.data : (res?.data?.data || []);
console.log('Allowed Currencies from API:', currencies);
return currencies;
} catch (err) {
// Handle 404 gracefully - endpoint might not exist for some issuers
if (err?.response?.status === 404) {
console.warn('AllowedCurrencies endpoint not found (404), returning empty array');
return [];
}
throw err;
}
},
// PUT /api/v1/Issuer/{id}/AllowedCurrencies
async updateAllowedCurrencies(id, allowedCurrencies) {
const payload = {
allowedCurrencies: Array.isArray(allowedCurrencies) ? allowedCurrencies.map(curr => ({
currencyCode: curr.currencyCode || curr.code || '',
currencyEnglishName: curr.currencyEnglishName || curr.name || '',
allowed: curr.allowed !== undefined ? curr.allowed : true
})) : []
};
const res = await api.put(`/api/v1/Issuer/${encodeURIComponent(id)}/AllowedCurrencies`, payload, {
skipAuthRedirect: true
});
return res?.data;
}
};

View File

@@ -38,6 +38,14 @@ export const usersAPI = {
}
},
async removeRole(userId,roleId){ try{ const res = await api.delete(`/api/v1/User/${encodeURIComponent(userId)}/Role/${encodeURIComponent(roleId)}`,{skipAuthRedirect:true}); return res?.data; } catch(err){ console.error(err); return null; } },
async updateRoles(userId,roleIds=[]){ try{ const res = await api.post(`/api/v1/User/${encodeURIComponent(userId)}/Role`,{roleIds},{skipAuthRedirect:true}); return res?.data; } catch(err){ console.error(err); return null; } },
async updateRoles(userId,roleIds=[]){
try{
const res = await api.put(`/api/v1/User/${encodeURIComponent(userId)}/Role`,{roleIds},{skipAuthRedirect:true});
return res?.data;
} catch(err){
console.error(err);
return null;
}
},
};