Initial LinkedSign platform

This commit is contained in:
2026-04-06 20:33:59 -05:00
commit 1074c7c9d2
159 changed files with 19072 additions and 0 deletions
+9
View File
@@ -0,0 +1,9 @@
import client from './client';
export const register = (data) => client.post('/auth/register', data);
export const login = (data) => client.post('/auth/login', data);
export const logout = (refreshToken) => client.post('/auth/logout', { refreshToken });
export const getMe = () => client.get('/auth/me');
export const verifyEmail = (token) => client.get(`/auth/verify/${token}`);
export const changePassword = (data) => client.patch('/auth/change-password', data);
export const confirmPasswordChange = (token) => client.get(`/auth/confirm-password-change/${token}`);
+12
View File
@@ -0,0 +1,12 @@
import client from './client';
export const uploadCertificate = (file, password, alias) => {
const form = new FormData();
form.append('file', file);
if (password) form.append('password', password);
if (alias) form.append('alias', alias);
return client.post('/certificates', form, { headers: { 'Content-Type': 'multipart/form-data' } });
};
export const listCertificates = () => client.get('/certificates');
export const deleteCertificate = (id) => client.delete(`/certificates/${id}`);
+42
View File
@@ -0,0 +1,42 @@
import axios from 'axios';
const API_URL = import.meta.env.VITE_API_URL || 'http://localhost:4000';
const client = axios.create({
baseURL: API_URL,
headers: { 'Content-Type': 'application/json' },
});
client.interceptors.request.use((config) => {
const token = localStorage.getItem('accessToken');
if (token) config.headers.Authorization = `Bearer ${token}`;
return config;
});
client.interceptors.response.use(
(res) => res,
async (error) => {
const original = error.config;
if (error.response?.status === 401 && !original._retry) {
original._retry = true;
const refreshToken = localStorage.getItem('refreshToken');
if (refreshToken) {
try {
const { data } = await axios.post(`${API_URL}/auth/refresh`, { refreshToken });
const { accessToken, refreshToken: newRefresh } = data.data;
localStorage.setItem('accessToken', accessToken);
localStorage.setItem('refreshToken', newRefresh);
original.headers.Authorization = `Bearer ${accessToken}`;
return client(original);
} catch {
localStorage.removeItem('accessToken');
localStorage.removeItem('refreshToken');
window.location.href = '/login';
}
}
}
return Promise.reject(error);
}
);
export default client;
+12
View File
@@ -0,0 +1,12 @@
import client from './client';
export const uploadDocument = (file) => {
const form = new FormData();
form.append('file', file);
return client.post('/documents', form, { headers: { 'Content-Type': 'multipart/form-data' } });
};
export const listDocuments = (params) => client.get('/documents', { params });
export const getDocument = (id) => client.get(`/documents/${id}`);
export const deleteDocument = (id) => client.delete(`/documents/${id}`);
export const downloadDocument = (id) => client.get(`/documents/${id}/download`, { responseType: 'blob' });
+5
View File
@@ -0,0 +1,5 @@
import axios from 'axios';
const API_URL = import.meta.env.VITE_API_URL || 'http://localhost:4000';
export const verifySignature = (code) => axios.get(`${API_URL}/signatures/verify/${code}`);
+6
View File
@@ -0,0 +1,6 @@
import client from './client';
export const signDocument = (data) => client.post('/signatures/sign', data);
export const listSignedDocuments = () => client.get('/signatures/mine');
export const getSignatures = (documentId) => client.get(`/signatures/document/${documentId}`);
export const downloadSigned = (sigId) => client.get(`/signatures/${sigId}/download`, { responseType: 'blob' });
+4
View File
@@ -0,0 +1,4 @@
import client from './client';
export const updateSignatureAppearancePreference = (signaturePreferences) =>
client.patch('/users/me/preferences/signature-appearance', signaturePreferences);