Add the services page
This page is more or less similar to home, in terms of database: it
has a carousel and a list of items; in this case, the definition of
campsite services.
As i said early, when adding the home carousel, this carousel has its
own relation and set of functions to manage slides. They are also
duplicated in Go code, but i think i will need to refactor it later to
a carousel package or something like that, because both relations have
the exact same fields and types, so it makes no sense to have twice the
same code.
I already did it with the CSS and JavaScript code, mostly because it was
easier to replace the `.surroundings div` selector with `.carousel`, and
because that way i can have a single template that loads and initializes
Slick.
There is no UI to create or edit service definitions, although there are
the SQL functions, because i have no more time now, and Oriol needs to
check that the style is correct for that page.
2023-09-17 01:42:16 +00:00
|
|
|
|
-- Test translate_services_carousel_slide
|
|
|
|
|
set client_min_messages to warning;
|
|
|
|
|
create extension if not exists pgtap;
|
|
|
|
|
reset client_min_messages;
|
|
|
|
|
|
|
|
|
|
begin;
|
|
|
|
|
|
|
|
|
|
select plan(13);
|
|
|
|
|
|
|
|
|
|
set search_path to camper, public;
|
|
|
|
|
|
|
|
|
|
select has_function('camper', 'translate_services_carousel_slide', array['integer', 'text', 'text']);
|
|
|
|
|
select function_lang_is('camper', 'translate_services_carousel_slide', array['integer', 'text', 'text'], 'sql');
|
|
|
|
|
select function_returns('camper', 'translate_services_carousel_slide', array['integer', 'text', 'text'], 'void');
|
|
|
|
|
select isnt_definer('camper', 'translate_services_carousel_slide', array['integer', 'text', 'text']);
|
|
|
|
|
select volatility_is('camper', 'translate_services_carousel_slide', array['integer', 'text', 'text'], 'volatile');
|
|
|
|
|
select function_privs_are('camper', 'translate_services_carousel_slide', array['integer', 'text', 'text'], 'guest', array[]::text[]);
|
|
|
|
|
select function_privs_are('camper', 'translate_services_carousel_slide', array['integer', 'text', 'text'], 'employee', array[]::text[]);
|
|
|
|
|
select function_privs_are('camper', 'translate_services_carousel_slide', array['integer', 'text', 'text'], 'admin', array['EXECUTE']);
|
|
|
|
|
select function_privs_are('camper', 'translate_services_carousel_slide', array['integer', 'text', 'text'], 'authenticator', array[]::text[]);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
set client_min_messages to warning;
|
|
|
|
|
truncate services_carousel_i18n cascade;
|
|
|
|
|
truncate services_carousel cascade;
|
|
|
|
|
truncate media cascade;
|
Manage all media uploads in a single place
It made no sense to have a file upload in each form that needs a media,
because to reuse an existing media users would need to upload the exact
same file again; this is very unusual and unfriendly.
A better option is to have a “centralized” media section, where people
can upload files there, and then have a picker to select from there.
Ideally, there would be an upload option in the picker, but i did not
add it yet.
I’ve split the content from the media because i want users to have the
option to update a media, for instance when they need to upload a
reduced or cropped version of the same photo, without an edit they would
need to upload the file as a new media and then update all places where
the old version was used. And i did not want to trouble people that
uploads the same photo twice: without the separate relation, doing so
would throw a constraint error.
I do not believe there is any security problem to have all companies
link their media to the same file, as they were already readable by
everyone and could upload the data from a different company to their
own; in other words, it is not worse than it was now.
2023-09-20 23:56:44 +00:00
|
|
|
|
truncate media_content cascade;
|
Add the services page
This page is more or less similar to home, in terms of database: it
has a carousel and a list of items; in this case, the definition of
campsite services.
As i said early, when adding the home carousel, this carousel has its
own relation and set of functions to manage slides. They are also
duplicated in Go code, but i think i will need to refactor it later to
a carousel package or something like that, because both relations have
the exact same fields and types, so it makes no sense to have twice the
same code.
I already did it with the CSS and JavaScript code, mostly because it was
easier to replace the `.surroundings div` selector with `.carousel`, and
because that way i can have a single template that loads and initializes
Slick.
There is no UI to create or edit service definitions, although there are
the SQL functions, because i have no more time now, and Oriol needs to
check that the style is correct for that page.
2023-09-17 01:42:16 +00:00
|
|
|
|
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')
|
|
|
|
|
;
|
|
|
|
|
|
Manage all media uploads in a single place
It made no sense to have a file upload in each form that needs a media,
because to reuse an existing media users would need to upload the exact
same file again; this is very unusual and unfriendly.
A better option is to have a “centralized” media section, where people
can upload files there, and then have a picker to select from there.
Ideally, there would be an upload option in the picker, but i did not
add it yet.
I’ve split the content from the media because i want users to have the
option to update a media, for instance when they need to upload a
reduced or cropped version of the same photo, without an edit they would
need to upload the file as a new media and then update all places where
the old version was used. And i did not want to trouble people that
uploads the same photo twice: without the separate relation, doing so
would throw a constraint error.
I do not believe there is any security problem to have all companies
link their media to the same file, as they were already readable by
everyone and could upload the data from a different company to their
own; in other words, it is not worse than it was now.
2023-09-20 23:56:44 +00:00
|
|
|
|
insert into media_content (media_type, bytes)
|
|
|
|
|
values ('text/plain', 'hello, world!')
|
|
|
|
|
, ('image/svg+xml', '<svg xmlns="http://www.w3.org/2000/svg" width="1" height="1"/>')
|
|
|
|
|
, ('image/x-xpixmap', 'static char *s[]={"1 1 1 1","a c #ffffff","a"};')
|
|
|
|
|
;
|
|
|
|
|
|
|
|
|
|
insert into media (media_id, company_id, original_filename, content_hash)
|
|
|
|
|
values (5, 1, 'text.txt', sha256('hello, world!'))
|
|
|
|
|
, (6, 1, 'image.svg', sha256('<svg xmlns="http://www.w3.org/2000/svg" width="1" height="1"/>'))
|
|
|
|
|
, (7, 1, 'cover4.xpm', sha256('static char *s[]={"1 1 1 1","a c #ffffff","a"};'))
|
Add the services page
This page is more or less similar to home, in terms of database: it
has a carousel and a list of items; in this case, the definition of
campsite services.
As i said early, when adding the home carousel, this carousel has its
own relation and set of functions to manage slides. They are also
duplicated in Go code, but i think i will need to refactor it later to
a carousel package or something like that, because both relations have
the exact same fields and types, so it makes no sense to have twice the
same code.
I already did it with the CSS and JavaScript code, mostly because it was
easier to replace the `.surroundings div` selector with `.carousel`, and
because that way i can have a single template that loads and initializes
Slick.
There is no UI to create or edit service definitions, although there are
the SQL functions, because i have no more time now, and Oriol needs to
check that the style is correct for that page.
2023-09-17 01:42:16 +00:00
|
|
|
|
;
|
|
|
|
|
|
|
|
|
|
insert into services_carousel (media_id, caption)
|
|
|
|
|
values (5, 'Source caption')
|
|
|
|
|
, (6, 'Another caption')
|
|
|
|
|
, (7, 'N/A')
|
|
|
|
|
;
|
|
|
|
|
|
|
|
|
|
insert into services_carousel_i18n (media_id, lang_tag, caption)
|
|
|
|
|
values (5, 'en', 'Target caption')
|
|
|
|
|
;
|
|
|
|
|
|
|
|
|
|
select lives_ok(
|
|
|
|
|
$$ select translate_services_carousel_slide(5, 'ca', 'Traducció') $$,
|
|
|
|
|
'Should be able to translate a carousel slide'
|
|
|
|
|
);
|
|
|
|
|
|
|
|
|
|
select lives_ok(
|
|
|
|
|
$$ select translate_services_carousel_slide(6, 'es', null) $$,
|
|
|
|
|
'Should be able to “translate” a carousel slide to the empty string'
|
|
|
|
|
);
|
|
|
|
|
|
|
|
|
|
select lives_ok(
|
|
|
|
|
$$ select translate_services_carousel_slide(5, 'en', 'Not anymore') $$,
|
|
|
|
|
'Should be able to overwrite a slide’s translation'
|
|
|
|
|
);
|
|
|
|
|
|
|
|
|
|
select bag_eq(
|
|
|
|
|
$$ select media_id, lang_tag, caption from services_carousel_i18n $$,
|
|
|
|
|
$$ values (5, 'ca', 'Traducció')
|
|
|
|
|
, (5, 'en', 'Not anymore')
|
|
|
|
|
, (6, 'es', '')
|
|
|
|
|
$$,
|
|
|
|
|
'Should have all three slides'
|
|
|
|
|
);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
select *
|
|
|
|
|
from finish();
|
|
|
|
|
|
|
|
|
|
rollback;
|