Companys are now listing on the companies page.
This commit is contained in:
+3
-166
@@ -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;
|
||||
|
||||
@@ -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
@@ -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
|
||||
|
||||
@@ -28,6 +28,8 @@ export const user = {
|
||||
return refreshedTokens;
|
||||
},
|
||||
|
||||
fetchInfo() {},
|
||||
|
||||
logout(event: RequestEvent) {
|
||||
if (!event) return;
|
||||
|
||||
|
||||
Reference in New Issue
Block a user