update flow and auth model
This commit is contained in:
243
src/services/assets.service.ts
Normal file
243
src/services/assets.service.ts
Normal file
@@ -0,0 +1,243 @@
|
||||
/**
|
||||
* Assets Service
|
||||
*
|
||||
* Handles all asset-related API operations including CRUD and inheritance.
|
||||
*/
|
||||
|
||||
import {
|
||||
NO_BACKEND_MODE,
|
||||
API_ENDPOINTS,
|
||||
MOCK_CONFIG,
|
||||
buildApiUrl,
|
||||
getApiHeaders,
|
||||
logApiDebug,
|
||||
} from '../config';
|
||||
|
||||
// =============================================================================
|
||||
// Type Definitions
|
||||
// =============================================================================
|
||||
|
||||
export interface Asset {
|
||||
id: number;
|
||||
title: string;
|
||||
author_id: number;
|
||||
private_key_shard: string;
|
||||
content_outer_encrypted: string;
|
||||
}
|
||||
|
||||
export interface AssetCreate {
|
||||
title: string;
|
||||
private_key_shard: string;
|
||||
content_inner_encrypted: string;
|
||||
}
|
||||
|
||||
export interface AssetClaim {
|
||||
asset_id: number;
|
||||
private_key_shard: string;
|
||||
}
|
||||
|
||||
export interface AssetClaimResponse {
|
||||
asset_id: number;
|
||||
title: string;
|
||||
decrypted_content: string;
|
||||
server_shard_key: string;
|
||||
}
|
||||
|
||||
export interface AssetAssign {
|
||||
asset_id: number;
|
||||
heir_name: string;
|
||||
}
|
||||
|
||||
// =============================================================================
|
||||
// Mock Data
|
||||
// =============================================================================
|
||||
|
||||
const MOCK_ASSETS: Asset[] = [
|
||||
{
|
||||
id: 1,
|
||||
title: 'Mock Asset 1',
|
||||
author_id: MOCK_CONFIG.USER.id,
|
||||
private_key_shard: 'mock_shard_1',
|
||||
content_outer_encrypted: 'mock_encrypted_content_1',
|
||||
},
|
||||
{
|
||||
id: 2,
|
||||
title: 'Mock Asset 2',
|
||||
author_id: MOCK_CONFIG.USER.id,
|
||||
private_key_shard: 'mock_shard_2',
|
||||
content_outer_encrypted: 'mock_encrypted_content_2',
|
||||
},
|
||||
];
|
||||
|
||||
// =============================================================================
|
||||
// Assets Service
|
||||
// =============================================================================
|
||||
|
||||
export const assetsService = {
|
||||
/**
|
||||
* Get all assets for the current user
|
||||
* @param token - JWT token for authentication
|
||||
* @returns Array of user's assets
|
||||
*/
|
||||
async getMyAssets(token: string): Promise<Asset[]> {
|
||||
if (NO_BACKEND_MODE) {
|
||||
logApiDebug('Get Assets', 'Using mock mode');
|
||||
return new Promise((resolve) => {
|
||||
setTimeout(() => resolve(MOCK_ASSETS), MOCK_CONFIG.RESPONSE_DELAY);
|
||||
});
|
||||
}
|
||||
|
||||
const url = buildApiUrl(API_ENDPOINTS.ASSETS.GET);
|
||||
logApiDebug('Get Assets URL', url);
|
||||
|
||||
try {
|
||||
const response = await fetch(url, {
|
||||
method: 'GET',
|
||||
headers: getApiHeaders(token),
|
||||
});
|
||||
|
||||
logApiDebug('Get Assets Response Status', response.status);
|
||||
|
||||
if (!response.ok) {
|
||||
const errorData = await response.json().catch(() => ({}));
|
||||
throw new Error(errorData.detail || 'Failed to fetch assets');
|
||||
}
|
||||
|
||||
return await response.json();
|
||||
} catch (error) {
|
||||
console.error('Get assets error:', error);
|
||||
throw error;
|
||||
}
|
||||
},
|
||||
|
||||
/**
|
||||
* Create a new asset
|
||||
* @param asset - Asset creation data
|
||||
* @param token - JWT token for authentication
|
||||
* @returns Created asset
|
||||
*/
|
||||
async createAsset(asset: AssetCreate, token: string): Promise<Asset> {
|
||||
if (NO_BACKEND_MODE) {
|
||||
logApiDebug('Create Asset', 'Using mock mode');
|
||||
return new Promise((resolve) => {
|
||||
setTimeout(() => {
|
||||
resolve({
|
||||
id: Date.now(),
|
||||
title: asset.title,
|
||||
author_id: MOCK_CONFIG.USER.id,
|
||||
private_key_shard: asset.private_key_shard,
|
||||
content_outer_encrypted: asset.content_inner_encrypted,
|
||||
});
|
||||
}, MOCK_CONFIG.RESPONSE_DELAY);
|
||||
});
|
||||
}
|
||||
|
||||
const url = buildApiUrl(API_ENDPOINTS.ASSETS.CREATE);
|
||||
logApiDebug('Create Asset URL', url);
|
||||
|
||||
try {
|
||||
const response = await fetch(url, {
|
||||
method: 'POST',
|
||||
headers: getApiHeaders(token),
|
||||
body: JSON.stringify(asset),
|
||||
});
|
||||
|
||||
logApiDebug('Create Asset Response Status', response.status);
|
||||
|
||||
if (!response.ok) {
|
||||
const errorData = await response.json().catch(() => ({}));
|
||||
throw new Error(errorData.detail || 'Failed to create asset');
|
||||
}
|
||||
|
||||
return await response.json();
|
||||
} catch (error) {
|
||||
console.error('Create asset error:', error);
|
||||
throw error;
|
||||
}
|
||||
},
|
||||
|
||||
/**
|
||||
* Claim an inherited asset
|
||||
* @param claim - Asset claim data
|
||||
* @param token - JWT token for authentication
|
||||
* @returns Claimed asset with decrypted content
|
||||
*/
|
||||
async claimAsset(claim: AssetClaim, token: string): Promise<AssetClaimResponse> {
|
||||
if (NO_BACKEND_MODE) {
|
||||
logApiDebug('Claim Asset', 'Using mock mode');
|
||||
return new Promise((resolve) => {
|
||||
setTimeout(() => {
|
||||
resolve({
|
||||
asset_id: claim.asset_id,
|
||||
title: 'Mock Claimed Asset',
|
||||
decrypted_content: 'This is the decrypted content of the claimed asset.',
|
||||
server_shard_key: 'mock_server_shard',
|
||||
});
|
||||
}, MOCK_CONFIG.RESPONSE_DELAY);
|
||||
});
|
||||
}
|
||||
|
||||
const url = buildApiUrl(API_ENDPOINTS.ASSETS.CLAIM);
|
||||
logApiDebug('Claim Asset URL', url);
|
||||
|
||||
try {
|
||||
const response = await fetch(url, {
|
||||
method: 'POST',
|
||||
headers: getApiHeaders(token),
|
||||
body: JSON.stringify(claim),
|
||||
});
|
||||
|
||||
logApiDebug('Claim Asset Response Status', response.status);
|
||||
|
||||
if (!response.ok) {
|
||||
const errorData = await response.json().catch(() => ({}));
|
||||
throw new Error(errorData.detail || 'Failed to claim asset');
|
||||
}
|
||||
|
||||
return await response.json();
|
||||
} catch (error) {
|
||||
console.error('Claim asset error:', error);
|
||||
throw error;
|
||||
}
|
||||
},
|
||||
|
||||
/**
|
||||
* Assign an asset to an heir
|
||||
* @param assignment - Asset assignment data
|
||||
* @param token - JWT token for authentication
|
||||
* @returns Success message
|
||||
*/
|
||||
async assignAsset(assignment: AssetAssign, token: string): Promise<{ message: string }> {
|
||||
if (NO_BACKEND_MODE) {
|
||||
logApiDebug('Assign Asset', 'Using mock mode');
|
||||
return new Promise((resolve) => {
|
||||
setTimeout(() => {
|
||||
resolve({ message: `Asset assigned to ${assignment.heir_name}` });
|
||||
}, MOCK_CONFIG.RESPONSE_DELAY);
|
||||
});
|
||||
}
|
||||
|
||||
const url = buildApiUrl(API_ENDPOINTS.ASSETS.ASSIGN);
|
||||
logApiDebug('Assign Asset URL', url);
|
||||
|
||||
try {
|
||||
const response = await fetch(url, {
|
||||
method: 'POST',
|
||||
headers: getApiHeaders(token),
|
||||
body: JSON.stringify(assignment),
|
||||
});
|
||||
|
||||
logApiDebug('Assign Asset Response Status', response.status);
|
||||
|
||||
if (!response.ok) {
|
||||
const errorData = await response.json().catch(() => ({}));
|
||||
throw new Error(errorData.detail || 'Failed to assign asset');
|
||||
}
|
||||
|
||||
return await response.json();
|
||||
} catch (error) {
|
||||
console.error('Assign asset error:', error);
|
||||
throw error;
|
||||
}
|
||||
},
|
||||
};
|
||||
Reference in New Issue
Block a user