databag/net/server/main.go
2024-06-05 18:41:42 -07:00

91 lines
2.7 KiB
Go

package main
import (
app "databag/internal"
"databag/internal/store"
"github.com/gorilla/handlers"
webpush "github.com/SherClockHolmes/webpush-go"
"gorm.io/gorm"
"gorm.io/gorm/clause"
"errors"
"log"
"net/http"
"os"
)
func main() {
var cert string
var key string
var transformPath string
port := ":443"
storePath := "/var/lib/databag"
webApp := "/opt/databag/"
args := os.Args[1:];
for i := 0; i + 1 < len(args); i += 2 {
if args[i] == "-s" {
storePath = args[i + 1]
} else if args[i] == "-w" {
webApp = args[i + 1]
} else if args[i] == "-p" {
port = ":" + args[i + 1]
} else if args[i] == "-c" {
cert = args[i + 1]
} else if args[i] == "-k" {
key = args[i + 1]
} else if args[i] == "-t" {
transformPath = args[i + 1]
}
}
store.SetPath(storePath, transformPath);
// setup vapid keys
var config store.Config
err := store.DB.Where("config_id = ?", app.CNFWebPrivateKey).First(&config).Error
if errors.Is(err, gorm.ErrRecordNotFound) {
privateKey, publicKey, err := webpush.GenerateVAPIDKeys()
if err != nil {
log.Fatal(err)
} else {
err = store.DB.Transaction(func(tx *gorm.DB) error {
if res := tx.Clauses(clause.OnConflict{
Columns: []clause.Column{{Name: "config_id"}},
DoUpdates: clause.AssignmentColumns([]string{"str_value"}),
}).Create(&store.Config{ConfigID: app.CNFWebPublicKey, StrValue: publicKey}).Error; res != nil {
return res
}
return nil
})
if err != nil {
log.Fatal(err);
}
err = store.DB.Transaction(func(tx *gorm.DB) error {
if res := tx.Clauses(clause.OnConflict{
Columns: []clause.Column{{Name: "config_id"}},
DoUpdates: clause.AssignmentColumns([]string{"str_value"}),
}).Create(&store.Config{ConfigID: app.CNFWebPrivateKey, StrValue: privateKey}).Error; res != nil {
return res
}
return nil
})
if err != nil {
log.Fatal(err);
}
}
}
router := app.NewRouter(webApp)
origins := handlers.AllowedOrigins([]string{"*"})
methods := handlers.AllowedMethods([]string{"GET", "HEAD", "POST", "PUT", "DELETE", "OPTIONS"})
if cert != "" && key != "" {
log.Printf("using args:" + " -s " + storePath + " -w " + webApp + " -p " + port[1:] + " -c " + cert + " -k " + key + " -t " + transformPath)
log.Fatal(http.ListenAndServeTLS(port, cert, key, handlers.CORS(origins, methods)(router)))
} else {
log.Printf("using args:" + " -s " + storePath + " -w " + webApp + " -p " + port[1:] + " -t " + transformPath)
log.Fatal(http.ListenAndServe(port, handlers.CORS(origins, methods)(router)))
}
}