blob: e170a73c41bd5efa209c3ac77f21e66a78ce01e9 [file] [log] [blame]
giolekva0f503aa2020-04-20 22:41:06 +04001package main
2
3import (
4 "flag"
5 "fmt"
6 "log"
7 "net/http"
giolekvafb52e0d2020-04-23 22:52:13 +04008 "net/http/httputil"
9 "net/url"
10 "text/template"
giolekva7c5a0672020-12-11 17:40:49 +040011
12 "github.com/bazelbuild/rules_go/go/tools/bazel"
giolekva0f503aa2020-04-20 22:41:06 +040013)
14
giolekvafb52e0d2020-04-23 22:52:13 +040015var port = flag.Int("port", 3000, "Port to listen on.")
giolekva4e284c52020-05-17 10:36:16 +040016var pcloudApiAddr = flag.String("pcloud_api_addr", "", "PCloud API Server address.")
giolekva0f503aa2020-04-20 22:41:06 +040017
18func handle_gallery(w http.ResponseWriter, r *http.Request) {
giolekva7c5a0672020-12-11 17:40:49 +040019 gallery_html, err := bazel.Runfile("apps/photos-ui/gallery.html")
20 if err != nil {
21 http.Error(w, err.Error(), http.StatusInternalServerError)
22 }
23 http.ServeFile(w, r, gallery_html)
giolekva0f503aa2020-04-20 22:41:06 +040024}
25
26func handle_photo(w http.ResponseWriter, r *http.Request) {
giolekvafb52e0d2020-04-23 22:52:13 +040027 err := r.ParseForm()
28 if err != nil {
29 http.Error(w, "Could not read query", http.StatusInternalServerError)
30 return
31 }
32 id, ok := r.Form["id"]
33 if !ok {
34 http.Error(w, "Photo id must be provided", http.StatusBadRequest)
35 return
36 }
giolekva7c5a0672020-12-11 17:40:49 +040037 photo_html, err := bazel.Runfile("apps/photos-ui/photo.html")
38 if err != nil {
39 http.Error(w, err.Error(), http.StatusInternalServerError)
40 }
41 t, err := template.ParseFiles(photo_html)
giolekvafb52e0d2020-04-23 22:52:13 +040042 if err != nil {
43 log.Print(err)
44 http.Error(w, "Could not process page", http.StatusInternalServerError)
45 return
46 }
47 err = t.Execute(w, struct{ Id string }{id[0]})
48 if err != nil {
49 log.Print(err)
50 http.Error(w, "Could not process page", http.StatusInternalServerError)
51 return
52 }
giolekva0f503aa2020-04-20 22:41:06 +040053}
54
giolekva4e284c52020-05-17 10:36:16 +040055func newGqlProxy(pcloudApiAddr string) *httputil.ReverseProxy {
56 u, err := url.Parse(pcloudApiAddr)
giolekvafb52e0d2020-04-23 22:52:13 +040057 if err != nil {
58 panic(err)
59 }
60 return httputil.NewSingleHostReverseProxy(u)
giolekva0f503aa2020-04-20 22:41:06 +040061}
62
63func main() {
64 flag.Parse()
giolekva7c5a0672020-12-11 17:40:49 +040065 static_dir, err := bazel.Runfile("apps/photos-ui/static")
66 if err != nil {
67 log.Fatal(err)
68 }
69 fs := http.FileServer(http.Dir(static_dir))
giolekva0f503aa2020-04-20 22:41:06 +040070 http.Handle("/static/", http.StripPrefix("/static/", fs))
giolekva4e284c52020-05-17 10:36:16 +040071 http.Handle("/graphql", newGqlProxy(*pcloudApiAddr))
giolekvafb52e0d2020-04-23 22:52:13 +040072 http.HandleFunc("/photo", handle_photo)
giolekva0f503aa2020-04-20 22:41:06 +040073 http.HandleFunc("/", handle_gallery)
74 log.Fatal(http.ListenAndServe(fmt.Sprintf(":%d", *port), nil))
75}