From 067ca7a3ee7e1c5f743065f5e62a4a6c756df4cc Mon Sep 17 00:00:00 2001 From: jordi fita mas Date: Tue, 26 Sep 2023 17:29:49 +0200 Subject: [PATCH] Add function and HTTP handler to delete services --- deploy/remove_service.sql | 22 ++++++++++++ pkg/services/admin.go | 13 ++++++- po/ca.po | 6 ++-- po/es.po | 6 ++-- revert/remove_service.sql | 7 ++++ sqitch.plan | 1 + test/remove_service.sql | 73 +++++++++++++++++++++++++++++++++++++++ verify/remove_service.sql | 7 ++++ 8 files changed, 128 insertions(+), 7 deletions(-) create mode 100644 deploy/remove_service.sql create mode 100644 revert/remove_service.sql create mode 100644 test/remove_service.sql create mode 100644 verify/remove_service.sql diff --git a/deploy/remove_service.sql b/deploy/remove_service.sql new file mode 100644 index 0000000..a5ceb4f --- /dev/null +++ b/deploy/remove_service.sql @@ -0,0 +1,22 @@ +-- Deploy camper:remove_service to pg +-- requires: roles +-- requires: schema_camper +-- requires: service +-- requires: service_i18n + +begin; + +set search_path to camper, public; + +create or replace function remove_service(service_id integer) returns void as +$$ + delete from service_i18n where service_id = $1; + delete from service where service_id = $1; +$$ + language sql +; + +revoke execute on function remove_service(integer) from public; +grant execute on function remove_service(integer) to admin; + +commit; diff --git a/pkg/services/admin.go b/pkg/services/admin.go index f282ff8..1ed4d79 100644 --- a/pkg/services/admin.go +++ b/pkg/services/admin.go @@ -85,8 +85,10 @@ func (h *AdminHandler) Handler(user *auth.User, company *auth.Company, conn *dat f.MustRender(w, r, user, company) case http.MethodPut: editService(w, r, user, company, conn, f) + case http.MethodDelete: + deleteService(w, r, user, conn, id) default: - httplib.MethodNotAllowed(w, r, http.MethodGet, http.MethodPut) + httplib.MethodNotAllowed(w, r, http.MethodGet, http.MethodPut, http.MethodDelete) } default: loc, ok := h.locales.Get(langTag) @@ -205,6 +207,15 @@ func editService(w http.ResponseWriter, r *http.Request, user *auth.User, compan httplib.Redirect(w, r, "/admin/services", http.StatusSeeOther) } +func deleteService(w http.ResponseWriter, r *http.Request, user *auth.User, conn *database.Conn, id int) { + if err := user.VerifyCSRFToken(r); err != nil { + http.Error(w, err.Error(), http.StatusForbidden) + return + } + conn.MustExec(r.Context(), "select remove_service($1)", id) + httplib.Redirect(w, r, "/admin/services", http.StatusSeeOther) +} + type serviceForm struct { ID int Icon *form.Select diff --git a/po/ca.po b/po/ca.po index c25bd63..5e7cbb2 100644 --- a/po/ca.po +++ b/po/ca.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: camper\n" "Report-Msgid-Bugs-To: jordi@tandem.blog\n" -"POT-Creation-Date: 2023-09-26 16:55+0200\n" +"POT-Creation-Date: 2023-09-26 17:28+0200\n" "PO-Revision-Date: 2023-07-22 23:45+0200\n" "Last-Translator: jordi fita mas \n" "Language-Team: Catalan \n" @@ -762,7 +762,7 @@ msgstr "Automàtic" #: pkg/app/user.go:249 pkg/campsite/types/l10n.go:82 #: pkg/campsite/types/admin.go:274 pkg/season/admin.go:203 -#: pkg/services/l10n.go:73 pkg/services/admin.go:255 +#: pkg/services/l10n.go:73 pkg/services/admin.go:266 msgid "Name can not be empty." msgstr "No podeu deixar el nom en blanc." @@ -816,7 +816,7 @@ msgstr "No podeu deixar el color en blanc." msgid "This color is not valid. It must be like #123abc." msgstr "Aquest color no és vàlid. Hauria de ser similar a #123abc." -#: pkg/services/admin.go:254 +#: pkg/services/admin.go:265 msgid "Selected icon is not valid." msgstr "La icona escollida no és vàlida." diff --git a/po/es.po b/po/es.po index 927fa30..435cd1b 100644 --- a/po/es.po +++ b/po/es.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: camper\n" "Report-Msgid-Bugs-To: jordi@tandem.blog\n" -"POT-Creation-Date: 2023-09-26 16:55+0200\n" +"POT-Creation-Date: 2023-09-26 17:28+0200\n" "PO-Revision-Date: 2023-07-22 23:46+0200\n" "Last-Translator: jordi fita mas \n" "Language-Team: Spanish \n" @@ -762,7 +762,7 @@ msgstr "Automático" #: pkg/app/user.go:249 pkg/campsite/types/l10n.go:82 #: pkg/campsite/types/admin.go:274 pkg/season/admin.go:203 -#: pkg/services/l10n.go:73 pkg/services/admin.go:255 +#: pkg/services/l10n.go:73 pkg/services/admin.go:266 msgid "Name can not be empty." msgstr "No podéis dejar el nombre en blanco." @@ -816,7 +816,7 @@ msgstr "No podéis dejar el color en blanco." msgid "This color is not valid. It must be like #123abc." msgstr "Este color no es válido. Tiene que ser parecido a #123abc." -#: pkg/services/admin.go:254 +#: pkg/services/admin.go:265 msgid "Selected icon is not valid." msgstr "El icono escogido no es válido." diff --git a/revert/remove_service.sql b/revert/remove_service.sql new file mode 100644 index 0000000..8fdc830 --- /dev/null +++ b/revert/remove_service.sql @@ -0,0 +1,7 @@ +-- Revert camper:remove_service from pg + +begin; + +drop function if exists camper.remove_service(integer); + +commit; diff --git a/sqitch.plan b/sqitch.plan index 16d68fc..3096bd2 100644 --- a/sqitch.plan +++ b/sqitch.plan @@ -78,4 +78,5 @@ add_service [roles schema_camper service] 2023-09-17T00:00:00Z jordi fita mas # Add function to edit services service_i18n [roles schema_camper service language] 2023-09-17T00:13:42Z jordi fita mas # Add relation for service translations translate_service [roles schema_camper service_i18n] 2023-09-17T00:17:00Z jordi fita mas # Add function to translate a service +remove_service [roles schema_camper service service_i18n] 2023-09-26T15:21:00Z jordi fita mas # Add function to remove service translation [schema_camper] 2023-09-25T16:27:50Z jordi fita mas # Add the type for a translation diff --git a/test/remove_service.sql b/test/remove_service.sql new file mode 100644 index 0000000..81b5384 --- /dev/null +++ b/test/remove_service.sql @@ -0,0 +1,73 @@ +-- Test remove_service +set client_min_messages to warning; +create extension if not exists pgtap; +reset client_min_messages; + +begin; + +select plan(12); + +set search_path to camper, public; + +select has_function('camper', 'remove_service', array['integer']); +select function_lang_is('camper', 'remove_service', array['integer'], 'sql'); +select function_returns('camper', 'remove_service', array['integer'], 'void'); +select isnt_definer('camper', 'remove_service', array['integer']); +select volatility_is('camper', 'remove_service', array['integer'], 'volatile'); +select function_privs_are('camper', 'remove_service', array['integer'], 'guest', array[]::text[]); +select function_privs_are('camper', 'remove_service', array['integer'], 'employee', array[]::text[]); +select function_privs_are('camper', 'remove_service', array['integer'], 'admin', array['EXECUTE']); +select function_privs_are('camper', 'remove_service', array['integer'], 'authenticator', array[]::text[]); + +set client_min_messages to warning; +truncate service_i18n cascade; +truncate service cascade; +truncate company cascade; +reset client_min_messages; + +insert into company (company_id, business_name, vatin, trade_name, phone, email, web, address, city, province, postal_code, country_code, currency_code, default_lang_tag) +values (1, 'Company 2', 'XX123', '', '555-555-555', 'a@a', '', '', '', '', '', 'ES', 'EUR', 'ca') +; + +insert into service (service_id, company_id, icon_name, name, description) +values (5, 1, 'information', 'Service A', '

A

') + , (6, 1, 'toilet', 'Service B', '

B

') + , (7, 1, 'wheelchair', 'Service C', '

C

') +; + +insert into service_i18n (service_id, lang_tag, name, description) +values (5, 'ca', 'Servei A', '

A

') + , (5, 'es', 'Servicio A', '

A

') + , (6, 'ca', 'Servei B', '

B

') + , (6, 'es', 'Servicio B', '

B

') + , (7, 'ca', 'Servei C', '

C

') + , (7, 'es', 'Servicio C', '

C

') +; + +select lives_ok( + $$ select remove_service(6) $$, + 'Should be able to delete a service' +); + +select bag_eq( + $$ select service_id, name from service $$, + $$ values (5, 'Service A') + , (7, 'Service C') + $$, + 'Should have removed the serivec' +); + +select bag_eq( + $$ select service_id, lang_tag, name from service_i18n $$, + $$ values (5, 'ca', 'Servei A') + , (5, 'es', 'Servicio A') + , (7, 'ca', 'Servei C') + , (7, 'es', 'Servicio C') + $$, + 'Should have removed the service’s translations' +); + +select * +from finish(); + +rollback; diff --git a/verify/remove_service.sql b/verify/remove_service.sql new file mode 100644 index 0000000..6026f8e --- /dev/null +++ b/verify/remove_service.sql @@ -0,0 +1,7 @@ +-- Verify camper:remove_service on pg + +begin; + +select has_function_privilege('camper.remove_service(integer)', 'execute'); + +rollback;