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
8 changes: 7 additions & 1 deletion Gopkg.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

23 changes: 21 additions & 2 deletions app/app.go
Original file line number Diff line number Diff line change
@@ -1,6 +1,9 @@
package app

import (
"html/template"
"path/filepath"

"github.com/Diminho/MK_practice/mk_session"

"github.com/Diminho/MK_practice/models"
Expand All @@ -19,9 +22,23 @@ type App struct {
SrvRootDir string
AbsSrvRootDir string
Manager *mk_session.Manager
Tmpl *template.Template
}

func NewApp(slog *simplelog.Log, fbConfigOauth *oauth2.Config, FBState string, SrvRootDir string, instance func() models.Database) *App {
func NewApp(slog *simplelog.Log, fbConfigOauth *oauth2.Config, FBState string, SrvRootDir string, instance func() models.Database) (*App, error) {

absSrvRootDir, err := filepath.Abs(SrvRootDir)

if err != nil {
slog.Error(err)
}

tmpl, err := ParseTemplates(absSrvRootDir)

if err != nil {
return nil, err
}

app := &App{
EventClients: make(map[string][]*websocket.Conn),
Broadcast: make(chan models.EventPlaces, 1),
Expand All @@ -31,7 +48,9 @@ func NewApp(slog *simplelog.Log, fbConfigOauth *oauth2.Config, FBState string, S
Slog: slog,
SrvRootDir: SrvRootDir,
Manager: mk_session.NewManager("sessionID", 60),
AbsSrvRootDir: absSrvRootDir,
Tmpl: tmpl,
}

return app
return app, err
}
32 changes: 21 additions & 11 deletions app/helpers.go
Original file line number Diff line number Diff line change
Expand Up @@ -7,24 +7,16 @@ import (
"net/http"
"os"
"path/filepath"
"strings"

"github.com/Diminho/MK_practice/models"

"github.com/Diminho/MK_practice/mk_session"
"github.com/gorilla/websocket"
)

func PopulateTemplate(data interface{}, w http.ResponseWriter, tmplFile string) {
tmpl, err := template.ParseFiles(tmplFile)

if err != nil {
fmt.Errorf("error %v", err)
}

if tmpl != nil {
tmpl.Execute(w, data)
}

func PopulateTemplate(tmpl *template.Template, data interface{}, w http.ResponseWriter, tmplName string) {
tmpl.ExecuteTemplate(w, tmplName, data)
}

func InStringSlice(input []string, needle string) bool {
Expand Down Expand Up @@ -106,3 +98,21 @@ func RemoveContents(dir string) error {
}
return nil
}

func ParseTemplates(dir string) (*template.Template, error) {
var err error
tmpl := template.New("")
err = filepath.Walk(dir, func(path string, info os.FileInfo, err error) error {
if strings.Contains(path, ".html") {
_, err = tmpl.ParseFiles(path)

if err != nil {
return err
}
}

return err
})

return tmpl, err
}
36 changes: 22 additions & 14 deletions main.go
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package main

import (
"context"
"fmt"
"log"
"os"
Expand All @@ -15,7 +16,8 @@ import (
)

func main() {
// os.RemoveAll("/tmp/")
ctx, cancel := context.WithCancel(context.Background())
defer cancel()
file, err := os.OpenFile("log.txt", os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0666)
if err != nil {
log.Fatal("Failed to open log file: ", err)
Expand All @@ -30,21 +32,27 @@ func main() {
slog := simplelog.NewLog(file)

db, err := models.Connect(config.Driver, fmt.Sprintf("%s:@%s/%s", config.User, config.Host, config.DbName))

if err != nil {
slog.Fatal(err)
}

app, err := app.NewApp(
slog,
&oauth2.Config{
ClientID: config.ClientID,
ClientSecret: config.ClientSecret,
RedirectURL: config.RedirectURL,
Scopes: config.Scopes,
Endpoint: config.Endpoint,
},
config.FBState,
config.ServerRootDir,
db.Instance())

if err != nil {
slog.Fatal(err)
}

mk_server.NewServer(
app.NewApp(
slog,
&oauth2.Config{
ClientID: config.ClientID,
ClientSecret: config.ClientSecret,
RedirectURL: config.RedirectURL,
Scopes: config.Scopes,
Endpoint: config.Endpoint,
},
config.FBState,
config.ServerRootDir,
db.Instance()))
mk_server.NewServer(ctx, app)
}
32 changes: 14 additions & 18 deletions mk_server/mk_server.go
Original file line number Diff line number Diff line change
Expand Up @@ -10,10 +10,10 @@ import (
"net/url"
"os"
"os/signal"
"path/filepath"
"strings"
"sync"
"syscall"
"time"

"github.com/Diminho/MK_practice/app"
"github.com/Diminho/MK_practice/models"
Expand All @@ -33,24 +33,21 @@ var upgrader = websocket.Upgrader{
},
}

func NewServer(app *app.App) {

func NewServer(ctx context.Context, app *app.App) {
ctx, cancel := context.WithCancel(ctx)
wApp := &WraperApp{app}

s := &http.Server{Addr: ":8000", Handler: LoadRoutes(wApp)}

go wApp.handlePlaceBookings()

ctx, cancel := context.WithCancel(context.Background())

go func() {
wApp.Slog.Info("Server running on port :8000")

if err := s.ListenAndServe(); err != http.ErrServerClosed {
wApp.Slog.Error(err)
cancel()

}
cancel()
}()
var gracefulShut = make(chan os.Signal, 1)
signal.Notify(gracefulShut, os.Interrupt, syscall.SIGTERM)
Expand All @@ -65,30 +62,29 @@ func NewServer(app *app.App) {
}

func (wApp *WraperApp) graceful(ctx context.Context, hs *http.Server, slog *simplelog.Log) {
for event := range wApp.EventClients {
for _, client := range wApp.EventClients[event] {
ctx, cancel := context.WithTimeout(ctx, 5*time.Second)
defer cancel()

for _, events := range wApp.EventClients {
for _, client := range events {
if err := client.Close(); err != nil {
slog.Error(err)
}
}
delete(wApp.EventClients, event)
}

if err := hs.Shutdown(ctx); err != nil {
slog.Error(err)
}
app.RemoveContents("./tmp/")

close(wApp.Broadcast)
app.RemoveContents(os.TempDir())

slog.Info("Server stopped")
}

func LoadRoutes(wApp *WraperApp) http.Handler {
absSrvRootDir, err := filepath.Abs(wApp.SrvRootDir)
if err != nil {
wApp.Slog.Error(err)
}
//need this assignemt since wApp.AbsSrvRootDir is used in application
wApp.AbsSrvRootDir = absSrvRootDir

fs := http.FileServer(http.Dir(wApp.AbsSrvRootDir))
mux := http.NewServeMux()
mux.Handle("/", fs)
Expand Down Expand Up @@ -213,7 +209,7 @@ func (wApp *WraperApp) handleEvent(w http.ResponseWriter, r *http.Request) {
tmplData.UserInfo["id"] = user.ID
}

app.PopulateTemplate(tmplData, w, fmt.Sprintf("%s/event.html", wApp.AbsSrvRootDir))
app.PopulateTemplate(wApp.Tmpl, tmplData, w, "event")
}

func (wApp *WraperApp) handleConnections(w http.ResponseWriter, r *http.Request) {
Expand Down
Loading