diff --git a/src/server/startup.gleam b/src/server/startup.gleam index 5d0d90b..a8ace40 100644 --- a/src/server/startup.gleam +++ b/src/server/startup.gleam @@ -242,6 +242,8 @@ pub fn get_members( database: pog.Connection, id: uuid.Uuid, ) -> Result(List(user.User), StartupError) { + use <- ensure_exists(database, id) + use returned <- result.map( sql.get_members(database, id) |> result.map_error(DatabaseError), @@ -263,24 +265,41 @@ pub fn get_segments( database: pog.Connection, id: uuid.Uuid, ) -> Result(List(segment.Segment), StartupError) { - use returned <- result.try( + use <- ensure_exists(database, id) + + use returned <- result.map( sql.get_segments(database, id) |> result.map_error(DatabaseError), ) + use row <- list.map(returned.rows) + segment.Segment(id: row.id, name: row.name, description: row.description) +} + +/// Returns `Error(NotFound)` if a startup is not registered in the Database +/// +/// ## Examples +/// +/// ```gleam +/// use <- ensure_exists(database, id) +/// +/// use returned <- result.map( +/// sql.get_members(database, id) +/// |> result.map_error(DatabaseError), +/// ) +/// ``` +pub fn ensure_exists( + database: pog.Connection, + id: uuid.Uuid, + fun: fn() -> Result(a, StartupError), +) -> Result(a, StartupError) { + use returned <- result.try( + sql.ensure_exists(database, id) + |> result.map_error(DatabaseError), + ) + case returned.rows { [] -> Error(NotFound) - rows -> { - let segments = - list.map(rows, fn(row) { - segment.Segment( - id: row.id, - name: row.name, - description: row.description, - ) - }) - - Ok(segments) - } + _found -> fun() } } diff --git a/src/server/startup/sql.gleam b/src/server/startup/sql.gleam index 5a35239..b87eae3 100644 --- a/src/server/startup/sql.gleam +++ b/src/server/startup/sql.gleam @@ -52,6 +52,44 @@ RETURNING |> pog.execute(db) } +/// A row you get from running the `ensure_exists` query +/// defined in `./src/server/startup/sql/ensure_exists.sql`. +/// +/// > 🐿️ This type definition was generated automatically using v4.7.0 of the +/// > [squirrel package](https://github.com/giacomocavalieri/squirrel). +/// +pub type EnsureExistsRow { + EnsureExistsRow(found: Int) +} + +/// return a single column if the given startup exists +/// +/// > 🐿️ This function was generated automatically using v4.7.0 of +/// > the [squirrel package](https://github.com/giacomocavalieri/squirrel). +/// +pub fn ensure_exists( + db: pog.Connection, + arg_1: Uuid, +) -> Result(pog.Returned(EnsureExistsRow), pog.QueryError) { + let decoder = { + use found <- decode.field(0, decode.int) + decode.success(EnsureExistsRow(found:)) + } + + "-- return a single column if the given startup exists +SELECT + 1 AS found +FROM + startup AS s +WHERE + s.id = $1::uuid; +" + |> pog.query + |> pog.parameter(pog.text(uuid.to_string(arg_1))) + |> pog.returning(decoder) + |> pog.execute(db) +} + /// A row you get from running the `get` query /// defined in `./src/server/startup/sql/get.sql`. /// diff --git a/src/server/startup/sql/ensure_exists.sql b/src/server/startup/sql/ensure_exists.sql new file mode 100644 index 0000000..327d4a1 --- /dev/null +++ b/src/server/startup/sql/ensure_exists.sql @@ -0,0 +1,7 @@ +-- return a single column if the given startup exists +SELECT + 1 AS found +FROM + startup AS s +WHERE + s.id = $1::uuid; diff --git a/test/server/startup_test.gleam b/test/server/startup_test.gleam index 3823cef..dfb547a 100644 --- a/test/server/startup_test.gleam +++ b/test/server/startup_test.gleam @@ -119,9 +119,15 @@ pub fn assign_startup_members_test() -> Nil { pub fn get_startup_members_test() -> Nil { use context <- server_test.with_context() - let cnpj = wisp.random_string(14) let assert Ok(startup) = - startup.register(context.database, "", cnpj, "", "", "") + startup.register( + context.database, + name: "startup", + cnpj: "00000000000000", + description: "some description", + city: "Recife", + state: "PE", + ) let members = { use acc, i <- int.range(from: 1, to: 8, with: []) @@ -140,8 +146,8 @@ pub fn get_startup_members_test() -> Nil { ) let want = set.from_list(members) - let assert Ok(got) = - result.map(startup.get_members(context.database, startup.id), set.from_list) + let assert Ok(got) = startup.get_members(context.database, startup.id) + let got = set.from_list(got) assert set.difference(want, got) == set.from_list([]) }