diff --git a/Dockerfile b/Dockerfile index e5fb44da96b3fef9b31b75fd96428a1ba4b94a54..5bf0da9b49ff176b7ec17ccad7a575466af640b7 100644 --- a/Dockerfile +++ b/Dockerfile @@ -11,5 +11,5 @@ RUN CGO_ENABLED=false go build -a app . FROM alpine:3.7 WORKDIR / COPY --from=builder /go/src/app/app /app -COPY --from=builder /go/src/app/static /static +COPY --from=builder /go/src/app/templates /templates CMD ["/app"] \ No newline at end of file diff --git a/main.go b/main.go index bdb85aefb2934a04cb81c5757186d8084f9af187..d89ea0f87bebc746e7ff37fc97e7c43fa7b7cdfd 100644 --- a/main.go +++ b/main.go @@ -12,6 +12,8 @@ import ( "crypto/rand" "time" "database/sql" + _ "github.com/lib/pq" + "html/template" ) func writeBody(reader io.ReadCloser, path string) error { @@ -95,6 +97,20 @@ func printHeaders(r *http.Request) { } } +type UserInfo struct { + Id string + Name string + Email string +} + +func parseUser(r *http.Request) UserInfo { + return UserInfo{ + r.Header.Get("X-Auth-Subject"), + r.Header.Get("X-Auth-Username"), + r.Header.Get("X-Auth-Email"), + } +} + func main() { config := NewConfigFromEnv() @@ -108,12 +124,12 @@ func main() { panic(err) } - staticServer := http.FileServer(http.Dir("static/")) imageServer := http.FileServer(http.Dir(config.TargetFolder)) http.HandleFunc("/upload/", func(w http.ResponseWriter, r *http.Request) { - user := r.Header.Get("X-Auth-Id") if r.Method == "POST" { + user := parseUser(r) + r.ParseMultipartForm(32 << 20) file, _, err := r.FormFile("file") image, err := createImage(&config, file) @@ -126,7 +142,7 @@ func main() { return } - _, err = db.Exec("INSERT INTO images (id, owner) VALUES ($1, $2)", image.Id, user) + _, err = db.Exec("INSERT INTO images (id, owner) VALUES ($1, $2)", image.Id, user.Id) if err != nil { panic(err) } @@ -181,14 +197,79 @@ func main() { } } } else { - staticServer.ServeHTTP(w, r) + user := parseUser(r) + + type UploadData struct { + User UserInfo + } + + tmpl, err := template.New("upload").ParseFiles("templates/upload") + if err != nil { + panic(err) + } + err = tmpl.Execute(w, UploadData{ + user, + }) + if err != nil { + panic(err) + } + } + }) + + http.HandleFunc("/me/images/", func(w http.ResponseWriter, r *http.Request) { + user := parseUser(r) + + type ImageListData struct { + User UserInfo + Images []string + } + + result, err := db.Query("SELECT id FROM images WHERE owner = $1", user.Id) + if err != nil { + panic(err) + } + + var images []string + for result.Next() { + var id string + err := result.Scan(&id) + if err != nil { + panic(err) + } + images = append(images, id) + } + + tmpl, err := template.New("me_images").ParseFiles("templates/me_images") + if err != nil { + panic(err) + } + err = tmpl.Execute(w, ImageListData{ + user, + images, + }) + if err != nil { + panic(err) } }) http.Handle("/i/", http.StripPrefix("/i/", imageServer)) http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) { - printHeaders(r) - staticServer.ServeHTTP(w, r) + user := parseUser(r) + + type IndexData struct { + User UserInfo + } + + tmpl, err := template.New("index").ParseFiles("templates/index") + if err != nil { + panic(err) + } + err = tmpl.Execute(w, IndexData{ + user, + }) + if err != nil { + panic(err) + } }) err = http.ListenAndServe(":8080", nil) diff --git a/static/index.html b/static/index.html deleted file mode 100644 index 8025f96dc2023271dc97f9f5b84927934da5f3f4..0000000000000000000000000000000000000000 --- a/static/index.html +++ /dev/null @@ -1 +0,0 @@ -<html><a href="/upload/">Upload images</a></html> \ No newline at end of file diff --git a/static/index.pug b/static/index.pug deleted file mode 100644 index a9efe59eafde849c7e10a8ef0aa391638a26b31d..0000000000000000000000000000000000000000 --- a/static/index.pug +++ /dev/null @@ -1,3 +0,0 @@ -html - a(href="/upload/"). - Upload images \ No newline at end of file diff --git a/static/upload/index.html b/static/upload/index.html deleted file mode 100644 index 01cb74421a0320b6f90f0d6c696796fa004e006b..0000000000000000000000000000000000000000 --- a/static/upload/index.html +++ /dev/null @@ -1 +0,0 @@ -<html><form action="/upload/" method="POST" enctype="multipart/form-data"><input type="file" name="file"/><input type="submit"/></form></html> \ No newline at end of file diff --git a/static/upload/index.pug b/static/upload/index.pug deleted file mode 100644 index 00c790bb31b334e8d2b66307f9169faa0f192dde..0000000000000000000000000000000000000000 --- a/static/upload/index.pug +++ /dev/null @@ -1,4 +0,0 @@ -html - form(action="/upload/", method="POST" enctype="multipart/form-data") - input(type="file", name="file") - input(type="submit") \ No newline at end of file diff --git a/templates/index b/templates/index new file mode 100644 index 0000000000000000000000000000000000000000..858580743218cdf68a5b4dd3a0d59d52a2e5bcf8 --- /dev/null +++ b/templates/index @@ -0,0 +1,10 @@ +<!DOCTYPE html> + +{{ if .User.Id }} + <p>Welcome, {{ .User.Name }}</p> + <p> + <a href="/me/images">My Images</a> | + <a href="/me/albums">My Albums</a> | + <a href="/upload">Upload</a> + </p> +{{ end }} \ No newline at end of file diff --git a/templates/me_images b/templates/me_images new file mode 100644 index 0000000000000000000000000000000000000000..53061dd8f8f2ce842fe16037ea47b102208a5ec1 --- /dev/null +++ b/templates/me_images @@ -0,0 +1,14 @@ +<!DOCTYPE html> + +<p>Welcome, {{ .User.Name }}</p> +<p> + <a href="/me/images">My Images</a> | + <a href="/me/albums">My Albums</a> | + <a href="/upload">Upload</a> +</p> + +{{ range .Images }} + <a href="/i/{{ . }}"> + <img src="/i/{{ . }}t" > + </a> +{{ end }} \ No newline at end of file diff --git a/templates/upload b/templates/upload new file mode 100644 index 0000000000000000000000000000000000000000..7a4f1d0ecc09583c806e35aead1ee13d25ded113 --- /dev/null +++ b/templates/upload @@ -0,0 +1,13 @@ +<!DOCTYPE html> + +<p>Welcome, {{ .User.Name }}</p> +<p> + <a href="/me/images">My Images</a> | + <a href="/me/albums">My Albums</a> | + <a href="/upload">Upload</a> +</p> + +<form action="/upload/" method="POST" enctype="multipart/form-data"> + <input type="file" name="file"/> + <input type="submit"/> +</form> \ No newline at end of file