Skip to content
Snippets Groups Projects
handleUser.js 8.19 KiB
Newer Older
  • Learn to ignore specific revisions
  • Alexis Poyen's avatar
    Alexis Poyen committed
    // Imports
    import { RandomString } from "/services/common/common.js";
    import * as Messages from "/services/messages/messages.js";
    import * as Auth from "/services/auth/auth.js";
    import * as Users from "/components/users/users.js";
    
    // DOM elements
    let id_field;
    let idOAuth_field;
    let login_field;
    let password_field;
    let name_field;
    let role_field;
    
    // local variables
    let current_user;
    let update_user;
    
    export async function mount(where, parent) {
      const handleUser = new HandleUser(parent);
      await handleUser.mount(where);
      handleUser.handleDom();
      return handleUser;
    }
    
    class HandleUser {
      constructor(parent) {
        this.parent = parent;
      }
    
      async mount(where) {
        document.getElementById(where).innerHTML = /* HTML */ `
          <div class="modal-background"></div>
          <div class="modal-card" id="users-modal-card">
            <header class="modal-card-head">
              <p class="modal-card-title">Ajout/modification d'un utilisateur</p>
    
              <button
                class="delete"
                aria-label="close"
                id="users-modal-close"
              ></button>
    
    Alexis Poyen's avatar
    Alexis Poyen committed
            </header>
            <section class="modal-card-body">
              <div class="field">
                <label>Id</label>
                <div class="control">
                  <input class="input" type="number" id="users-modal-id" disabled />
                </div>
              </div>
              <div class="field">
                <label>IdOAuth</label>
                <div class="control">
                  <input class="input" type="text" id="users-modal-idoauth" />
                </div>
              </div>
              <div class="field">
                <label>Identifiant</label>
                <div class="control">
                  <input class="input" type="text" id="users-modal-login" />
                </div>
              </div>
              <div class="field" id="users-modal-password-container">
                <label>Mot de passe</label>
                <div class="control">
                  <input class="input" type="text" id="users-modal-password" />
                </div>
              </div>
              <div class="field" id="users-modal-name-container">
                <label>Nom</label>
                <div class="control">
                  <input class="input" type="text" id="users-modal-name" />
                </div>
              </div>
              <div class="field" id="users-modal-role-container">
                <label>Rôle</label><br />
                <div class="control select">
                  <select name="role" id="users-modal-role">
    
                    <option value="VISUALIZER">Visualiseur</option>
                    <option value="CAPTURER">Saisisseur</option>
    
    Alexis Poyen's avatar
    Alexis Poyen committed
                    <option value="ADMIN">Administrateur</option>
                  </select>
                </div>
              </div>
            </section>
            <footer class="modal-card-foot">
    
              <button id="users-modal-save" class="button is-success">
                Sauvegarder
              </button>
    
    Alexis Poyen's avatar
    Alexis Poyen committed
              <button id="users-modal-cancel" class="button">Annuler</button>
            </footer>
          </div>
        `;
        current_user = await Auth.GetUser();
      }
    
      handleDom() {
        id_field = document.getElementById("users-modal-id");
        idOAuth_field = document.getElementById("users-modal-idoauth");
        login_field = document.getElementById("users-modal-login");
        password_field = document.getElementById("users-modal-password");
        name_field = document.getElementById("users-modal-name");
        role_field = document.getElementById("users-modal-role");
    
    
        document
          .getElementById(`users-modal-close`)
          .addEventListener("click", function () {
            Users.toggleModal("users-modal", "users-modal-card");
          });
        document
          .getElementById(`users-modal-cancel`)
          .addEventListener("click", function () {
            Users.toggleModal("users-modal", "users-modal-card");
          });
    
    Alexis Poyen's avatar
    Alexis Poyen committed
        let userHandler = this;
    
        document
          .getElementById(`users-modal-save`)
          .addEventListener("click", function () {
            userHandler.postUser();
          });
    
    Alexis Poyen's avatar
    Alexis Poyen committed
        document.getElementById(`users-new`).addEventListener("click", function () {
          userHandler.newUser();
        });
      }
    
      async newUser() {
        update_user = false;
        id_field.value = "";
        login_field.value = "";
        password_field.value = RandomString(48);
        name_field.value = "";
        role_field.value = "";
        Users.toggleModal("users-modal", "users-modal-card");
      }
    
      async deleteUser(user) {
        try {
          const response = await fetch("/api/admin/users/" + user.id, {
            method: "delete",
            headers: new Headers({
              "XSRF-Token": current_user.xsrftoken,
            }),
          });
          if (response.status !== 200) {
    
            throw new Error(
              `User could not be deleted (status ${response.status})`
            );
    
    Alexis Poyen's avatar
    Alexis Poyen committed
          }
          document.getElementById(`users-user-${user.id}`).remove();
        } catch (e) {
          Messages.Show("is-warning", e.message);
          console.error(e);
        }
    
        if (user.role == "CAPTURER") {
          let capturer = await Auth.getCapturerByUserID(user.id, current_user);
          if (capturer != undefined) await this.deleteCapturer(capturer);
    
    Alexis Poyen's avatar
    Alexis Poyen committed
        }
      }
    
      editUser(user) {
        this.parent.cleanUser(user);
        update_user = true;
        id_field.value = user.id;
        idOAuth_field.value = user.idOAuth;
        login_field.value = user.login;
        password_field.value = "";
        name_field.value = user.name;
        role_field.value = user.role;
        Users.toggleModal("users-modal", "users-modal-card");
      }
    
      async updateUsers() {
        try {
          const response = await fetch("/api/admin/users/", {
            method: "GET",
            headers: new Headers({
              "XSRF-Token": current_user.xsrftoken,
            }),
          });
          if (response.status !== 200) {
    
            throw new Error(
              `Users could not be fetched (status ${response.status})`
            );
    
    Alexis Poyen's avatar
    Alexis Poyen committed
          }
          return await response.json();
        } catch (e) {
          Messages.Show("is-warning", e.message);
          console.error(e);
        }
      }
    
      async postUser() {
        let method;
        if (update_user) method = "PUT";
        else method = "POST";
    
        try {
          if (role_field.value == "") {
    
            Messages.Show(
              "is-warning",
              "Veuillez choisir un rôle pour l'utilisateur"
            );
    
    Alexis Poyen's avatar
    Alexis Poyen committed
            return;
          }
          const response = await fetch("/api/admin/users/" + id_field.value, {
            method: method,
            headers: new Headers({
              "XSRF-Token": current_user.xsrftoken,
            }),
            body: JSON.stringify({
              id: id_field.value,
              login: login_field.value,
              password: password_field.value,
              name: name_field.value,
              role: role_field.value,
            }),
          });
          if (response.status !== 200) {
    
            throw new Error(
              `User could not be updated or created (status ${response.status})`
            );
    
    Alexis Poyen's avatar
    Alexis Poyen committed
          }
          let user = await response.json();
    
          if (user != undefined && user.role == "CAPTURER")
            await this.postCapturer(user, method);
          this.parent.displayUsers();
    
    Alexis Poyen's avatar
    Alexis Poyen committed
        } catch (e) {
          Messages.Show("is-warning", e.message);
          console.error(e);
        }
        Users.toggleModal("users-modal", "users-modal-card");
      }
    
    
      async postCapturer(user, method) {
        let capturer;
        if (method === "PUT") capturer = await Auth.getCapturerByUserID(user.id, current_user);
        else capturer = {};
        console.log(capturer)
        try {
          const response = await fetch("/api/Capturer/" + capturer.ID, {
            method: method,
            headers: new Headers({
              "XSRF-Token": current_user.xsrftoken,
            }),
            body: JSON.stringify({
              ID: capturer.ID,
              UserID: user.id,
              Name: user.name,
            }),
          });
          if (response.status !== 200) {
            throw new Error(
              `Capturer could not be deleted (status ${response.status})`
            );
          }
        } catch (e) {
          Messages.Show("is-warning", e.message);
          console.error(e);
        }
      }
    
      async deleteCapturer(capturer) {
        try {
          const response = await fetch("/api/Capturer/" + capturer.ID, {
            method: "delete",
            headers: new Headers({
              "XSRF-Token": current_user.xsrftoken,
            }),
          });
          if (response.status !== 200) {
            throw new Error(
              `Capturer could not be deleted (status ${response.status})`
            );
          }
        } catch (e) {
          Messages.Show("is-warning", e.message);
          console.error(e);
        }
      }
    
    Alexis Poyen's avatar
    Alexis Poyen committed
    }