From da127124a1b7132d01deffd72c7ee47c5eb466fa Mon Sep 17 00:00:00 2001 From: jordi fita mas Date: Sun, 10 Sep 2023 03:04:18 +0200 Subject: [PATCH] Add cover media to campsite types MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This is the image that is shown at the home page, and maybe other pages in the future. We can not use a static file because this image can be changed by the customer, not us; just like name and description. I decided to keep the actual media content in the database, but to copy this file out to the file system the first time it is accessed. This is because we are going to replicate the database to a public instance that must show exactly the same image, but the customer will update the image from the private instance, behind a firewall. We could also synchronize the folder where they upload the images, the same way we will replicate, but i thought that i would make the whole thing a little more brittle: this way if it can replicate the update of the media, it is impossible to not have its contents; dumping it to a file is to improve subsequent requests to the same media. I use the hex representation of the media’s hash as the URL to the resource, because PostgreSQL’s base64 is not URL save (i.e., it uses RFC2045’s charset that includes the forward slash[0]), and i did not feel necessary write a new function just to slightly reduce the URLs’ length. Before checking if the file exists, i make sure that the given hash is an hex string, like i do for UUID, otherwise any other check is going to fail for sure. I moved out hex.Valid function from UUID to check for valid hex values, but the actual hash check is inside app/media because i doubt it will be used outside that module. [0]: https://datatracker.ietf.org/doc/html/rfc2045#section-6.8 --- cmd/camper/main.go | 3 +- deploy/add_campsite_type.sql | 10 +- deploy/campsite_type.sql | 2 + deploy/edit_campsite_type.sql | 7 +- pkg/app/app.go | 10 +- pkg/app/media.go | 95 +++++++++++++++++ pkg/app/media_test.go | 37 +++++++ pkg/app/public.go | 37 ++++++- pkg/campsite/types/admin.go | 100 +++++++++++++----- pkg/database/db.go | 14 +++ pkg/database/tx.go | 44 ++++++++ pkg/form/file.go | 7 ++ pkg/form/validator.go | 24 ++--- pkg/hex/hex.go | 30 ++++++ pkg/hex/hex_test.go | 46 ++++++++ pkg/uuid/uuid.go | 28 +---- revert/add_campsite_type.sql | 2 +- revert/edit_campsite_type.sql | 2 +- sqitch.plan | 8 +- test/add_campsite.sql | 14 ++- test/add_campsite_type.sql | 34 +++--- test/campsite.sql | 12 ++- test/campsite_type.sql | 27 +++-- test/edit_campsite.sql | 13 ++- test/edit_campsite_type.sql | 41 ++++--- verify/add_campsite_type.sql | 2 +- verify/campsite_type.sql | 1 + verify/edit_campsite_type.sql | 2 +- .../camping_montagut_acampada_tenda.jpg | Bin 127111 -> 0 bytes web/templates/admin/campsite/type/form.gohtml | 13 +++ web/templates/public/home.gohtml | 5 +- 31 files changed, 538 insertions(+), 132 deletions(-) create mode 100644 pkg/app/media.go create mode 100644 pkg/app/media_test.go create mode 100644 pkg/database/tx.go create mode 100644 pkg/hex/hex.go create mode 100644 pkg/hex/hex_test.go delete mode 100644 web/static/images/camping_montagut_acampada_tenda.jpg diff --git a/cmd/camper/main.go b/cmd/camper/main.go index c18cdfa..04040bb 100644 --- a/cmd/camper/main.go +++ b/cmd/camper/main.go @@ -19,6 +19,7 @@ import ( ) var avatarsDir = "/var/lib/camper/avatars" +var mediaDir = "/var/lib/camper/media" func main() { db, err := database.New(context.Background(), os.Getenv("CAMPER_DATABASE_URL")) @@ -27,7 +28,7 @@ func main() { } defer db.Close() - handler, err := app.New(db, avatarsDir) + handler, err := app.New(db, avatarsDir, mediaDir) if err != nil { log.Fatal(err) } diff --git a/deploy/add_campsite_type.sql b/deploy/add_campsite_type.sql index 138eb3e..7472829 100644 --- a/deploy/add_campsite_type.sql +++ b/deploy/add_campsite_type.sql @@ -8,16 +8,16 @@ begin; set search_path to camper, public; -create or replace function add_campsite_type(company integer, name text, description text) returns uuid as +create or replace function add_campsite_type(company integer, media_id integer, name text, description text) returns uuid as $$ - insert into campsite_type (company_id, name, description) - values (company, name, xmlparse (content description)) + insert into campsite_type (company_id, media_id, name, description) + values (company, media_id, name, xmlparse (content description)) returning slug; $$ language sql ; -revoke execute on function add_campsite_type(integer, text, text) from public; -grant execute on function add_campsite_type(integer, text, text) to admin; +revoke execute on function add_campsite_type(integer, integer, text, text) from public; +grant execute on function add_campsite_type(integer, integer, text, text) to admin; commit; diff --git a/deploy/campsite_type.sql b/deploy/campsite_type.sql index 9ce481f..54674d6 100644 --- a/deploy/campsite_type.sql +++ b/deploy/campsite_type.sql @@ -3,6 +3,7 @@ -- requires: schema_camper -- requires: company -- requires: user_profile +-- requires: media begin; @@ -13,6 +14,7 @@ create table campsite_type ( company_id integer not null references company, slug uuid not null unique default gen_random_uuid(), name text not null constraint name_not_empty check(length(trim(name)) > 0), + media_id integer not null references media, description xml not null default ''::xml, active boolean not null default true ); diff --git a/deploy/edit_campsite_type.sql b/deploy/edit_campsite_type.sql index 2315986..a22c4f5 100644 --- a/deploy/edit_campsite_type.sql +++ b/deploy/edit_campsite_type.sql @@ -8,11 +8,12 @@ begin; set search_path to camper, public; -create or replace function edit_campsite_type(slug uuid, name text, description text, active boolean) returns uuid as +create or replace function edit_campsite_type(slug uuid, media_id integer, name text, description text, active boolean) returns uuid as $$ update campsite_type set name = edit_campsite_type.name , description = xmlparse(content edit_campsite_type.description) + , media_id = coalesce(edit_campsite_type.media_id, campsite_type.media_id) , active = edit_campsite_type.active where slug = edit_campsite_type.slug returning slug; @@ -20,7 +21,7 @@ $$ language sql ; -revoke execute on function edit_campsite_type(uuid, text, text, boolean) from public; -grant execute on function edit_campsite_type(uuid, text, text, boolean) to admin; +revoke execute on function edit_campsite_type(uuid, integer, text, text, boolean) from public; +grant execute on function edit_campsite_type(uuid, integer, text, text, boolean) to admin; commit; diff --git a/pkg/app/app.go b/pkg/app/app.go index 94bbb41..2b1d545 100644 --- a/pkg/app/app.go +++ b/pkg/app/app.go @@ -23,12 +23,13 @@ type App struct { profile *profileHandler admin *adminHandler public *publicHandler + media *mediaHandler locales locale.Locales defaultLocale *locale.Locale languageMatcher language.Matcher } -func New(db *database.DB, avatarsDir string) (http.Handler, error) { +func New(db *database.DB, avatarsDir string, mediaDir string) (http.Handler, error) { locales, err := locale.GetAll(context.Background(), db) if err != nil { return nil, err @@ -38,12 +39,17 @@ func New(db *database.DB, avatarsDir string) (http.Handler, error) { if err != nil { return nil, err } + media, err := newMediaHandler(mediaDir) + if err != nil { + return nil, err + } app := &App{ db: db, fileHandler: static, profile: profile, admin: newAdminHandler(), public: newPublicHandler(), + media: media, locales: locales, defaultLocale: locales[language.Catalan], languageMatcher: language.NewMatcher(locales.Tags()), @@ -104,6 +110,8 @@ func (h *App) ServeHTTP(w http.ResponseWriter, r *http.Request) { } case "me": h.profile.Handler(user, company, conn).ServeHTTP(w, r) + case "media": + h.media.Handler(user, company, conn).ServeHTTP(w, r) default: langTag, err := language.Parse(head) if err != nil { diff --git a/pkg/app/media.go b/pkg/app/media.go new file mode 100644 index 0000000..a504fd6 --- /dev/null +++ b/pkg/app/media.go @@ -0,0 +1,95 @@ +/* + * SPDX-FileCopyrightText: 2023 jordi fita mas + * SPDX-License-Identifier: AGPL-3.0-only + */ + +package app + +import ( + "net/http" + "os" + "path" + "path/filepath" + "strings" + + "dev.tandem.ws/tandem/camper/pkg/auth" + "dev.tandem.ws/tandem/camper/pkg/database" + "dev.tandem.ws/tandem/camper/pkg/hex" + httplib "dev.tandem.ws/tandem/camper/pkg/http" +) + +type mediaHandler struct { + mediaDir string + fileHandler http.Handler +} + +func newMediaHandler(mediaDir string) (*mediaHandler, error) { + if err := os.MkdirAll(mediaDir, 0755); err != nil { + return nil, err + } + handler := &mediaHandler{ + mediaDir: mediaDir, + fileHandler: http.FileServer(http.Dir(mediaDir)), + } + return handler, nil +} + +func (h *mediaHandler) Handler(user *auth.User, company *auth.Company, conn *database.Conn) http.HandlerFunc { + return func(w http.ResponseWriter, r *http.Request) { + var head string + head, r.URL.Path = httplib.ShiftPath(r.URL.Path) + + if !mediaHashValid(head) { + http.NotFound(w, r) + return + } + switch r.Method { + case http.MethodGet: + h.serveMedia(w, r, company, conn, strings.ToLower(head)) + default: + httplib.MethodNotAllowed(w, r, http.MethodGet) + } + } +} + +func (h *mediaHandler) serveMedia(w http.ResponseWriter, r *http.Request, company *auth.Company, conn *database.Conn, hash string) { + mediaPath := h.mediaPath(hash) + var err error + if _, err = os.Stat(mediaPath); err != nil { + bytes, err := conn.GetBytes(r.Context(), "select content from media where company_id = $1 and hash = decode($2, 'hex')", company.ID, hash) + if err != nil { + if database.ErrorIsNotFound(err) { + http.NotFound(w, r) + return + } + panic(err) + } + if err = os.MkdirAll(path.Dir(mediaPath), 0755); err != nil { + panic(err) + } + if err = os.WriteFile(mediaPath, bytes, 0644); err != nil { + panic(err) + } + } + r.URL.Path, err = filepath.Rel(h.mediaDir, mediaPath) + if err != nil { + panic(err) + } + h.fileHandler.ServeHTTP(w, r) +} + +func (h *mediaHandler) mediaPath(hash string) string { + return filepath.Join(h.mediaDir, hash[:2], hash[2:]) +} + +func mediaHashValid(s string) bool { + if len(s) != 64 { + return false + } + for i := 0; i < 64; i += 2 { + if !hex.Valid(s[i], s[i+1]) { + return false + } + } + return true +} diff --git a/pkg/app/media_test.go b/pkg/app/media_test.go new file mode 100644 index 0000000..8b93ff6 --- /dev/null +++ b/pkg/app/media_test.go @@ -0,0 +1,37 @@ +/* + * SPDX-FileCopyrightText: 2023 jordi fita mas + * SPDX-License-Identifier: AGPL-3.0-only + */ + +package app + +import ( + "strings" + "testing" +) + +type test struct { + in string + isHash bool +} + +var tests = []test{ + {"6ccd4e641d6c52c11262b1a8140d656ff80c5c32e230ada565d5d46f11132ead", true}, + {"b94d27b9934d3e08a52e52d7da7dabfac484efe37a5380ee9088f7ace2efcde9", true}, + {"x6df42afe8fafbe77089309b732b5c20234d4b0ed429144ba5b8471b1b371310", false}, + {"b94d27b9934d3e08a52e52d7da7dabfac484efe37a5380ee9088f7ace2efcde99", false}, + {"b94d27b9934d3e08a52e52d7da7dabfac484efe37a5380ee9088f7ace2efcde", false}, +} + +func testValid(t *testing.T, in string, isHash bool) { + if ok := mediaHashValid(in); ok != isHash { + t.Errorf("Valid(%s) got %v expected %v", in, ok, isHash) + } +} + +func TestMediaHash(t *testing.T) { + for _, tt := range tests { + testValid(t, tt.in, tt.isHash) + testValid(t, strings.ToUpper(tt.in), tt.isHash) + } +} diff --git a/pkg/app/public.go b/pkg/app/public.go index fa7bd8e..a67abd5 100644 --- a/pkg/app/public.go +++ b/pkg/app/public.go @@ -6,12 +6,14 @@ package app import ( + "context" "net/http" "dev.tandem.ws/tandem/camper/pkg/auth" "dev.tandem.ws/tandem/camper/pkg/campsite" "dev.tandem.ws/tandem/camper/pkg/database" httplib "dev.tandem.ws/tandem/camper/pkg/http" + "dev.tandem.ws/tandem/camper/pkg/locale" "dev.tandem.ws/tandem/camper/pkg/template" ) @@ -43,13 +45,46 @@ func (h *publicHandler) Handler(user *auth.User, company *auth.Company, conn *da type homePage struct { *template.PublicPage + CampsiteTypes []*campsiteType } func newHomePage() *homePage { - return &homePage{template.NewPublicPage()} + return &homePage{template.NewPublicPage(), nil} } func (p *homePage) MustRender(w http.ResponseWriter, r *http.Request, user *auth.User, company *auth.Company, conn *database.Conn) { p.Setup(r, user, company, conn) + p.CampsiteTypes = mustCollectCampsiteTypes(r.Context(), company, conn, user.Locale) template.MustRenderPublic(w, r, user, company, "home.gohtml", p) } + +type campsiteType struct { + Label string + HRef string + Media string +} + +func mustCollectCampsiteTypes(ctx context.Context, company *auth.Company, conn *database.Conn, loc *locale.Locale) []*campsiteType { + rows, err := conn.Query(ctx, "select name, '/campsites/types/' || slug, '/media/' || encode(hash, 'hex') from campsite_type join media using (media_id) where campsite_type.company_id = $1", company.ID) + if err != nil { + panic(err) + } + defer rows.Close() + + localePath := "/" + loc.Language.String() + var items []*campsiteType + for rows.Next() { + item := &campsiteType{} + err = rows.Scan(&item.Label, &item.HRef, &item.Media) + if err != nil { + panic(err) + } + item.HRef = localePath + item.HRef + items = append(items, item) + } + if rows.Err() != nil { + panic(rows.Err()) + } + + return items +} diff --git a/pkg/campsite/types/admin.go b/pkg/campsite/types/admin.go index 80600d9..f113064 100644 --- a/pkg/campsite/types/admin.go +++ b/pkg/campsite/types/admin.go @@ -7,6 +7,7 @@ package types import ( "context" + "io" "net/http" "dev.tandem.ws/tandem/camper/pkg/auth" @@ -115,48 +116,56 @@ func (page *typeIndex) MustRender(w http.ResponseWriter, r *http.Request, user * func addType(w http.ResponseWriter, r *http.Request, user *auth.User, company *auth.Company, conn *database.Conn) { f := newTypeForm() - if err := f.Parse(r); err != nil { - http.Error(w, err.Error(), http.StatusBadRequest) - return - } - if err := user.VerifyCSRFToken(r); err != nil { - http.Error(w, err.Error(), http.StatusForbidden) - return - } - if !f.Valid(user.Locale) { - if !httplib.IsHTMxRequest(r) { - w.WriteHeader(http.StatusUnprocessableEntity) - } - f.MustRender(w, r, user, company) - return - } - conn.MustExec(r.Context(), "select add_campsite_type($1, $2, $3)", company.ID, f.Name, f.Description) - httplib.Redirect(w, r, "/admin/campsites/types", http.StatusSeeOther) + processTypeForm(w, r, user, company, true, f, func(ctx context.Context) { + bytes := f.MustReadAllMedia() + tx := conn.MustBegin(ctx) + defer tx.Rollback(ctx) + mediaID := tx.MustGetInt(ctx, "select add_media($1, $2, $3, $4)", company.ID, f.Media.Filename(), f.Media.ContentType, bytes) + tx.MustExec(ctx, "select add_campsite_type($1, $2, $3, $4)", company.ID, mediaID, f.Name, f.Description) + tx.MustCommit(ctx) + }) } func editType(w http.ResponseWriter, r *http.Request, user *auth.User, company *auth.Company, conn *database.Conn, f *typeForm) { - if err := f.Parse(r); err != nil { + processTypeForm(w, r, user, company, false, f, func(ctx context.Context) { + bytes := f.MustReadAllMedia() + if bytes == nil { + conn.MustExec(ctx, "select edit_campsite_type($1, $2, $3, $4, $5)", f.Slug, nil, f.Name, f.Description, f.Active) + } else { + tx := conn.MustBegin(ctx) + defer tx.Rollback(ctx) + mediaID := tx.MustGetInt(ctx, "select add_media($1, $2, $3, $4)", company.ID, f.Media.Filename(), f.Media.ContentType, bytes) + tx.MustExec(ctx, "select edit_campsite_type($1, $2, $3, $4, $5)", f.Slug, mediaID, f.Name, f.Description, f.Active) + tx.MustCommit(ctx) + } + }) +} + +func processTypeForm(w http.ResponseWriter, r *http.Request, user *auth.User, company *auth.Company, mediaRequired bool, f *typeForm, act func(ctx context.Context)) { + if err := f.Parse(w, r); err != nil { http.Error(w, err.Error(), http.StatusBadRequest) return } + defer f.Close() if err := user.VerifyCSRFToken(r); err != nil { http.Error(w, err.Error(), http.StatusForbidden) return } - if !f.Valid(user.Locale) { + if !f.Valid(user.Locale, mediaRequired) { if !httplib.IsHTMxRequest(r) { w.WriteHeader(http.StatusUnprocessableEntity) } f.MustRender(w, r, user, company) return } - conn.MustExec(r.Context(), "select edit_campsite_type($1, $2, $3, $4)", f.Slug, f.Name, f.Description, f.Active) + act(r.Context()) httplib.Redirect(w, r, "/admin/campsites/types", http.StatusSeeOther) } type typeForm struct { Slug string Active *form.Checkbox + Media *form.File Name *form.Input Description *form.Input } @@ -167,6 +176,10 @@ func newTypeForm() *typeForm { Name: "active", Checked: true, }, + Media: &form.File{ + Name: "media", + MaxSize: 1 << 20, + }, Name: &form.Input{ Name: "name", }, @@ -178,26 +191,63 @@ func newTypeForm() *typeForm { func (f *typeForm) FillFromDatabase(ctx context.Context, conn *database.Conn, slug string) error { f.Slug = slug - row := conn.QueryRow(ctx, "select name, description, active from campsite_type where slug = $1", slug) - return row.Scan(&f.Name.Val, &f.Description.Val, &f.Active.Checked) + row := conn.QueryRow(ctx, ` + select name + , description + , encode(hash, 'hex') + , active + from campsite_type + join media using (media_id) + where slug = $1 + `, slug) + return row.Scan(&f.Name.Val, &f.Description.Val, &f.Media.Val, &f.Active.Checked) } -func (f *typeForm) Parse(r *http.Request) error { - if err := r.ParseForm(); err != nil { +func (f *typeForm) Parse(w http.ResponseWriter, r *http.Request) error { + maxSize := f.Media.MaxSize + 1024 + r.Body = http.MaxBytesReader(w, r.Body, maxSize) + if err := r.ParseMultipartForm(maxSize); err != nil { return err } f.Active.FillValue(r) f.Name.FillValue(r) f.Description.FillValue(r) + if err := f.Media.FillValue(r); err != nil { + return err + } return nil } -func (f *typeForm) Valid(l *locale.Locale) bool { +func (f *typeForm) Close() error { + return f.Media.Close() +} + +func (f *typeForm) Valid(l *locale.Locale, mediaRequired bool) bool { v := form.NewValidator(l) v.CheckRequired(f.Name, l.GettextNoop("Name can not be empty.")) + if f.HasMediaFile() { + v.CheckImageFile(f.Media, l.GettextNoop("File must be a valid PNG or JPEG image.")) + } else { + v.Check(f.Media, !mediaRequired, l.GettextNoop("Cover image can not be empty.")) + } return v.AllOK } func (f *typeForm) MustRender(w http.ResponseWriter, r *http.Request, user *auth.User, company *auth.Company) { template.MustRenderAdmin(w, r, user, company, "campsite/type/form.gohtml", f) } + +func (f *typeForm) HasMediaFile() bool { + return f.Media.HasData() +} + +func (f *typeForm) MustReadAllMedia() []byte { + if !f.HasMediaFile() { + return nil + } + bytes, err := io.ReadAll(f.Media) + if err != nil { + panic(err) + } + return bytes +} diff --git a/pkg/database/db.go b/pkg/database/db.go index abbbc96..3a91028 100644 --- a/pkg/database/db.go +++ b/pkg/database/db.go @@ -63,6 +63,14 @@ type Conn struct { *pgxpool.Conn } +func (c *Conn) MustBegin(ctx context.Context) *Tx { + tx, err := c.Begin(ctx) + if err != nil { + panic(err) + } + return &Tx{tx} +} + func (c *Conn) MustExec(ctx context.Context, sql string, args ...interface{}) pgconn.CommandTag { tag, err := c.Conn.Exec(ctx, sql, args...) if err != nil { @@ -94,3 +102,9 @@ func (c *Conn) GetBool(ctx context.Context, sql string, args ...interface{}) (bo } return result, nil } + +func (c *Conn) GetBytes(ctx context.Context, sql string, args ...interface{}) ([]byte, error) { + var result []byte + err := c.QueryRow(ctx, sql, args...).Scan(&result) + return result, err +} diff --git a/pkg/database/tx.go b/pkg/database/tx.go new file mode 100644 index 0000000..fad6cdc --- /dev/null +++ b/pkg/database/tx.go @@ -0,0 +1,44 @@ +/* + * SPDX-FileCopyrightText: 2023 jordi fita mas + * SPDX-License-Identifier: AGPL-3.0-only + */ + +package database + +import ( + "context" + "github.com/jackc/pgconn" + "github.com/jackc/pgx/v4" +) + +type Tx struct { + pgx.Tx +} + +func (tx *Tx) MustCommit(ctx context.Context) { + if err := tx.Tx.Commit(ctx); err != nil { + panic(err) + } +} + +func (tx *Tx) MustExec(ctx context.Context, sql string, args ...interface{}) pgconn.CommandTag { + tag, err := tx.Tx.Exec(ctx, sql, args...) + if err != nil { + panic(err) + } + return tag +} + +func (tx *Tx) GetInt(ctx context.Context, sql string, args ...interface{}) (int, error) { + var result int + err := tx.QueryRow(ctx, sql, args...).Scan(&result) + return result, err +} + +func (tx *Tx) MustGetInt(ctx context.Context, sql string, args ...interface{}) int { + if result, err := tx.GetInt(ctx, sql, args...); err == nil { + return result + } else { + panic(err) + } +} diff --git a/pkg/form/file.go b/pkg/form/file.go index 4160564..29eb658 100644 --- a/pkg/form/file.go +++ b/pkg/form/file.go @@ -43,6 +43,13 @@ func (f *File) FillValue(r *http.Request) error { return nil } +func (f *File) Filename() string { + if f.header == nil { + return "" + } + return f.header.Filename +} + func (f *File) Close() error { if !f.HasData() { return nil diff --git a/pkg/form/validator.go b/pkg/form/validator.go index 0fa46db..abdeb54 100644 --- a/pkg/form/validator.go +++ b/pkg/form/validator.go @@ -29,21 +29,21 @@ func NewValidator(l *locale.Locale) *Validator { } func (v *Validator) CheckRequired(input *Input, message string) bool { - return v.check(input, input.Val != "", message) + return v.Check(input, input.Val != "", message) } func (v *Validator) CheckMinLength(input *Input, min int, message string) bool { - return v.check(input, len(input.Val) >= min, message) + return v.Check(input, len(input.Val) >= min, message) } func (v *Validator) CheckValidEmail(input *Input, message string) bool { _, err := mail.ParseAddress(input.Val) - return v.check(input, err == nil, message) + return v.Check(input, err == nil, message) } func (v *Validator) CheckValidURL(input *Input, message string) bool { _, err := url.Parse(input.Val) - return v.check(input, err == nil, message) + return v.Check(input, err == nil, message) } func (v *Validator) CheckValidVATIN(ctx context.Context, conn *database.Conn, input *Input, country string, message string) (bool, error) { @@ -51,7 +51,7 @@ func (v *Validator) CheckValidVATIN(ctx context.Context, conn *database.Conn, in if err != nil { return false, err } - return v.check(input, b, message), nil + return v.Check(input, b, message), nil } func (v *Validator) CheckValidPhone(ctx context.Context, conn *database.Conn, input *Input, country string, message string) (bool, error) { @@ -59,7 +59,7 @@ func (v *Validator) CheckValidPhone(ctx context.Context, conn *database.Conn, in if err != nil { return false, err } - return v.check(input, b, message), nil + return v.Check(input, b, message), nil } func (v *Validator) CheckValidColor(ctx context.Context, conn *database.Conn, input *Input, message string) (bool, error) { @@ -67,7 +67,7 @@ func (v *Validator) CheckValidColor(ctx context.Context, conn *database.Conn, in if err != nil { return false, err } - return v.check(input, b, message), nil + return v.Check(input, b, message), nil } func (v *Validator) CheckValidPostalCode(ctx context.Context, conn *database.Conn, input *Input, country string, message string) (bool, error) { @@ -79,26 +79,26 @@ func (v *Validator) CheckValidPostalCode(ctx context.Context, conn *database.Con if err != nil { return false, err } - return v.check(input, match, message), nil + return v.Check(input, match, message), nil } func (v *Validator) CheckPasswordConfirmation(password *Input, confirm *Input, message string) bool { - return v.check(confirm, password.Val == confirm.Val, message) + return v.Check(confirm, password.Val == confirm.Val, message) } func (v *Validator) CheckSelectedOptions(field *Select, message string) bool { - return v.check(field, field.validOptionsSelected(), message) + return v.Check(field, field.validOptionsSelected(), message) } func (v *Validator) CheckImageFile(field *File, message string) bool { - return v.check(field, field.ContentType == "image/png" || field.ContentType == "image/jpeg", message) + return v.Check(field, field.ContentType == "image/png" || field.ContentType == "image/jpeg", message) } type field interface { setError(error) } -func (v *Validator) check(field field, ok bool, message string) bool { +func (v *Validator) Check(field field, ok bool, message string) bool { if !ok { field.setError(errors.New(v.l.Get(message))) v.AllOK = false diff --git a/pkg/hex/hex.go b/pkg/hex/hex.go new file mode 100644 index 0000000..a0ce2d8 --- /dev/null +++ b/pkg/hex/hex.go @@ -0,0 +1,30 @@ +/* + * SPDX-FileCopyrightText: 2023 jordi fita mas + * SPDX-License-Identifier: AGPL-3.0-only + */ + +package hex + +// xvalues returns the value of a byte as a hexadecimal digit or 255. +var xvalues = [256]byte{ + 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 255, 255, 255, 255, 255, 255, + 255, 10, 11, 12, 13, 14, 15, 255, 255, 255, 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, + 255, 10, 11, 12, 13, 14, 15, 255, 255, 255, 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, +} + +func Valid(x1, x2 byte) bool { + return xvalues[x1] != 255 && xvalues[x2] != 255 +} diff --git a/pkg/hex/hex_test.go b/pkg/hex/hex_test.go new file mode 100644 index 0000000..6298b30 --- /dev/null +++ b/pkg/hex/hex_test.go @@ -0,0 +1,46 @@ +/* + * SPDX-FileCopyrightText: 2023 jordi fita mas + * SPDX-License-Identifier: AGPL-3.0-only + */ + +package hex + +import ( + "strings" + "testing" +) + +type test struct { + in string + isHex bool +} + +var tests = []test{ + {"f4", true}, + {"2b", true}, + {"19", true}, + {"aa", true}, + {"ff", true}, + {"00", true}, + {"bc", true}, + {"de", true}, + {"ef", true}, + {"fe", true}, + {"1g", false}, + {"gb", false}, + {"zb", false}, + {"2x", false}, +} + +func testValid(t *testing.T, in string, isHex bool) { + if ok := Valid(in[0], in[1]); ok != isHex { + t.Errorf("Valid(%s) got %v expected %v", in, ok, isHex) + } +} + +func TestHex(t *testing.T) { + for _, tt := range tests { + testValid(t, tt.in, tt.isHex) + testValid(t, strings.ToUpper(tt.in), tt.isHex) + } +} diff --git a/pkg/uuid/uuid.go b/pkg/uuid/uuid.go index 3a06145..84dfd9e 100644 --- a/pkg/uuid/uuid.go +++ b/pkg/uuid/uuid.go @@ -5,6 +5,8 @@ package uuid +import "dev.tandem.ws/tandem/camper/pkg/hex" + func Valid(s string) bool { if len(s) != 36 { return false @@ -19,33 +21,9 @@ func Valid(s string) bool { 14, 16, 19, 21, 24, 26, 28, 30, 32, 34} { - if !validHex(s[x], s[x+1]) { + if !hex.Valid(s[x], s[x+1]) { return false } } return true } - -// xvalues returns the value of a byte as a hexadecimal digit or 255. -var xvalues = [256]byte{ - 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, - 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, - 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, - 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 255, 255, 255, 255, 255, 255, - 255, 10, 11, 12, 13, 14, 15, 255, 255, 255, 255, 255, 255, 255, 255, 255, - 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, - 255, 10, 11, 12, 13, 14, 15, 255, 255, 255, 255, 255, 255, 255, 255, 255, - 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, - 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, - 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, - 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, - 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, - 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, - 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, - 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, - 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, -} - -func validHex(x1, x2 byte) bool { - return xvalues[x1] != 255 && xvalues[x2] != 255 -} diff --git a/revert/add_campsite_type.sql b/revert/add_campsite_type.sql index 2a80e4f..88a5efc 100644 --- a/revert/add_campsite_type.sql +++ b/revert/add_campsite_type.sql @@ -2,6 +2,6 @@ begin; -drop function if exists camper.add_campsite_type(integer, text, text); +drop function if exists camper.add_campsite_type(integer, integer, text, text); commit; diff --git a/revert/edit_campsite_type.sql b/revert/edit_campsite_type.sql index ab3ba75..82b461d 100644 --- a/revert/edit_campsite_type.sql +++ b/revert/edit_campsite_type.sql @@ -2,6 +2,6 @@ begin; -drop function if exists camper.edit_campsite_type(uuid, text, text, boolean); +drop function if exists camper.edit_campsite_type(uuid, integer, text, text, boolean); commit; diff --git a/sqitch.plan b/sqitch.plan index ad4b1de..2495afe 100644 --- a/sqitch.plan +++ b/sqitch.plan @@ -39,7 +39,10 @@ current_company_id [roles schema_camper] 2023-08-07T10:44:36Z jordi fita mas # Add view for user profile policies_company [company user_profile] 2023-08-07T20:04:26Z jordi fita mas # Add row-level security profiles to company change_password [roles schema_auth schema_camper user] 2023-07-21T23:54:52Z jordi fita mas # Add function to change the current user’s password -campsite_type [roles schema_camper company user_profile] 2023-07-31T11:20:29Z jordi fita mas # Add relation of campsite type +media_type [schema_camper] 2023-09-08T17:17:02Z jordi fita mas # Add domain for media type +media [roles schema_camper company user_profile media_type] 2023-09-08T16:50:55Z jordi fita mas # Add relation of uploaded media +add_media [roles schema_camper media media_type] 2023-09-08T17:40:28Z jordi fita mas # Add function to create media +campsite_type [roles schema_camper company media user_profile] 2023-07-31T11:20:29Z jordi fita mas # Add relation of campsite type add_campsite_type [roles schema_camper campsite_type company] 2023-08-04T16:14:48Z jordi fita mas # Add function to create campsite types edit_campsite_type [roles schema_camper campsite_type company] 2023-08-07T22:21:34Z jordi fita mas # Add function to edit campsite types campsite [roles schema_camper company campsite_type user_profile] 2023-08-14T10:11:51Z jordi fita mas # Add campsite relation @@ -53,6 +56,3 @@ to_color [roles schema_camper color] 2023-08-16T13:11:32Z jordi fita mas # Add relation of (tourist) season add_season [roles schema_camper season color to_integer] 2023-08-16T16:59:17Z jordi fita mas # Add function to create seasons edit_season [roles schema_camper season color to_integer] 2023-08-16T17:09:02Z jordi fita mas # Add function to update seasons -media_type [schema_camper] 2023-09-08T17:17:02Z jordi fita mas # Add domain for media type -media [roles schema_camper company user_profile media_type] 2023-09-08T16:50:55Z jordi fita mas # Add relation of uploaded media -add_media [roles schema_camper media media_type] 2023-09-08T17:40:28Z jordi fita mas # Add function to create media diff --git a/test/add_campsite.sql b/test/add_campsite.sql index 85734fa..075c81b 100644 --- a/test/add_campsite.sql +++ b/test/add_campsite.sql @@ -23,6 +23,7 @@ select function_privs_are('camper', 'add_campsite', array ['integer', 'text'], ' set client_min_messages to warning; truncate campsite cascade; truncate campsite_type cascade; +truncate media cascade; truncate company cascade; reset client_min_messages; @@ -32,10 +33,15 @@ values (1, 'Company 2', 'XX123', '', '555-555-555', 'a@a', '', '', '', '', '', ' , (2, 'Company 4', 'XX234', '', '666-666-666', 'b@b', '', '', '', '', '', 'FR', 'USD', 'ca') ; -insert into campsite_type (campsite_type_id, company_id, name) -values (11, 1, 'A') - , (12, 1, 'B') - , (21, 2, 'C') +insert into media (media_id, company_id, original_filename, media_type, content) +values (3, 1, 'cover2.xpm', 'image/x-xpixmap', 'static char *s[]={"1 1 1 1","a c #ffffff","a"};') + , (4, 2, 'cover4.xpm', 'image/x-xpixmap', 'static char *s[]={"1 1 1 1","a c #ffffff","a"};') +; + +insert into campsite_type (campsite_type_id, company_id, media_id, name) +values (11, 1, 3, 'A') + , (12, 1, 3, 'B') + , (21, 2, 4, 'C') ; select lives_ok( diff --git a/test/add_campsite_type.sql b/test/add_campsite_type.sql index 0d5be2d..4b91d29 100644 --- a/test/add_campsite_type.sql +++ b/test/add_campsite_type.sql @@ -9,19 +9,20 @@ set search_path to camper, public; select plan(12); -select has_function('camper', 'add_campsite_type', array ['integer', 'text', 'text']); -select function_lang_is('camper', 'add_campsite_type', array ['integer', 'text', 'text'], 'sql'); -select function_returns('camper', 'add_campsite_type', array ['integer', 'text', 'text'], 'uuid'); -select isnt_definer('camper', 'add_campsite_type', array ['integer', 'text', 'text']); -select volatility_is('camper', 'add_campsite_type', array ['integer', 'text', 'text'], 'volatile'); -select function_privs_are('camper', 'add_campsite_type', array ['integer', 'text', 'text'], 'guest', array[]::text[]); -select function_privs_are('camper', 'add_campsite_type', array ['integer', 'text', 'text'], 'employee', array[]::text[]); -select function_privs_are('camper', 'add_campsite_type', array ['integer', 'text', 'text'], 'admin', array['EXECUTE']); -select function_privs_are('camper', 'add_campsite_type', array ['integer', 'text', 'text'], 'authenticator', array[]::text[]); +select has_function('camper', 'add_campsite_type', array ['integer', 'integer', 'text', 'text']); +select function_lang_is('camper', 'add_campsite_type', array ['integer', 'integer', 'text', 'text'], 'sql'); +select function_returns('camper', 'add_campsite_type', array ['integer', 'integer', 'text', 'text'], 'uuid'); +select isnt_definer('camper', 'add_campsite_type', array ['integer', 'integer', 'text', 'text']); +select volatility_is('camper', 'add_campsite_type', array ['integer', 'integer', 'text', 'text'], 'volatile'); +select function_privs_are('camper', 'add_campsite_type', array ['integer', 'integer', 'text', 'text'], 'guest', array[]::text[]); +select function_privs_are('camper', 'add_campsite_type', array ['integer', 'integer', 'text', 'text'], 'employee', array[]::text[]); +select function_privs_are('camper', 'add_campsite_type', array ['integer', 'integer', 'text', 'text'], 'admin', array['EXECUTE']); +select function_privs_are('camper', 'add_campsite_type', array ['integer', 'integer', 'text', 'text'], 'authenticator', array[]::text[]); set client_min_messages to warning; truncate campsite_type cascade; +truncate media cascade; truncate company cascade; reset client_min_messages; @@ -31,20 +32,25 @@ values (1, 'Company 2', 'XX123', '', '555-555-555', 'a@a', '', '', '', '', '', ' , (2, 'Company 4', 'XX234', '', '666-666-666', 'b@b', '', '', '', '', '', 'FR', 'USD', 'ca') ; +insert into media (media_id, company_id, original_filename, media_type, content) +values (3, 1, 'cover2.xpm', 'image/x-xpixmap', 'static char *s[]={"1 1 1 1","a c #ffffff","a"};') + , (4, 2, 'cover4.xpm', 'image/x-xpixmap', 'static char *s[]={"1 1 1 1","a c #ffffff","a"};') +; + select lives_ok( - $$ select add_campsite_type(1, 'Type A', '

