Files
print-calculator/frontend/src/app/features/admin/services/admin-orders.service.ts
Joe Küng 235fe7780d
All checks were successful
PR Checks / security-sast (pull_request) Successful in 29s
PR Checks / test-backend (pull_request) Successful in 27s
PR Checks / prettier-autofix (pull_request) Successful in 11s
PR Checks / test-frontend (pull_request) Successful in 1m0s
feat(back-end and front-end): calculator improvements
2026-03-05 18:30:37 +01:00

118 lines
3.0 KiB
TypeScript

import { inject, Injectable } from '@angular/core';
import { HttpClient } from '@angular/common/http';
import { Observable } from 'rxjs';
import { environment } from '../../../../environments/environment';
export interface AdminOrderItem {
id: string;
originalFilename: string;
materialCode: string;
colorCode: string;
filamentVariantId?: number;
filamentVariantDisplayName?: string;
filamentColorName?: string;
filamentColorHex?: string;
quality?: string;
nozzleDiameterMm?: number;
layerHeightMm?: number;
infillPercent?: number;
infillPattern?: string;
supportsEnabled?: boolean;
quantity: number;
printTimeSeconds: number;
materialGrams: number;
unitPriceChf: number;
lineTotalChf: number;
}
export interface AdminOrder {
id: string;
orderNumber: string;
status: string;
paymentStatus?: string;
paymentMethod?: string;
customerEmail: string;
totalChf: number;
createdAt: string;
isCadOrder?: boolean;
sourceRequestId?: string;
cadHours?: number;
cadHourlyRateChf?: number;
cadTotalChf?: number;
printMaterialCode?: string;
printNozzleDiameterMm?: number;
printLayerHeightMm?: number;
printInfillPattern?: string;
printInfillPercent?: number;
printSupportsEnabled?: boolean;
items: AdminOrderItem[];
}
export interface AdminUpdateOrderStatusPayload {
status: string;
}
@Injectable({
providedIn: 'root',
})
export class AdminOrdersService {
private readonly http = inject(HttpClient);
private readonly baseUrl = `${environment.apiUrl}/api/admin/orders`;
listOrders(): Observable<AdminOrder[]> {
return this.http.get<AdminOrder[]>(this.baseUrl, { withCredentials: true });
}
getOrder(orderId: string): Observable<AdminOrder> {
return this.http.get<AdminOrder>(`${this.baseUrl}/${orderId}`, {
withCredentials: true,
});
}
updatePaymentMethod(orderId: string, method: string): Observable<AdminOrder> {
return this.http.post<AdminOrder>(
`${this.baseUrl}/${orderId}/payments/confirm`,
{ method },
{ withCredentials: true },
);
}
updateOrderStatus(
orderId: string,
payload: AdminUpdateOrderStatusPayload,
): Observable<AdminOrder> {
return this.http.post<AdminOrder>(
`${this.baseUrl}/${orderId}/status`,
payload,
{ withCredentials: true },
);
}
downloadOrderItemFile(
orderId: string,
orderItemId: string,
): Observable<Blob> {
return this.http.get(
`${this.baseUrl}/${orderId}/items/${orderItemId}/file`,
{
withCredentials: true,
responseType: 'blob',
},
);
}
downloadOrderConfirmation(orderId: string): Observable<Blob> {
return this.http.get(`${this.baseUrl}/${orderId}/documents/confirmation`, {
withCredentials: true,
responseType: 'blob',
});
}
downloadOrderInvoice(orderId: string): Observable<Blob> {
return this.http.get(`${this.baseUrl}/${orderId}/documents/invoice`, {
withCredentials: true,
responseType: 'blob',
});
}
}