From 688108fc4f1155f46da860238f6c91e80bca7557 Mon Sep 17 00:00:00 2001
From: itsscb <dev@itsscb.de>
Date: Fri, 6 Oct 2023 00:54:14 +0200
Subject: [PATCH] Add api.person endpoint Fixes #65

---
 bff/db/query/person.sql         |  6 ++++-
 bff/db/query/return.sql         | 26 ++++++++++++++++++++-
 bff/db/sqlc/person.sql.go       | 41 +++++++++++++++++++++++++++++++++
 bff/db/sqlc/querier.go          |  2 ++
 bff/db/sqlc/return.sql.go       | 35 ++++++++++++++++++++++++++++
 bff/db/sqlc/tx_create_person.go |  7 ++++++
 6 files changed, 115 insertions(+), 2 deletions(-)

diff --git a/bff/db/query/person.sql b/bff/db/query/person.sql
index 25098e5..e9c7436 100644
--- a/bff/db/query/person.sql
+++ b/bff/db/query/person.sql
@@ -42,4 +42,8 @@ RETURNING *;
 
 -- name: DeletePerson :exec
 DELETE FROM persons
-WHERE "id" = $1;
\ No newline at end of file
+WHERE "id" = $1;
+
+-- name: GetReturns :many
+SELECT * FROM returns
+WHERE "person_id" = sqlc.arg(id);
\ No newline at end of file
diff --git a/bff/db/query/return.sql b/bff/db/query/return.sql
index b341645..9abcc77 100644
--- a/bff/db/query/return.sql
+++ b/bff/db/query/return.sql
@@ -48,4 +48,28 @@ RETURNING *;
 
 -- name: DeleteReturn :exec
 DELETE FROM returns
-WHERE "id" = sqlc.arg(id);
\ No newline at end of file
+WHERE "id" = sqlc.arg(id);
+
+-- name: CloneProviders :exec
+INSERT INTO returns (
+    "provider_id",
+    "name",
+    "description",
+    "category",
+    "email",
+    "status",
+    "creator",
+    "changer",
+    "person_id"
+)
+SELECT 
+    "id",
+    "name",
+    "description",
+    "category",
+    "email",
+    'new',
+    sqlc.arg(creator),
+    sqlc.arg(creator),
+    sqlc.arg(person_id)
+FROM providers;
\ No newline at end of file
diff --git a/bff/db/sqlc/person.sql.go b/bff/db/sqlc/person.sql.go
index eef7211..565e8df 100644
--- a/bff/db/sqlc/person.sql.go
+++ b/bff/db/sqlc/person.sql.go
@@ -109,6 +109,47 @@ func (q *Queries) GetPerson(ctx context.Context, id int64) (Person, error) {
 	return i, err
 }
 
+const getReturns = `-- name: GetReturns :many
+SELECT id, person_id, provider_id, name, description, category, email, status, creator, created, changer, changed FROM returns
+WHERE "person_id" = $1
+`
+
+func (q *Queries) GetReturns(ctx context.Context, id int64) ([]Return, error) {
+	rows, err := q.db.QueryContext(ctx, getReturns, id)
+	if err != nil {
+		return nil, err
+	}
+	defer rows.Close()
+	items := []Return{}
+	for rows.Next() {
+		var i Return
+		if err := rows.Scan(
+			&i.ID,
+			&i.PersonID,
+			&i.ProviderID,
+			&i.Name,
+			&i.Description,
+			&i.Category,
+			&i.Email,
+			&i.Status,
+			&i.Creator,
+			&i.Created,
+			&i.Changer,
+			&i.Changed,
+		); err != nil {
+			return nil, err
+		}
+		items = append(items, i)
+	}
+	if err := rows.Close(); err != nil {
+		return nil, err
+	}
+	if err := rows.Err(); err != nil {
+		return nil, err
+	}
+	return items, nil
+}
+
 const listPersons = `-- name: ListPersons :many
 SELECT id, account_id, firstname, lastname, birthday, city, zip, street, country, creator, created, changer, changed FROM persons
 ORDER BY "lastname", "firstname"
diff --git a/bff/db/sqlc/querier.go b/bff/db/sqlc/querier.go
index 714b78b..346a1a3 100644
--- a/bff/db/sqlc/querier.go
+++ b/bff/db/sqlc/querier.go
@@ -12,6 +12,7 @@ import (
 
 type Querier interface {
 	BlockSession(ctx context.Context, id uuid.UUID) error
+	CloneProviders(ctx context.Context, arg CloneProvidersParams) error
 	CreateAccount(ctx context.Context, arg CreateAccountParams) (Account, error)
 	CreateDocumentMail(ctx context.Context, arg CreateDocumentMailParams) (Document, error)
 	CreateDocumentUpload(ctx context.Context, arg CreateDocumentUploadParams) (Document, error)
@@ -52,6 +53,7 @@ type Querier interface {
 	GetPerson(ctx context.Context, id int64) (Person, error)
 	GetProvider(ctx context.Context, id int64) (Provider, error)
 	GetReturn(ctx context.Context, id int64) (Return, error)
+	GetReturns(ctx context.Context, id int64) ([]Return, error)
 	GetReturnsLog(ctx context.Context, id int64) (ReturnsLog, error)
 	GetSession(ctx context.Context, id uuid.UUID) (Session, error)
 	InvalidateDocument(ctx context.Context, arg InvalidateDocumentParams) (Document, error)
diff --git a/bff/db/sqlc/return.sql.go b/bff/db/sqlc/return.sql.go
index e6173e5..b7caaa1 100644
--- a/bff/db/sqlc/return.sql.go
+++ b/bff/db/sqlc/return.sql.go
@@ -10,6 +10,41 @@ import (
 	"database/sql"
 )
 
+const cloneProviders = `-- name: CloneProviders :exec
+INSERT INTO returns (
+    "provider_id",
+    "name",
+    "description",
+    "category",
+    "email",
+    "status",
+    "creator",
+    "changer",
+    "person_id"
+)
+SELECT 
+    "id",
+    "name",
+    "description",
+    "category",
+    "email",
+    'new',
+    $1,
+    $1,
+    $2
+FROM providers
+`
+
+type CloneProvidersParams struct {
+	Creator  string `json:"creator"`
+	PersonID int64  `json:"person_id"`
+}
+
+func (q *Queries) CloneProviders(ctx context.Context, arg CloneProvidersParams) error {
+	_, err := q.db.ExecContext(ctx, cloneProviders, arg.Creator, arg.PersonID)
+	return err
+}
+
 const createReturn = `-- name: CreateReturn :one
 INSERT INTO returns (
     "person_id",
diff --git a/bff/db/sqlc/tx_create_person.go b/bff/db/sqlc/tx_create_person.go
index a5afe83..6fabfa5 100644
--- a/bff/db/sqlc/tx_create_person.go
+++ b/bff/db/sqlc/tx_create_person.go
@@ -29,7 +29,14 @@ func (store *SQLStore) CreatePersonTx(ctx context.Context, arg CreatePersonTxPar
 		var err error
 
 		result.Person, err = q.CreatePerson(ctx, CreatePersonParams(arg))
+		if err != nil {
+			return err
+		}
 
+		err = q.CloneProviders(ctx, CloneProvidersParams{
+			Creator:  arg.Creator,
+			PersonID: result.Person.ID,
+		})
 		return err
 	})