This is what, exactly?

Dunno

') $$, + $$ select add_campsite_type(1, 3, 'Type A', '

This is what, exactly?

Dunno

') $$, 'Should be able to add a campsite type to the first company' ); select lives_ok( - $$ select add_campsite_type(2, 'Type B', '') $$, + $$ select add_campsite_type(2, 4, 'Type B', '') $$, 'Should be able to add a campsite type to the second company' ); select bag_eq( - $$ select company_id, name, description::text, active from campsite_type $$, - $$ values (1, 'Type A', '

This is what, exactly?

Dunno

', true) - , (2, 'Type B', '', true) + $$ select company_id, media_id, name, description::text, active from campsite_type $$, + $$ values (1, 3, 'Type A', '

This is what, exactly?

Dunno

', true) + , (2, 4, 'Type B', '', true) $$, 'Should have added all two campsite type' ); diff --git a/test/campsite.sql b/test/campsite.sql index 2dd4232..b1053e4 100644 --- a/test/campsite.sql +++ b/test/campsite.sql @@ -65,6 +65,7 @@ select col_default_is('campsite', 'active', 'true'); set client_min_messages to warning; truncate campsite cascade; truncate campsite_type cascade; +truncate media cascade; truncate company_host cascade; truncate company_user cascade; truncate company cascade; @@ -92,9 +93,14 @@ values (2, 'co2') , (4, 'co4') ; -insert into campsite_type (campsite_type_id, company_id, name) -values (22, 2, 'Wooden lodge') - , (44, 4, 'Bungalow') +insert into media (media_id, company_id, original_filename, media_type, content) +values (6, 2, 'cover2.xpm', 'image/x-xpixmap', 'static char *s[]={"1 1 1 1","a c #ffffff","a"};') + , (8, 4, 'cover4.xpm', 'image/x-xpixmap', 'static char *s[]={"1 1 1 1","a c #ffffff","a"};') +; + +insert into campsite_type (campsite_type_id, company_id, media_id, name) +values (22, 2, 6, 'Wooden lodge') + , (44, 4, 8, 'Bungalow') ; insert into campsite (company_id, campsite_type_id, label) diff --git a/test/campsite_type.sql b/test/campsite_type.sql index e7892a0..1598ab0 100644 --- a/test/campsite_type.sql +++ b/test/campsite_type.sql @@ -5,7 +5,7 @@ reset client_min_messages; begin; -select plan(56); +select plan(62); set search_path to camper, public; @@ -48,6 +48,13 @@ select col_type_is('campsite_type', 'name', 'text'); select col_not_null('campsite_type', 'name'); select col_hasnt_default('campsite_type', 'name'); +select has_column('campsite_type', 'media_id'); +select col_is_fk('campsite_type', 'media_id'); +select fk_ok('campsite_type', 'media_id', 'media', 'media_id'); +select col_type_is('campsite_type', 'media_id', 'integer'); +select col_not_null('campsite_type', 'media_id'); +select col_hasnt_default('campsite_type', 'media_id'); + select has_column('campsite_type', 'description'); select col_type_is('campsite_type', 'description', 'xml'); select col_not_null('campsite_type', 'description'); @@ -63,6 +70,7 @@ select col_default_is('campsite_type', 'active', 'true'); set client_min_messages to warning; truncate campsite_type cascade; +truncate media cascade; truncate company_host cascade; truncate company_user cascade; truncate company cascade; @@ -89,9 +97,14 @@ values (2, 'co2') , (4, 'co4') ; -insert into campsite_type (company_id, name) -values (2, 'Wooden lodge') - , (4, 'Bungalow') +insert into media (media_id, company_id, original_filename, media_type, content) +values (6, 2, 'cover2.xpm', 'image/x-xpixmap', 'static char *s[]={"1 1 1 1","a c #ffffff","a"};') + , (8, 4, 'cover4.xpm', 'image/x-xpixmap', 'static char *s[]={"1 1 1 1","a c #ffffff","a"};') +; + +insert into campsite_type (company_id, name, media_id) +values (2, 'Wooden lodge', 6) + , (4, 'Bungalow', 8) ; prepare campsite_type_data as @@ -112,7 +125,7 @@ reset role; select set_cookie('44facbb30d8a419dfd4bfbc44a4b5539d4970148dfc84bed0e/demo@tandem.blog', 'co2'); select lives_ok( - $$ insert into campsite_type(company_id, name) values (2, 'Another type' ) $$, + $$ insert into campsite_type(company_id, name, media_id) values (2, 'Another type', 6) $$, 'Admin from company 2 should be able to insert a new campsite type to that company.' ); @@ -153,7 +166,7 @@ select bag_eq( ); select throws_ok( - $$ insert into campsite_type (company_id, name) values (4, 'Another type' ) $$, + $$ insert into campsite_type (company_id, name, media_id) values (4, 'Another type', 6) $$, '42501', 'new row violates row-level security policy for table "campsite_type"', 'Admin from company 2 should NOT be able to insert new campsite types to company 4.' ); @@ -191,7 +204,7 @@ select bag_eq( ); select throws_ok( - $$ insert into campsite_type (company_id, name) values (2, ' ' ) $$, + $$ insert into campsite_type (company_id, name, media_id) values (2, ' ', 6) $$, '23514', 'new row for relation "campsite_type" violates check constraint "name_not_empty"', 'Should not be able to insert campsite types with a blank name.' ); diff --git a/test/edit_campsite.sql b/test/edit_campsite.sql index 29427e0..8c13e15 100644 --- a/test/edit_campsite.sql +++ b/test/edit_campsite.sql @@ -22,6 +22,7 @@ select function_privs_are('camper', 'edit_campsite', array ['uuid', 'integer', ' set client_min_messages to warning; truncate campsite cascade; truncate campsite_type cascade; +truncate media cascade; truncate company cascade; reset client_min_messages; @@ -30,10 +31,14 @@ insert into company (company_id, business_name, vatin, trade_name, phone, email, values (1, 'Company 2', 'XX123', '', '555-555-555', 'a@a', '', '', '', '', '', 'ES', 'EUR', 'ca') ; -insert into campsite_type (campsite_type_id, company_id, name) -values (11, 1, 'Type A') - , (12, 1, 'Type B') - , (13, 1, 'Type C') +insert into media (media_id, company_id, original_filename, media_type, content) +values (3, 1, 'cover2.xpm', 'image/x-xpixmap', 'static char *s[]={"1 1 1 1","a c #ffffff","a"};') +; + +insert into campsite_type (campsite_type_id, company_id, media_id, name) +values (11, 1, 3, 'Type A') + , (12, 1, 3, 'Type B') + , (13, 1, 3, 'Type C') ; insert into campsite (company_id, campsite_type_id, slug, label, active) diff --git a/test/edit_campsite_type.sql b/test/edit_campsite_type.sql index 395cd73..2963ada 100644 --- a/test/edit_campsite_type.sql +++ b/test/edit_campsite_type.sql @@ -9,18 +9,19 @@ set search_path to camper, public; select plan(12); -select has_function('camper', 'edit_campsite_type', array ['uuid', 'text', 'text', 'boolean']); -select function_lang_is('camper', 'edit_campsite_type', array ['uuid', 'text', 'text', 'boolean'], 'sql'); -select function_returns('camper', 'edit_campsite_type', array ['uuid', 'text', 'text', 'boolean'], 'uuid'); -select isnt_definer('camper', 'edit_campsite_type', array ['uuid', 'text', 'text', 'boolean']); -select volatility_is('camper', 'edit_campsite_type', array ['uuid', 'text', 'text', 'boolean'], 'volatile'); -select function_privs_are('camper', 'edit_campsite_type', array ['uuid', 'text', 'text', 'boolean'], 'guest', array[]::text[]); -select function_privs_are('camper', 'edit_campsite_type', array ['uuid', 'text', 'text', 'boolean'], 'employee', array[]::text[]); -select function_privs_are('camper', 'edit_campsite_type', array ['uuid', 'text', 'text', 'boolean'], 'admin', array['EXECUTE']); -select function_privs_are('camper', 'edit_campsite_type', array ['uuid', 'text', 'text', 'boolean'], 'authenticator', array[]::text[]); +select has_function('camper', 'edit_campsite_type', array ['uuid', 'integer', 'text', 'text', 'boolean']); +select function_lang_is('camper', 'edit_campsite_type', array ['uuid', 'integer', 'text', 'text', 'boolean'], 'sql'); +select function_returns('camper', 'edit_campsite_type', array ['uuid', 'integer', 'text', 'text', 'boolean'], 'uuid'); +select isnt_definer('camper', 'edit_campsite_type', array ['uuid', 'integer', 'text', 'text', 'boolean']); +select volatility_is('camper', 'edit_campsite_type', array ['uuid', 'integer', 'text', 'text', 'boolean'], 'volatile'); +select function_privs_are('camper', 'edit_campsite_type', array ['uuid', 'integer', 'text', 'text', 'boolean'], 'guest', array[]::text[]); +select function_privs_are('camper', 'edit_campsite_type', array ['uuid', 'integer', 'text', 'text', 'boolean'], 'employee', array[]::text[]); +select function_privs_are('camper', 'edit_campsite_type', array ['uuid', 'integer', 'text', 'text', 'boolean'], 'admin', array['EXECUTE']); +select function_privs_are('camper', 'edit_campsite_type', array ['uuid', 'integer', 'text', 'text', 'boolean'], 'authenticator', array[]::text[]); set client_min_messages to warning; truncate campsite_type cascade; +truncate media cascade; truncate company cascade; reset client_min_messages; @@ -29,25 +30,31 @@ insert into company (company_id, business_name, vatin, trade_name, phone, email, values (1, 'Company 2', 'XX123', '', '555-555-555', 'a@a', '', '', '', '', '', 'ES', 'EUR', 'ca') ; -insert into campsite_type (company_id, slug, name, description, active) -values (1, '87452b88-b48f-48d3-bb6c-0296de64164e', 'Type A', '

A

', true) - , (1, '9b6370f7-f941-46f2-bc6e-de455675bd0a', 'Type B', '

B

', false) +insert into media (media_id, company_id, original_filename, media_type, content) +values (2, 1, 'cover2.xpm', 'image/x-xpixmap', 'static char *s[]={"1 1 1 1","a c #ffffff","a"};') + , (3, 1, 'cover3.xpm', 'image/x-xpixmap', 'static char *s[]={"1 1 1 1","a c #ff00ff","a"};') + , (4, 1, 'cover4.xpm', 'image/x-xpixmap', 'static char *s[]={"1 1 1 1","a c #ffff00","a"};') +; + +insert into campsite_type (company_id, slug, media_id, name, description, active) +values (1, '87452b88-b48f-48d3-bb6c-0296de64164e', 2, 'Type A', '

A

', true) + , (1, '9b6370f7-f941-46f2-bc6e-de455675bd0a', 3, 'Type B', '

B

', false) ; select lives_ok( - $$ select edit_campsite_type('87452b88-b48f-48d3-bb6c-0296de64164e', 'Type 1', '

1

', false) $$, + $$ select edit_campsite_type('87452b88-b48f-48d3-bb6c-0296de64164e', 4, 'Type 1', '

1

', false) $$, 'Should be able to edit the first type' ); select lives_ok( - $$ select edit_campsite_type('9b6370f7-f941-46f2-bc6e-de455675bd0a', 'Type 2', '

2

', true) $$, + $$ select edit_campsite_type('9b6370f7-f941-46f2-bc6e-de455675bd0a', null, 'Type 2', '

2

', true) $$, 'Should be able to edit the second type' ); select bag_eq( - $$ select slug::text, name, description::text, active from campsite_type $$, - $$ values ('87452b88-b48f-48d3-bb6c-0296de64164e', 'Type 1', '

1

', false) - , ('9b6370f7-f941-46f2-bc6e-de455675bd0a', 'Type 2', '

2

', true) + $$ select slug::text, media_id, name, description::text, active from campsite_type $$, + $$ values ('87452b88-b48f-48d3-bb6c-0296de64164e', 4, 'Type 1', '

1

', false) + , ('9b6370f7-f941-46f2-bc6e-de455675bd0a', 3, 'Type 2', '

2

', true) $$, 'Should have updated all campsite types.' ); diff --git a/verify/add_campsite_type.sql b/verify/add_campsite_type.sql index 28ba0f7..a62f1a3 100644 --- a/verify/add_campsite_type.sql +++ b/verify/add_campsite_type.sql @@ -2,6 +2,6 @@ begin; -select has_function_privilege('camper.add_campsite_type(integer, text, text)', 'execute'); +select has_function_privilege('camper.add_campsite_type(integer, integer, text, text)', 'execute'); rollback; diff --git a/verify/campsite_type.sql b/verify/campsite_type.sql index db74927..7c76034 100644 --- a/verify/campsite_type.sql +++ b/verify/campsite_type.sql @@ -6,6 +6,7 @@ select campsite_type_id , company_id , slug , name + , media_id , description , active from camper.campsite_type diff --git a/verify/edit_campsite_type.sql b/verify/edit_campsite_type.sql index 6a82ba0..76f1e4c 100644 --- a/verify/edit_campsite_type.sql +++ b/verify/edit_campsite_type.sql @@ -2,6 +2,6 @@ begin; -select has_function_privilege('camper.edit_campsite_type(uuid, text, text, boolean)', 'execute'); +select has_function_privilege('camper.edit_campsite_type(uuid, integer, text, text, boolean)', 'execute'); rollback; diff --git a/web/static/images/camping_montagut_acampada_tenda.jpg b/web/static/images/camping_montagut_acampada_tenda.jpg deleted file mode 100644 index ca73dabc199af3a3874ba2a8456c37989760b3de..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 127111 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

j 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⪻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 M7rv3+$*Q^k+0tV(djJ3c diff --git a/web/templates/admin/campsite/type/form.gohtml b/web/templates/admin/campsite/type/form.gohtml index 8758369..5894b77 100644 --- a/web/templates/admin/campsite/type/form.gohtml +++ b/web/templates/admin/campsite/type/form.gohtml @@ -15,6 +15,7 @@ {{- /*gotype: dev.tandem.ws/tandem/camper/pkg/campsite/types.typeForm*/ -}} {{ template "settings-tabs" "campsiteTypes" }}

{{ template "error-message" . }} {{- end }} + {{ with .Media -}} + {{ if .Val -}} + + {{- end }} + + {{ template "error-message" . }} + {{- end }} {{ with .Description -}}