···44444545# Runs a SELECT statement to query the users
4646list_user_accounts:
4747- psql senac_brigade -c "SELECT * FROM user_account LIMIT 20;" | bat --language=markdown
4747+ psql senac_brigade -c "SELECT u.full_name, u.registration, u.phone, u.email FROM user_account as u LIMIT 20;" | bat --language=markdown
+9-9
priv/sql/rebuild_database.sql
···20202121CREATE TABLE IF NOT EXISTS user_role (
2222 id UUID PRIMARY KEY DEFAULT GEN_RANDOM_UUID(),
2323- name VARCHAR(255) NOT NULL,
2323+ name TEXT NOT NULL,
2424 description TEXT
2525);
2626···2828 id UUID PRIMARY KEY DEFAULT GEN_RANDOM_UUID(),
2929 role_id UUID REFERENCES user_role (id)
3030 ON UPDATE CASCADE ON DELETE SET NULL DEFAULT NULL,
3131- full_name VARCHAR(255) NOT NULL,
3131+ full_name TEXT NOT NULL,
3232 password_hash TEXT NOT NULL,
3333- registration VARCHAR(255) UNIQUE NOT NULL,
3434- phone VARCHAR(255) DEFAULT NULL,
3535- email VARCHAR(255) UNIQUE NOT NULL,
3333+ registration TEXT UNIQUE NOT NULL,
3434+ phone TEXT DEFAULT NULL,
3535+ email TEXT UNIQUE NOT NULL,
3636 is_active BOOLEAN DEFAULT TRUE,
3737 created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
3838 updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
···41414242CREATE TABLE IF NOT EXISTS brigade (
4343 id UUID PRIMARY KEY DEFAULT GEN_RANDOM_UUID(),
4444- name VARCHAR(255) DEFAULT NULL,
4444+ name TEXT DEFAULT NULL,
4545 description TEXT DEFAULT NULL,
4646 is_active BOOLEAN DEFAULT FALSE
4747);
···6767 -- vv
6868 parent_type UUID REFERENCES occurrence_type (id)
6969 ON UPDATE CASCADE ON DELETE CASCADE DEFAULT NULL,
7070- name VARCHAR(255) UNIQUE NOT NULL,
7070+ name TEXT UNIQUE NOT NULL,
7171 description TEXT,
7272 created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
7373);
···8484 description TEXT,
85858686 -- HACK: There might be a better way to store this
8787- address VARCHAR(255) NOT NULL,
8787+ address TEXT NOT NULL,
88888989- reference_point VARCHAR(255) NOT NULL,
8989+ reference_point TEXT NOT NULL,
9090 loss_percentage NUMERIC(2),
9191 created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
9292 updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
+50-13
src/app/routes/signup.gleam
···11import app/sql
22import app/web.{type Context}
33+import argus
34import formal/form
55+import gleam/result
46import wisp
5768type SignUp {
···40424143 case form_result {
4244 Error(_) -> wisp.bad_request("Dados inválidos")
4343- Ok(signup_data) -> {
4444- let register_result =
4545- // TODO: Hash the password before storing it
4646- sql.register_new_user(
4747- ctx.conn,
4848- signup_data.name,
4949- signup_data.registration,
5050- signup_data.email,
5151- signup_data.password,
5252- )
4545+ Ok(signup) -> {
4646+ // TODO: Check if the user exists first, before trying to insert.
4747+ // == -------------------------------------------------------- ==
4848+ case insert_in_database(signup:, context: ctx) {
4949+ Error(err) -> {
5050+ let error_message = case err {
5151+ // Hashing went wrong
5252+ HashFailure ->
5353+ wisp.Text("Ocorreu um erro ao encriptografar a senha do usuário")
5454+ // Something when wrong inside the database
5555+ InsertError ->
5656+ wisp.Text(
5757+ "Ocorreu um erro ao inserir o usuário no banco de dados",
5858+ )
5959+ }
53605454- case register_result {
5555- Error(_) -> {
5661 wisp.internal_server_error()
5757- |> wisp.set_body(wisp.Text("Ocorreu um erro ao cadastrar um usuário"))
6262+ |> wisp.set_body({ error_message })
5863 }
6464+5965 Ok(_) -> {
6066 wisp.created()
6767+ // User registred successfully
6168 |> wisp.set_body(wisp.Text("Cadastro realizado com sucesso"))
6269 }
6370 }
6471 }
6572 }
6673}
7474+7575+type SignupError {
7676+ HashFailure
7777+ InsertError
7878+}
7979+8080+fn insert_in_database(
8181+ signup data: SignUp,
8282+ context ctx: Context,
8383+) -> Result(Nil, SignupError) {
8484+ use hashes <- result.try(
8585+ argus.hasher()
8686+ |> argus.hash(data.password, argus.gen_salt())
8787+ |> result.replace_error(HashFailure),
8888+ )
8989+9090+ use _ <- result.try(
9191+ sql.register_new_user(
9292+ ctx.conn,
9393+ data.name,
9494+ data.registration,
9595+ data.email,
9696+ hashes.encoded_hash,
9797+ )
9898+ |> result.replace_error(InsertError),
9999+ )
100100+101101+ // No need to return anything from this function
102102+ Ok(Nil)
103103+}