Companys are now listing on the companies page.

This commit is contained in:
2026-02-13 17:01:42 -06:00
parent 1a45f708ec
commit 6b176196d3
9 changed files with 304 additions and 250 deletions
+3 -166
View File
@@ -1,172 +1,9 @@
import { getRequestEvent } from "$app/server";
import { redirect } from "@sveltejs/kit";
import axios, { AxiosInstance, AxiosRequestConfig, AxiosError } from "axios";
import { PUBLIC_API_URL } from "$env/static/public";
import axios, { AxiosInstance } from "axios";
type GetAccessToken = () => string | null | Promise<string | null>;
type SetAccessToken = (token: string | null) => void;
type RefreshHandler = () => Promise<string>;
type LogoutHandler = () => void;
interface Handlers {
getAccessToken?: GetAccessToken;
setAccessToken?: SetAccessToken;
refreshHandler?: RefreshHandler;
onRefreshFailed?: LogoutHandler;
}
const event = getRequestEvent();
const api: AxiosInstance = axios.create({
baseURL: process.env.API_URL || "",
withCredentials: true,
baseURL: PUBLIC_API_URL || "",
});
let handlers: Handlers = {
getAccessToken() {
if (!event) return null;
const token = event.cookies.get("authToken");
return token || null;
},
setAccessToken(token: string | null) {
if (!event) return;
if (token) {
event.cookies.set("authToken", token, { httpOnly: true, path: "/" });
}
},
refreshHandler: async () => {
if (!event) throw new Error("No request event available");
const refreshToken = event.cookies.get("refreshToken");
if (!refreshToken) throw new Error("No refresh token available");
const response = await api.post(
"/auth/refresh",
{},
{
headers: {
"x-refresh-token": `${refreshToken}`,
},
},
);
const newAuthToken = response.data.data.authToken;
const newRefreshToken = response.data.data.refreshToken;
// Update cookies
event.cookies.set("authToken", newAuthToken, { httpOnly: true, path: "/" });
event.cookies.set("refreshToken", newRefreshToken, {
httpOnly: true,
path: "/",
});
return newAuthToken;
},
onRefreshFailed: () => {
if (!event) return;
event.cookies.delete("authToken", { path: "/" });
event.cookies.delete("refreshToken", { path: "/" });
return redirect(303, "/");
},
};
let isRefreshing = false;
let refreshPromise: Promise<string> | null = null;
const queue: {
resolve: (value?: unknown) => void;
reject: (err: unknown) => void;
config: AxiosRequestConfig;
}[] = [];
export function registerAuthHandlers(h: Handlers) {
handlers = { ...handlers, ...h };
}
async function getToken(): Promise<string | null> {
if (!handlers.getAccessToken) return null;
return handlers.getAccessToken();
}
function setToken(token: string | null) {
if (!handlers.setAccessToken) return;
handlers.setAccessToken(token);
}
function enqueueRequest(p: {
resolve: (value?: unknown) => void;
reject: (err: unknown) => void;
config: AxiosRequestConfig;
}) {
queue.push(p);
}
function processQueue(error: unknown, token: string | null = null) {
while (queue.length) {
const p = queue.shift();
if (!p) continue;
if (error) p.reject(error);
else {
if (token && p.config.headers) {
(p.config.headers as Record<string, string>)["Authorization"] =
`Bearer ${token}`;
}
p.resolve(api.request(p.config));
}
}
}
api.interceptors.request.use(
async (config) => {
const token = await getToken();
if (token && config.headers) {
(config.headers as Record<string, string>)["Authorization"] =
`Bearer ${token}`;
}
return config;
},
(err) => Promise.reject(err),
);
api.interceptors.response.use(
(res) => res,
async (
error: AxiosError & { config?: AxiosRequestConfig & { _retry?: boolean } },
) => {
const originalConfig = error.config;
if (!originalConfig) return Promise.reject(error);
const status = error.response?.status;
if (status === 401 && !originalConfig._retry) {
originalConfig._retry = true;
if (!handlers.refreshHandler) {
handlers.onRefreshFailed?.();
return Promise.reject(error);
}
if (!isRefreshing) {
isRefreshing = true;
refreshPromise = handlers.refreshHandler!()
.then((newToken) => {
setToken(newToken);
processQueue(null, newToken);
return newToken;
})
.catch((err) => {
processQueue(err);
handlers.onRefreshFailed?.();
throw err;
})
.finally(() => {
isRefreshing = false;
refreshPromise = null;
});
}
return new Promise((resolve, reject) => {
enqueueRequest({ resolve, reject, config: originalConfig });
});
}
return Promise.reject(error);
},
);
export { api };
export default api;
+16
View File
@@ -0,0 +1,16 @@
import api from "./axios";
export const company = {
async fetch() {},
async fetchMany(accessToken: string, page: number = 1) {
const companies = await api.get("/v1/company/companies", {
params: {
page,
},
headers: {
Authorization: `Bearer ${accessToken}`,
},
});
return companies.data;
},
};
+2 -4
View File
@@ -1,10 +1,8 @@
// place files you want to import through the `$lib` alias in this folder.
/**
* @TODO MAKE THIS WORK
*/
//export * from "./axios";
export * from "./axios";
export * from "./user";
export * from "./companies";
/**
* @TODO
+2
View File
@@ -28,6 +28,8 @@ export const user = {
return refreshedTokens;
},
fetchInfo() {},
logout(event: RequestEvent) {
if (!event) return;