diff --git a/backend/resize.go b/backend/resize.go index 005f5b28772cd4c633e2737d80c530b2a84cb33d..2ede6267ef4adc80dc9df81f524ffd6cfeeb9f3d 100644 --- a/backend/resize.go +++ b/backend/resize.go @@ -30,7 +30,7 @@ func ResizeImage(env ProcessingEnvironment, imageId string) []error { trackTimeSince(imageProcessDurationRead, startRead) log.Printf("launching resize goroutines for %s", imageId) - errors := runMany(len(env.Config.Sizes), func(index int) error { + return runMany(len(env.Config.Sizes), func(index int) error { definition := env.Config.Sizes[index] path := filepath.Join(env.Config.TargetFolder, fmt.Sprintf("%s%s", imageId, definition.Suffix)) startClone := time.Now().UTC() @@ -61,10 +61,4 @@ func ResizeImage(env ProcessingEnvironment, imageId string) []error { log.Printf("done with image for %s in %v", imageId, definition) return nil }) - if len(errors) == 0 { - if _, err = env.Database.Exec("UPDATE images SET metadata = $2 WHERE id = $1", imageId, originalImage.ParseMetadata()); err != nil { - return []error{err} - } - } - return errors } diff --git a/frontend/errors.go b/frontend/errors.go index e8d868d8da131eb04e8586b78cc319d6c5574f7a..23e4ffbd5d34479d671f062ec9bfd9cfe8f3f27e 100644 --- a/frontend/errors.go +++ b/frontend/errors.go @@ -1,6 +1,7 @@ package main import ( + "git.kuschku.de/justjanne/imghost/shared" "log" "net/http" "net/url" @@ -8,7 +9,7 @@ import ( type ErrorData struct { Code int - User UserInfo + User shared.UserInfo URL *url.URL Error error } diff --git a/frontend/migrations/001_images.up.sql b/frontend/migrations/001_images.up.sql index 80c66956ac0e7af9f592f09d0431f5b7a8a6023a..cfe987bebc7d11141253843555e2452c002238d0 100644 --- a/frontend/migrations/001_images.up.sql +++ b/frontend/migrations/001_images.up.sql @@ -6,7 +6,6 @@ create table if not exists images description text default '' not null, original_name text default '' not null, type text not null, - metadata jsonb default '{}' not null, created_at timestamp not null, updated_at timestamp not null ); diff --git a/frontend/migrations/002_albums.up.sql b/frontend/migrations/002_albums.up.sql index cf94648102c8fb7f5ff09d9179784e09e138db51..08d57e64437eea2a30b7b08b45853f35ee8ac895 100644 --- a/frontend/migrations/002_albums.up.sql +++ b/frontend/migrations/002_albums.up.sql @@ -1,11 +1,11 @@ create table if not exists albums ( - id text not null primary key, - owner text, - title text, - description text, - created_at timestamp, - updated_at timestamp + id text not null primary key, + owner text not null, + title text default '' not null, + description text default '' not null, + created_at timestamp not null, + updated_at timestamp not null ); create index if not exists albums_owner_index diff --git a/frontend/migrations/003_album_images.up.sql b/frontend/migrations/003_album_images.up.sql index c9b97bb844141fd033a71054ef09bd8826d38b32..ae7cc93e2e1f36c9089f4eea6068feb1118a5f82 100644 --- a/frontend/migrations/003_album_images.up.sql +++ b/frontend/migrations/003_album_images.up.sql @@ -1,16 +1,16 @@ create table if not exists album_images ( - album text not null + album text not null constraint album_images_albums_id_fk references albums on update cascade on delete cascade, - image text not null + image text not null constraint album_images_images_id_fk references images on update cascade on delete cascade, - title text, - description text, - position integer, + title text default '' not null, + description text default '' not null, + position integer not null, constraint album_images_image_album_pk primary key (image, album) ); diff --git a/frontend/page_album_detail.go b/frontend/page_album_detail.go index 9ee24c091e34ca36db25fe94ec34aac74c7cc423..cc96f195af774f2aceae8c3f7bac3b8a41e0c0c4 100644 --- a/frontend/page_album_detail.go +++ b/frontend/page_album_detail.go @@ -1,28 +1,29 @@ package main import ( + "git.kuschku.de/justjanne/imghost/shared" "net/http" "path" ) type AlbumDetailData struct { - User UserInfo - Album Album + User shared.UserInfo + Album shared.Album IsMine bool } func pageAlbumDetail(env PageEnvironment) http.Handler { return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { - user := parseUser(r) + user := shared.ParseUser(r) _, albumId := path.Split(r.URL.Path) result, err := env.Database.Query(` SELECT id, owner, - coalesce(title, ''), - coalesce(description, ''), - coalesce(created_at, to_timestamp(0)) + title, + description, + created_at FROM albums WHERE id = $1 `, albumId) @@ -31,7 +32,7 @@ func pageAlbumDetail(env PageEnvironment) http.Handler { return } - var info Album + var info shared.Album if result.Next() { var owner string err := result.Scan(&info.Id, &owner, &info.Title, &info.Description, &info.CreatedAt) @@ -48,7 +49,7 @@ func pageAlbumDetail(env PageEnvironment) http.Handler { position FROM album_images WHERE album = $1 - ORDER BY position ASC + ORDER BY position `, albumId) if err != nil { formatError(w, ErrorData{http.StatusInternalServerError, user, r.URL, err}, "html") @@ -56,7 +57,7 @@ func pageAlbumDetail(env PageEnvironment) http.Handler { } for result.Next() { - var image AlbumImage + var image shared.AlbumImage err := result.Scan(&image.Id, &owner, &image.Title, &image.Description, &image.Position) if err != nil { formatError(w, ErrorData{http.StatusInternalServerError, user, r.URL, err}, "html") diff --git a/frontend/page_image_detail.go b/frontend/page_image_detail.go index 2f2fa1e75a965f37d5d14f2e32f0d232017604d1..97f59ad159cc0fa7cdae53f39f9651da6cd95649 100644 --- a/frontend/page_image_detail.go +++ b/frontend/page_image_detail.go @@ -10,7 +10,7 @@ import ( ) type ImageDetailData struct { - User UserInfo + User shared.UserInfo Image shared.Image IsMine bool BaseUrl string @@ -18,18 +18,18 @@ type ImageDetailData struct { func pageImageDetail(env PageEnvironment) http.Handler { return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { - user := parseUser(r) + user := shared.ParseUser(r) _, imageId := path.Split(r.URL.Path) result, err := env.Database.Query(` SELECT id, owner, - coalesce(title, ''), - coalesce(description, ''), - coalesce(created_at, to_timestamp(0)), - coalesce(original_name, ''), - coalesce(type, '') + title, + description, + created_at, + original_name, + type FROM images WHERE id = $1 `, imageId) diff --git a/frontend/page_image_list.go b/frontend/page_image_list.go index 9a68e96f3883c3287cceeb0a460857c8134b878d..583e3deebb45b5947280bc9b3d011e1796d0826a 100644 --- a/frontend/page_image_list.go +++ b/frontend/page_image_list.go @@ -9,7 +9,7 @@ import ( ) type ImageListData struct { - User UserInfo + User shared.UserInfo Images []shared.Image Previous int64 Current int64 @@ -18,16 +18,16 @@ type ImageListData struct { const PageSize = 30 -func paginateImageListQuery(env PageEnvironment, user UserInfo, offset int64, pageSize int) (*sql.Rows, error) { +func paginateImageListQuery(env PageEnvironment, user shared.UserInfo, offset int64, pageSize int) (*sql.Rows, error) { if offset == 0 { return env.Database.Query(` SELECT id, - coalesce(title, ''), - coalesce(description, ''), - coalesce(created_at, to_timestamp(0)), - coalesce(original_name, ''), - coalesce(type, '') + title, + description, + created_at, + original_name, + type FROM images WHERE owner = $1 ORDER BY created_at DESC @@ -37,11 +37,11 @@ func paginateImageListQuery(env PageEnvironment, user UserInfo, offset int64, pa return env.Database.Query(` SELECT id, - coalesce(title, ''), - coalesce(description, ''), - coalesce(created_at, to_timestamp(0)), - coalesce(original_name, ''), - coalesce(type, '') + title, + description, + created_at, + original_name, + type FROM images WHERE owner = $1 ORDER BY created_at DESC @@ -53,7 +53,7 @@ func paginateImageListQuery(env PageEnvironment, user UserInfo, offset int64, pa func pageImageList(ctx PageEnvironment) http.Handler { return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { - user := parseUser(r) + user := shared.ParseUser(r) _, page := path.Split(r.URL.Path) var pageNumber int64 pageNumber, err := strconv.ParseInt(page, 10, 64) diff --git a/frontend/page_upload.go b/frontend/page_upload.go index 53218aa7f8b2b056a9eeaf40579572f65e38e78e..562a401299abd75b55d587dfc051f0ac0948d6e2 100644 --- a/frontend/page_upload.go +++ b/frontend/page_upload.go @@ -17,7 +17,7 @@ import ( type UploadData struct { BaseUrl string - User UserInfo + User shared.UserInfo } func detectMimeType(path string) (string, error) { @@ -35,11 +35,13 @@ func detectMimeType(path string) (string, error) { return http.DetectContentType(buffer), nil } -func generateId() string { +func generateId() (string, error) { buffer := make([]byte, 4) - rand.Read(buffer) + if _, err := rand.Read(buffer); err != nil { + return "", err + } - return base64.URLEncoding.WithPadding(base64.NoPadding).EncodeToString(buffer) + return base64.URLEncoding.WithPadding(base64.NoPadding).EncodeToString(buffer), nil } func writeBody(reader io.ReadCloser, path string) error { @@ -57,11 +59,13 @@ func writeBody(reader io.ReadCloser, path string) error { } func createImage(config *shared.Config, body io.ReadCloser, fileHeader *multipart.FileHeader) (shared.Image, error) { - id := generateId() + id, err := generateId() + if err != nil { + return shared.Image{}, err + } path := filepath.Join(config.SourceFolder, id) - err := writeBody(body, path) - if err != nil { + if err := writeBody(body, path); err != nil { return shared.Image{}, err } @@ -82,7 +86,7 @@ func createImage(config *shared.Config, body io.ReadCloser, fileHeader *multipar func pageUpload(env PageEnvironment) http.Handler { return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { if r.Method == "POST" { - user := parseUser(r) + user := shared.ParseUser(r) err := r.ParseMultipartForm(32 << 20) if err != nil { @@ -135,7 +139,7 @@ func pageUpload(env PageEnvironment) http.Handler { } return } else { - user := parseUser(r) + user := shared.ParseUser(r) if err := formatTemplate(w, "upload.html", UploadData{ env.Config.BaseUrl, user, diff --git a/frontend/model.go b/shared/model.go similarity index 58% rename from frontend/model.go rename to shared/model.go index 8186f6032ea0141aa1d72e51faa7bb7566cd8fc0..2df5c5902b42162bd0a15c482cbbfbd87aca5ee7 100644 --- a/frontend/model.go +++ b/shared/model.go @@ -1,6 +1,7 @@ -package main +package shared import ( + "git.kuschku.de/justjanne/imghost/imgconv" "net/http" "strings" "time" @@ -13,7 +14,7 @@ type UserInfo struct { Roles []string } -func parseUser(r *http.Request) UserInfo { +func ParseUser(r *http.Request) UserInfo { return UserInfo{ r.Header.Get("X-Auth-Subject"), r.Header.Get("X-Auth-Username"), @@ -31,6 +32,22 @@ func (info UserInfo) HasRole(role string) bool { return false } +type Result struct { + Id string `json:"id"` + Success bool `json:"success"` + Errors []string `json:"errors"` + Metadata imgconv.Metadata `json:"metadata"` +} + +type Image struct { + Id string `json:"id"` + Title string + Description string + CreatedAt time.Time + OriginalName string + MimeType string `json:"mimeType"` +} + type AlbumImage struct { Id string Title string diff --git a/shared/types.go b/shared/types.go deleted file mode 100644 index 017ce8f6dda9e03c40bd6b7e3661adbfee163ab7..0000000000000000000000000000000000000000 --- a/shared/types.go +++ /dev/null @@ -1,22 +0,0 @@ -package shared - -import ( - "git.kuschku.de/justjanne/imghost/imgconv" - "time" -) - -type Image struct { - Id string `json:"id"` - Title string - Description string - CreatedAt time.Time - OriginalName string - MimeType string `json:"mimeType"` -} - -type Result struct { - Id string `json:"id"` - Success bool `json:"success"` - Errors []string `json:"errors"` - Metadata imgconv.Metadata `json:"metadata"` -}