Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
14 changes: 8 additions & 6 deletions services/gui/Dockerfile
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
FROM node:alpine
FROM golang:alpine
LABEL maintainer="[email protected]"
LABEL service="moveezgui"

Expand All @@ -9,15 +9,17 @@ ENV RELEASE ${RELEASE}
# working directory for moveez
WORKDIR /usr/src/app

# install dependencies from package.json, but no dev
COPY package*.json ./
RUN npm install --only=prod --no-optional
# install dependencies from go.mod
COPY go.mod ./
RUN go mod download

# bundle app source
# TODO: remove unncessary files like test directory
COPY . .

# build the Go application
RUN go build -o main .

EXPOSE 80

# start moveez
CMD [ "npm", "start" ]
CMD ["./main"]
39 changes: 38 additions & 1 deletion services/gui/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -22,4 +22,41 @@ Access the moveez app page on https://developers.facebook.com. Go to settings >
Then either:
- Paste it as services/gui/facebook/app_secret
- Alternatively the facebook app secret can be provided as environment variable FACEBOOK_APP_SECRET
- in production we need a secret called `moveez-prod-facebook` containing the base64 encoded app secret string as value `appsecret`
- in production we need a secret called `moveez-prod-facebook` containing the base64 encoded app secret string as value `appsecret`

# Dependencies and Build Instructions

## Dependencies

- Go 1.16 or later
- Docker
- Facebook App Secret

## Build Instructions

1. Clone the repository:
```
git clone https://github.com/schdief/moveez.git
cd moveez
```

2. Build the Go application:
```
cd services/gui
go build -o main .
```

3. Run the application:
```
./main
```

4. Build the Docker image:
```
docker build -t moveezgui .
```

5. Run the Docker container:
```
docker run -p 80:80 moveezgui
```
105 changes: 105 additions & 0 deletions services/gui/app/app.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,105 @@
package main

import (
"database/sql"
"fmt"
"log"
"net/http"
"os"

"github.com/gorilla/mux"
"github.com/gorilla/pat"
"github.com/gorilla/sessions"
_ "github.com/lib/pq"
)

var (
db *sql.DB
store *sessions.CookieStore
sessionName = "moveez-session"
)

func main() {
// Database connection
var err error
dbUser := os.Getenv("DB_USER")
dbPassword := os.Getenv("DB_PASS")
dbHost := os.Getenv("DB_HOST")
dbPort := os.Getenv("DB_PORT")
dbName := os.Getenv("DB_NAME")
dbConnectionString := fmt.Sprintf("postgres://%s:%s@%s:%s/%s?sslmode=disable", dbUser, dbPassword, dbHost, dbPort, dbName)

db, err = sql.Open("postgres", dbConnectionString)
if err != nil {
log.Fatalf("Error opening database: %q", err)
}
defer db.Close()

// Session store
sessionSecret := os.Getenv("SESSION_SECRET")
store = sessions.NewCookieStore([]byte(sessionSecret))

// Router
r := mux.NewRouter()

// Routes
r.HandleFunc("/", landingPageHandler).Methods("GET")
r.HandleFunc("/health", healthHandler).Methods("GET")
r.HandleFunc("/impressum", impressumHandler).Methods("GET")
r.HandleFunc("/title", ensureLoggedIn(getTitlesHandler)).Methods("GET")
r.HandleFunc("/title", ensureLoggedIn(postTitleHandler)).Methods("POST")
r.HandleFunc("/title/{id}", ensureLoggedIn(getTitleHandler)).Methods("GET")
r.HandleFunc("/title/{id}", ensureLoggedIn(updateTitleHandler)).Methods("PUT")
r.HandleFunc("/title/{id}", ensureLoggedIn(deleteTitleHandler)).Methods("DELETE")

// Start server
port := os.Getenv("PORT")
if port == "" {
port = "80"
}
log.Printf("Starting server on port %s", port)
log.Fatal(http.ListenAndServe(":"+port, r))
}

func ensureLoggedIn(next http.HandlerFunc) http.HandlerFunc {
return func(w http.ResponseWriter, r *http.Request) {
session, _ := store.Get(r, sessionName)
if session.Values["user"] == nil {
http.Redirect(w, r, "/", http.StatusFound)
return
}
next.ServeHTTP(w, r)
}
}

func landingPageHandler(w http.ResponseWriter, r *http.Request) {
// Implement landing page handler
}

func healthHandler(w http.ResponseWriter, r *http.Request) {
w.WriteHeader(http.StatusOK)
}

func impressumHandler(w http.ResponseWriter, r *http.Request) {
// Implement impressum handler
}

func getTitlesHandler(w http.ResponseWriter, r *http.Request) {
// Implement get titles handler
}

func postTitleHandler(w http.ResponseWriter, r *http.Request) {
// Implement post title handler
}

func getTitleHandler(w http.ResponseWriter, r *http.Request) {
// Implement get title handler
}

func updateTitleHandler(w http.ResponseWriter, r *http.Request) {
// Implement update title handler
}

func deleteTitleHandler(w http.ResponseWriter, r *http.Request) {
// Implement delete title handler
}
118 changes: 0 additions & 118 deletions services/gui/app/app.js

This file was deleted.

24 changes: 24 additions & 0 deletions services/gui/app/controllers/impressum.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
package controllers

import (
"net/http"
"text/template"
)

func Impressum(w http.ResponseWriter, r *http.Request) {
username := ""
if user, ok := r.Context().Value("user").(string); ok {
username = user
}
tmpl, err := template.ParseFiles("views/impressum/index.html")
if err != nil {
http.Error(w, err.Error(), http.StatusInternalServerError)
return
}
data := struct {
Username string
}{
Username: username,
}
tmpl.Execute(w, data)
}
9 changes: 0 additions & 9 deletions services/gui/app/controllers/impressum.js

This file was deleted.

14 changes: 14 additions & 0 deletions services/gui/app/controllers/landingPage.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
package controllers

import (
"net/http"
)

func LandingPage(w http.ResponseWriter, r *http.Request) {
if r.Header.Get("Accept") == "application/json" {
w.Header().Set("Content-Type", "application/json")
w.Write([]byte(`{"message": "Welcome to ` + os.Getenv("RELEASE") + `!"}`))
return
}
http.ServeFile(w, r, "views/landingPage/index.html")
}
11 changes: 0 additions & 11 deletions services/gui/app/controllers/landingPage.js

This file was deleted.

Loading