refactor: enforce frontend view model boundaries
Frontend verify / commits (pull_request) Successful in 28s
Frontend verify / security (pull_request) Successful in 10s
Frontend verify / verify (pull_request) Successful in 8m19s

This commit is contained in:
2026-09-28 18:48:23 +03:00
parent 5b69003516
commit ca0ad4f824
287 changed files with 8558 additions and 4538 deletions
+17 -3
View File
@@ -24,6 +24,7 @@ function stockQueryOptions(uid: string) {
staleTime: STOCK_STALE_TIME_MS,
};
}
function useStock(identifier: string) {
const isUid
= /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i.test(
@@ -34,6 +35,7 @@ function useStock(identifier: string) {
...stockQueryOptions(identifier),
enabled: Boolean(identifier) && isUid,
});
const byTicker = useResourceQuery({
...apiQueryClient.queryOptions("get", "/api/v1/stocks/by-ticker/{ticker}", {
params: { path: { ticker: identifier } },
@@ -41,6 +43,7 @@ function useStock(identifier: string) {
enabled: Boolean(identifier) && !isUid,
staleTime: STOCK_STALE_TIME_MS,
});
return isUid ? byUid : byTicker;
}
@@ -63,6 +66,7 @@ function useStockCompany(uid: string) {
staleTime: STOCK_STALE_TIME_MS,
});
}
function useStockDividends(uid: string) {
return useResourceQuery({
meta: { accessGroup: "brokerage" },
@@ -73,6 +77,7 @@ function useStockDividends(uid: string) {
staleTime: STOCK_STALE_TIME_MS,
});
}
function useStockPosition(uid: string) {
return useResourceQuery({
meta: { accessGroup: "brokerage" },
@@ -83,6 +88,7 @@ function useStockPosition(uid: string) {
staleTime: STOCK_STALE_TIME_MS,
});
}
function useStockQuote(uid: string) {
return useResourceQuery({
...apiQueryClient.queryOptions("get", "/api/v1/stocks/{uid}/quote", {
@@ -92,16 +98,23 @@ function useStockQuote(uid: string) {
staleTime: STOCK_STALE_TIME_MS,
});
}
function useStocks(uids: string[]) {
const uniqueUids = [...new Set(uids)];
const queries = useAuthenticatedQueries(uniqueUids.map(uniqueUid => stockQueryOptions(uniqueUid)));
const queries = useAuthenticatedQueries(
uniqueUids.map(uniqueUid => stockQueryOptions(uniqueUid)),
);
return new Map(
queries.map((query, index) => [
/* eslint-disable-line security/detect-object-injection -- This is a positional index into the local array, not a user-supplied object key. */ uniqueUids[index],
// eslint-disable-next-line security/detect-object-injection -- This is a positional index into the local array, not a user-supplied object key.
uniqueUids[index],
unwrapResourceResult(query).data,
]),
);
}
function useStockSearch(query: string) {
return useResourceQuery({
...apiQueryClient.queryOptions("get", "/api/v1/stocks", {
@@ -112,7 +125,8 @@ function useStockSearch(query: string) {
});
}
export { MIN_STOCK_SEARCH_LENGTH,
export {
MIN_STOCK_SEARCH_LENGTH,
type StockPeriod,
useStock,
useStockCandles,