Files
cloudron-box/dashboard/src/models/UsersModel.js
T
2025-09-16 12:05:47 +02:00

219 lines
5.7 KiB
JavaScript

import { fetcher } from '@cloudron/pankow';
import { API_ORIGIN } from '../constants.js';
function create() {
const accessToken = localStorage.token;
return {
async list() {
const perPage = 5000;
let page = 1;
let users = [];
while (true) {
let result;
try {
result = await fetcher.get(`${API_ORIGIN}/api/v1/users`, { page, per_page: perPage, access_token: accessToken });
} catch (e) {
return [e];
}
if (result.status !== 200) return [result];
users = users.concat(result.body.users);
if (result.body.users.length < perPage) break;
page++;
}
users.forEach(u => {
u.avatarUrl = `${API_ORIGIN}/api/v1/users/${u.id}/avatar?access_token=${accessToken}`;
});
return [null, users];
},
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 {
result = await fetcher.post(`${API_ORIGIN}/api/v1/users`, data, { access_token: accessToken });
} catch (e) {
return [e];
}
if (result.status !== 201) return [result];
result.body.avatarUrl = `https://${API_ORIGIN}/api/v1/users/${user.id}/avatar?access_token=${accessToken}`;
return [null, result.body];
},
async update(id, data) {
let result;
try {
result = await fetcher.post(`${API_ORIGIN}/api/v1/users/${id}/profile`, data, { access_token: accessToken });
} catch (e) {
return [e];
}
if (result.status !== 204) return [result];
return [null];
},
async remove(id) {
let result;
try {
result = await fetcher.del(`${API_ORIGIN}/api/v1/users/${id}`, null, { access_token: accessToken });
} catch (e) {
return [e];
}
if (result.status !== 204) return [result];
return [null];
},
async setLocalGroups(id, groupIds) {
let result;
try {
result = await fetcher.put(`${API_ORIGIN}/api/v1/users/${id}/groups`, { groupIds }, { access_token: accessToken });
} catch (e) {
return [e];
}
if (result.status !== 204) return [result];
return [null];
},
async setRole(id, role) {
let result;
try {
result = await fetcher.put(`${API_ORIGIN}/api/v1/users/${id}/role`, { role }, { access_token: accessToken });
} catch (e) {
return [e];
}
if (result.status !== 204) return [result];
return [null];
},
async setActive(id, active) {
let result;
try {
result = await fetcher.put(`${API_ORIGIN}/api/v1/users/${id}/active`, { active }, { access_token: accessToken });
} catch (e) {
return [e];
}
if (result.status !== 204) return [result];
return [null];
},
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];
},
async unsetAvatar(id) {
let result;
try {
result = await fetcher.del(`${API_ORIGIN}/api/v1/users/${id}/avatar`, null, { access_token: accessToken });
} catch (e) {
return [e];
}
if (result.status !== 204) return [result];
return [null];
},
async setGhost(id, password, expiresAt = 0) {
const data = { password };
if (expiresAt) data.expiresAt = expiresAt;
let result;
try {
result = await fetcher.post(`${API_ORIGIN}/api/v1/users/${id}/ghost`, data, { access_token: accessToken });
} catch (e) {
return [e];
}
if (result.status !== 204) return [result];
return [null];
},
async getPasswordResetLink(id) {
let result;
try {
result = await fetcher.get(`${API_ORIGIN}/api/v1/users/${id}/password_reset_link`, { access_token: accessToken });
} catch (e) {
return [e];
}
if (result.status !== 200) return [result];
return [null, result.body.passwordResetLink];
},
async sendPasswordResetEmail(id, email) {
let result;
try {
result = await fetcher.post(`${API_ORIGIN}/api/v1/users/${id}/send_password_reset_email`, { email }, { access_token: accessToken });
} catch (e) {
return [e];
}
if (result.status !== 202) return [result];
return [null];
},
async sendInviteEmail(id, email) {
let result;
try {
result = await fetcher.post(`${API_ORIGIN}/api/v1/users/${id}/send_invite_email`, { email }, { access_token: accessToken });
} catch (e) {
return [e];
}
if (result.status !== 202) return [result];
return [null];
},
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];
},
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];
},
};
}
export default {
create,
};