2025-01-03 15:06:41 +01:00
|
|
|
|
2025-07-10 11:55:11 +02:00
|
|
|
import { fetcher } from '@cloudron/pankow';
|
2025-03-03 11:22:56 +01:00
|
|
|
import { API_ORIGIN } from '../constants.js';
|
2025-01-03 15:06:41 +01:00
|
|
|
|
2025-01-31 21:02:48 +01:00
|
|
|
function create() {
|
|
|
|
|
const accessToken = localStorage.token;
|
|
|
|
|
|
2025-01-03 15:06:41 +01:00
|
|
|
return {
|
|
|
|
|
async list() {
|
|
|
|
|
const perPage = 5000;
|
|
|
|
|
|
|
|
|
|
let page = 1;
|
|
|
|
|
let users = [];
|
|
|
|
|
|
|
|
|
|
while (true) {
|
2025-02-12 15:18:45 +01:00
|
|
|
let result;
|
2025-01-03 15:06:41 +01:00
|
|
|
try {
|
2025-03-03 11:22:56 +01:00
|
|
|
result = await fetcher.get(`${API_ORIGIN}/api/v1/users`, { page, per_page: perPage, access_token: accessToken });
|
2025-01-03 15:06:41 +01:00
|
|
|
} catch (e) {
|
2025-02-12 15:18:45 +01:00
|
|
|
return [e];
|
2025-01-03 15:06:41 +01:00
|
|
|
}
|
|
|
|
|
|
2025-02-12 15:18:45 +01:00
|
|
|
if (result.status !== 200) return [result];
|
2025-01-03 15:06:41 +01:00
|
|
|
|
|
|
|
|
users = users.concat(result.body.users);
|
|
|
|
|
|
|
|
|
|
if (result.body.users.length < perPage) break;
|
|
|
|
|
|
|
|
|
|
page++;
|
|
|
|
|
}
|
|
|
|
|
|
2025-06-30 20:48:51 +02:00
|
|
|
users.forEach(u => {
|
|
|
|
|
u.avatarUrl = `${API_ORIGIN}/api/v1/users/${u.id}/avatar?access_token=${accessToken}`;
|
|
|
|
|
});
|
|
|
|
|
|
2025-02-11 15:31:47 +01:00
|
|
|
return [null, users];
|
2025-01-03 15:06:41 +01:00
|
|
|
},
|
2025-02-16 17:04:58 +01:00
|
|
|
async add(user) {
|
|
|
|
|
const data = {
|
|
|
|
|
email: user.email,
|
|
|
|
|
fallbackEmail: user.fallbackEmail,
|
|
|
|
|
displayName: user.displayName,
|
|
|
|
|
role: user.role
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
if (user.username) data.username = user.username;
|
|
|
|
|
if (user.password) data.password = user.password;
|
|
|
|
|
|
|
|
|
|
let result;
|
|
|
|
|
try {
|
2025-03-03 11:22:56 +01:00
|
|
|
result = await fetcher.post(`${API_ORIGIN}/api/v1/users`, data, { access_token: accessToken });
|
2025-02-16 17:04:58 +01:00
|
|
|
} catch (e) {
|
|
|
|
|
return [e];
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (result.status !== 201) return [result];
|
|
|
|
|
|
2025-06-30 20:48:51 +02:00
|
|
|
result.body.avatarUrl = `https://${API_ORIGIN}/api/v1/users/${u.id}/avatar?access_token=${accessToken}`;
|
|
|
|
|
|
2025-02-16 17:04:58 +01:00
|
|
|
return [null, result.body];
|
|
|
|
|
},
|
|
|
|
|
async update(id, data) {
|
|
|
|
|
let result;
|
|
|
|
|
try {
|
2025-03-03 11:22:56 +01:00
|
|
|
result = await fetcher.post(`${API_ORIGIN}/api/v1/users/${id}/profile`, data, { access_token: accessToken });
|
2025-02-16 17:04:58 +01:00
|
|
|
} catch (e) {
|
|
|
|
|
return [e];
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (result.status !== 204) return [result];
|
|
|
|
|
|
|
|
|
|
return [null];
|
|
|
|
|
},
|
2025-02-12 15:18:45 +01:00
|
|
|
async remove(id) {
|
|
|
|
|
let result;
|
|
|
|
|
try {
|
2025-03-14 18:48:13 +01:00
|
|
|
result = await fetcher.del(`${API_ORIGIN}/api/v1/users/${id}`, null, { access_token: accessToken });
|
2025-02-12 15:18:45 +01:00
|
|
|
} catch (e) {
|
|
|
|
|
return [e];
|
|
|
|
|
}
|
|
|
|
|
|
2025-02-12 15:54:04 +01:00
|
|
|
if (result.status !== 204) return [result];
|
|
|
|
|
return [null];
|
|
|
|
|
},
|
2025-02-16 17:04:58 +01:00
|
|
|
async setLocalGroups(id, groupIds) {
|
|
|
|
|
let result;
|
|
|
|
|
try {
|
2025-03-03 11:22:56 +01:00
|
|
|
result = await fetcher.put(`${API_ORIGIN}/api/v1/users/${id}/groups`, { groupIds }, { access_token: accessToken });
|
2025-02-16 17:04:58 +01:00
|
|
|
} catch (e) {
|
|
|
|
|
return [e];
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (result.status !== 204) return [result];
|
|
|
|
|
return [null];
|
|
|
|
|
},
|
|
|
|
|
async setRole(id, role) {
|
|
|
|
|
let result;
|
|
|
|
|
try {
|
2025-03-03 11:22:56 +01:00
|
|
|
result = await fetcher.put(`${API_ORIGIN}/api/v1/users/${id}/role`, { role }, { access_token: accessToken });
|
2025-02-16 17:04:58 +01:00
|
|
|
} catch (e) {
|
|
|
|
|
return [e];
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (result.status !== 204) return [result];
|
|
|
|
|
return [null];
|
|
|
|
|
},
|
|
|
|
|
async setActive(id, active) {
|
|
|
|
|
let result;
|
|
|
|
|
try {
|
2025-03-03 11:22:56 +01:00
|
|
|
result = await fetcher.put(`${API_ORIGIN}/api/v1/users/${id}/active`, { active }, { access_token: accessToken });
|
2025-02-16 17:04:58 +01:00
|
|
|
} catch (e) {
|
|
|
|
|
return [e];
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (result.status !== 204) return [result];
|
|
|
|
|
return [null];
|
|
|
|
|
},
|
2025-06-30 20:48:51 +02:00
|
|
|
async setAvatar(id, file) {
|
|
|
|
|
const fd = new FormData();
|
|
|
|
|
fd.append('avatar', file);
|
|
|
|
|
|
|
|
|
|
let result;
|
|
|
|
|
try {
|
|
|
|
|
result = await fetcher.post(`${API_ORIGIN}/api/v1/users/${id}/avatar`, fd, { access_token: accessToken });
|
|
|
|
|
} catch (e) {
|
|
|
|
|
return [e];
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (result.status !== 204) return [result];
|
|
|
|
|
return [null];
|
|
|
|
|
},
|
2025-02-12 15:54:04 +01:00
|
|
|
async setGhost(id, password, expiresAt = 0) {
|
|
|
|
|
const data = { password };
|
|
|
|
|
|
|
|
|
|
if (expiresAt) data.expiresAt = expiresAt;
|
|
|
|
|
|
|
|
|
|
let result;
|
|
|
|
|
try {
|
2025-03-03 11:22:56 +01:00
|
|
|
result = await fetcher.post(`${API_ORIGIN}/api/v1/users/${id}/ghost`, data, { access_token: accessToken });
|
2025-02-12 15:54:04 +01:00
|
|
|
} catch (e) {
|
|
|
|
|
return [e];
|
|
|
|
|
}
|
|
|
|
|
|
2025-02-12 15:18:45 +01:00
|
|
|
if (result.status !== 204) return [result];
|
|
|
|
|
return [null];
|
|
|
|
|
},
|
2025-02-13 17:15:48 +01:00
|
|
|
async getPasswordResetLink(id) {
|
|
|
|
|
let result;
|
|
|
|
|
try {
|
2025-03-03 11:22:56 +01:00
|
|
|
result = await fetcher.get(`${API_ORIGIN}/api/v1/users/${id}/password_reset_link`, { access_token: accessToken });
|
2025-02-13 17:15:48 +01:00
|
|
|
} catch (e) {
|
|
|
|
|
return [e];
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (result.status !== 200) return [result];
|
|
|
|
|
return [null, result.body.passwordResetLink];
|
|
|
|
|
},
|
|
|
|
|
async sendPasswordResetEmail(id, email) {
|
|
|
|
|
let result;
|
|
|
|
|
try {
|
2025-03-03 11:22:56 +01:00
|
|
|
result = await fetcher.post(`${API_ORIGIN}/api/v1/users/${id}/send_password_reset_email`, { email }, { access_token: accessToken });
|
2025-02-13 17:15:48 +01:00
|
|
|
} catch (e) {
|
|
|
|
|
return [e];
|
|
|
|
|
}
|
|
|
|
|
|
2025-02-16 17:04:58 +01:00
|
|
|
if (result.status !== 202) return [result];
|
|
|
|
|
return [null];
|
|
|
|
|
},
|
|
|
|
|
async sendInviteEmail(id, email) {
|
|
|
|
|
let result;
|
|
|
|
|
try {
|
2025-03-03 11:22:56 +01:00
|
|
|
result = await fetcher.post(`${API_ORIGIN}/api/v1/users/${id}/send_invite_email`, { email }, { access_token: accessToken });
|
2025-02-16 17:04:58 +01:00
|
|
|
} catch (e) {
|
|
|
|
|
return [e];
|
|
|
|
|
}
|
|
|
|
|
|
2025-02-13 17:15:48 +01:00
|
|
|
if (result.status !== 202) return [result];
|
|
|
|
|
return [null];
|
|
|
|
|
},
|
2025-03-28 20:39:54 +01:00
|
|
|
async inviteLink(id) {
|
|
|
|
|
let result;
|
|
|
|
|
try {
|
|
|
|
|
result = await fetcher.get(`${API_ORIGIN}/api/v1/users/${id}/invite_link`, { access_token: accessToken });
|
|
|
|
|
} catch (e) {
|
|
|
|
|
return [e];
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (result.status !== 200) return [result];
|
|
|
|
|
return [null, result.body.inviteLink];
|
|
|
|
|
},
|
2025-06-04 10:48:57 +02:00
|
|
|
async disableTwoFactorAuthentication(id) {
|
|
|
|
|
let result;
|
|
|
|
|
try {
|
|
|
|
|
result = await fetcher.post(`${API_ORIGIN}/api/v1/users/${id}/twofactorauthentication_disable`, {}, { access_token: accessToken });
|
|
|
|
|
} catch (e) {
|
|
|
|
|
return [e];
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (result.status !== 200) return [result];
|
|
|
|
|
return [null];
|
|
|
|
|
},
|
2025-01-03 15:06:41 +01:00
|
|
|
};
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
export default {
|
|
|
|
|
create,
|
|
|
|
|
};
|