Add function and HTTP handler to delete services
This commit is contained in:
parent
650d3bff7b
commit
067ca7a3ee
|
@ -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;
|
|
@ -85,8 +85,10 @@ func (h *AdminHandler) Handler(user *auth.User, company *auth.Company, conn *dat
|
||||||
f.MustRender(w, r, user, company)
|
f.MustRender(w, r, user, company)
|
||||||
case http.MethodPut:
|
case http.MethodPut:
|
||||||
editService(w, r, user, company, conn, f)
|
editService(w, r, user, company, conn, f)
|
||||||
|
case http.MethodDelete:
|
||||||
|
deleteService(w, r, user, conn, id)
|
||||||
default:
|
default:
|
||||||
httplib.MethodNotAllowed(w, r, http.MethodGet, http.MethodPut)
|
httplib.MethodNotAllowed(w, r, http.MethodGet, http.MethodPut, http.MethodDelete)
|
||||||
}
|
}
|
||||||
default:
|
default:
|
||||||
loc, ok := h.locales.Get(langTag)
|
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)
|
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 {
|
type serviceForm struct {
|
||||||
ID int
|
ID int
|
||||||
Icon *form.Select
|
Icon *form.Select
|
||||||
|
|
6
po/ca.po
6
po/ca.po
|
@ -8,7 +8,7 @@ msgid ""
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"Project-Id-Version: camper\n"
|
"Project-Id-Version: camper\n"
|
||||||
"Report-Msgid-Bugs-To: jordi@tandem.blog\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"
|
"PO-Revision-Date: 2023-07-22 23:45+0200\n"
|
||||||
"Last-Translator: jordi fita mas <jordi@tandem.blog>\n"
|
"Last-Translator: jordi fita mas <jordi@tandem.blog>\n"
|
||||||
"Language-Team: Catalan <ca@dodds.net>\n"
|
"Language-Team: Catalan <ca@dodds.net>\n"
|
||||||
|
@ -762,7 +762,7 @@ msgstr "Automàtic"
|
||||||
|
|
||||||
#: pkg/app/user.go:249 pkg/campsite/types/l10n.go:82
|
#: pkg/app/user.go:249 pkg/campsite/types/l10n.go:82
|
||||||
#: pkg/campsite/types/admin.go:274 pkg/season/admin.go:203
|
#: 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."
|
msgid "Name can not be empty."
|
||||||
msgstr "No podeu deixar el nom en blanc."
|
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."
|
msgid "This color is not valid. It must be like #123abc."
|
||||||
msgstr "Aquest color no és vàlid. Hauria de ser similar a #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."
|
msgid "Selected icon is not valid."
|
||||||
msgstr "La icona escollida no és vàlida."
|
msgstr "La icona escollida no és vàlida."
|
||||||
|
|
||||||
|
|
6
po/es.po
6
po/es.po
|
@ -8,7 +8,7 @@ msgid ""
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"Project-Id-Version: camper\n"
|
"Project-Id-Version: camper\n"
|
||||||
"Report-Msgid-Bugs-To: jordi@tandem.blog\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"
|
"PO-Revision-Date: 2023-07-22 23:46+0200\n"
|
||||||
"Last-Translator: jordi fita mas <jordi@tandem.blog>\n"
|
"Last-Translator: jordi fita mas <jordi@tandem.blog>\n"
|
||||||
"Language-Team: Spanish <es@tp.org.es>\n"
|
"Language-Team: Spanish <es@tp.org.es>\n"
|
||||||
|
@ -762,7 +762,7 @@ msgstr "Automático"
|
||||||
|
|
||||||
#: pkg/app/user.go:249 pkg/campsite/types/l10n.go:82
|
#: pkg/app/user.go:249 pkg/campsite/types/l10n.go:82
|
||||||
#: pkg/campsite/types/admin.go:274 pkg/season/admin.go:203
|
#: 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."
|
msgid "Name can not be empty."
|
||||||
msgstr "No podéis dejar el nombre en blanco."
|
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."
|
msgid "This color is not valid. It must be like #123abc."
|
||||||
msgstr "Este color no es válido. Tiene que ser parecido a #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."
|
msgid "Selected icon is not valid."
|
||||||
msgstr "El icono escogido no es válido."
|
msgstr "El icono escogido no es válido."
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,7 @@
|
||||||
|
-- Revert camper:remove_service from pg
|
||||||
|
|
||||||
|
begin;
|
||||||
|
|
||||||
|
drop function if exists camper.remove_service(integer);
|
||||||
|
|
||||||
|
commit;
|
|
@ -78,4 +78,5 @@ add_service [roles schema_camper service] 2023-09-17T00:00:00Z jordi fita mas <j
|
||||||
edit_service [roles schema_camper service] 2023-09-17T00:01:16Z jordi fita mas <jordi@tandem.blog> # Add function to edit services
|
edit_service [roles schema_camper service] 2023-09-17T00:01:16Z jordi fita mas <jordi@tandem.blog> # Add function to edit services
|
||||||
service_i18n [roles schema_camper service language] 2023-09-17T00:13:42Z jordi fita mas <jordi@tandem.blog> # Add relation for service translations
|
service_i18n [roles schema_camper service language] 2023-09-17T00:13:42Z jordi fita mas <jordi@tandem.blog> # Add relation for service translations
|
||||||
translate_service [roles schema_camper service_i18n] 2023-09-17T00:17:00Z jordi fita mas <jordi@tandem.blog> # Add function to translate a service
|
translate_service [roles schema_camper service_i18n] 2023-09-17T00:17:00Z jordi fita mas <jordi@tandem.blog> # Add function to translate a service
|
||||||
|
remove_service [roles schema_camper service service_i18n] 2023-09-26T15:21:00Z jordi fita mas <jordi@tandem.blog> # Add function to remove service
|
||||||
translation [schema_camper] 2023-09-25T16:27:50Z jordi fita mas <jordi@tandem.blog> # Add the type for a translation
|
translation [schema_camper] 2023-09-25T16:27:50Z jordi fita mas <jordi@tandem.blog> # Add the type for a translation
|
||||||
|
|
|
@ -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', '<p>A</p>')
|
||||||
|
, (6, 1, 'toilet', 'Service B', '<p>B</p>')
|
||||||
|
, (7, 1, 'wheelchair', 'Service C', '<p>C</p>')
|
||||||
|
;
|
||||||
|
|
||||||
|
insert into service_i18n (service_id, lang_tag, name, description)
|
||||||
|
values (5, 'ca', 'Servei A', '<p>A</p>')
|
||||||
|
, (5, 'es', 'Servicio A', '<p>A</p>')
|
||||||
|
, (6, 'ca', 'Servei B', '<p>B</p>')
|
||||||
|
, (6, 'es', 'Servicio B', '<p>B</p>')
|
||||||
|
, (7, 'ca', 'Servei C', '<p>C</p>')
|
||||||
|
, (7, 'es', 'Servicio C', '<p>C</p>')
|
||||||
|
;
|
||||||
|
|
||||||
|
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;
|
|
@ -0,0 +1,7 @@
|
||||||
|
-- Verify camper:remove_service on pg
|
||||||
|
|
||||||
|
begin;
|
||||||
|
|
||||||
|
select has_function_privilege('camper.remove_service(integer)', 'execute');
|
||||||
|
|
||||||
|
rollback;
|
Loading…
Reference in New Issue