Add SQL query for insert citizen with user

This commit is contained in:
2019-08-24 00:28:25 +02:00
parent 1adbef817a
commit 29463e310e
4 changed files with 72 additions and 10 deletions

View File

@@ -11,9 +11,10 @@ import fr.dcproject.entity.Citizen as CitizenEntity
class Citizen(override var requester: Requester) : RepositoryI<CitizenEntity> {
override val entityName = CitizenEntity::class
fun findById(id: UUID): CitizenEntity? {
val function = requester.getFunction("find_citizen_by_id")
return function.selectOne("id" to id)
fun findById(id: UUID, withUser: Boolean = false): CitizenEntity? {
return requester
.getFunction(if (withUser) "find_citizen_by_id_with_user" else "find_citizen_by_id")
.selectOne("id" to id)
}
fun find(
@@ -38,4 +39,10 @@ class Citizen(override var requester: Requester) : RepositoryI<CitizenEntity> {
.getFunction("upsert_citizen")
.selectOne("resource" to citizen)
}
fun createWithUser(citizen: CitizenEntity): CitizenEntity? {
return requester
.getFunction("insert_citizen_with_user")
.selectOne("resource" to citizen)
}
}

View File

@@ -0,0 +1,18 @@
create or replace function find_citizen_by_id_with_user(in id uuid, out resource json) language plpgsql as
$$
declare
_id alias for id;
begin
select to_json(t) into resource
from (
select
z.*,
u as "user"
from citizen as z
join "user" u on z.user_id = u.id
where z.id = _id
) as t;
end;
$$;
-- drop function if exists find_citizen_by_id_with_user(uuid, inout json);

View File

@@ -0,0 +1,31 @@
create or replace function insert_citizen_with_user(inout resource json)
language plpgsql as
$$
declare
new_id uuid;
inserted_user json;
begin
select insert_user(resource->'user') into inserted_user;
insert into citizen (id, name, birthday, user_id, vote_annonymous, follow_annonymous)
select
coalesce(id, uuid_generate_v4()),
name,
birthday,
(inserted_user->>'id')::uuid,
coalesce(vote_annonymous, true),
coalesce(follow_annonymous, true)
from json_populate_record(null::citizen, resource)
on conflict (id) do update set
name = excluded.name,
birthday = excluded.birthday,
user_id = excluded.user_id,
vote_annonymous = excluded.vote_annonymous,
follow_annonymous = excluded.follow_annonymous
returning id into new_id;
select find_citizen_by_id_with_user(new_id) into resource;
end;
$$;
-- drop function if exists create_citizen_with_user(inout json);