Handler is no longer passed as argument into routes etc but initialized in the Init() and stored into auth.DefaultJwtHandler.
86 lines
1.8 KiB
Go
86 lines
1.8 KiB
Go
package service
|
|
|
|
import (
|
|
"context"
|
|
"fmt"
|
|
"log"
|
|
"net"
|
|
"net/http"
|
|
|
|
"github.com/pkg/errors"
|
|
"github.com/titpetric/factory/resputil"
|
|
|
|
"github.com/crusttech/crust/internal/auth"
|
|
"github.com/crusttech/crust/internal/db"
|
|
"github.com/crusttech/crust/internal/mail"
|
|
"github.com/crusttech/crust/internal/metrics"
|
|
migrate "github.com/crusttech/crust/messaging/db"
|
|
"github.com/crusttech/crust/messaging/internal/service"
|
|
)
|
|
|
|
func Init(ctx context.Context) (err error) {
|
|
// validate configuration
|
|
if err = flags.Validate(); err != nil {
|
|
return err
|
|
}
|
|
|
|
mail.SetupDialer(flags.smtp)
|
|
|
|
if err = InitDatabase(ctx); err != nil {
|
|
return err
|
|
}
|
|
|
|
// configure resputil options
|
|
resputil.SetConfig(resputil.Options{
|
|
Pretty: flags.http.Pretty,
|
|
Trace: flags.http.Tracing,
|
|
Logger: func(err error) {
|
|
// @todo: error logging
|
|
},
|
|
})
|
|
|
|
// Use JWT secret for hmac signer for now
|
|
auth.DefaultSigner = auth.HmacSigner(flags.jwt.Secret)
|
|
auth.DefaultJwtHandler, err = auth.JWT(flags.jwt.Secret, flags.jwt.Expiry)
|
|
if err != nil {
|
|
return
|
|
}
|
|
|
|
// Don't change this, it needs Database
|
|
service.Init()
|
|
|
|
return nil
|
|
}
|
|
|
|
func InitDatabase(ctx context.Context) error {
|
|
// start/configure database connection
|
|
db, err := db.TryToConnect(ctx, "messaging", flags.db.DSN, flags.db.Profiler)
|
|
if err != nil {
|
|
return errors.Wrap(err, "could not connect to database")
|
|
}
|
|
|
|
// migrate database schema
|
|
if err := migrate.Migrate(db); err != nil {
|
|
return err
|
|
}
|
|
|
|
return nil
|
|
}
|
|
|
|
func StartRestAPI(ctx context.Context) error {
|
|
log.Println("Starting http server on address " + flags.http.Addr)
|
|
listener, err := net.Listen("tcp", flags.http.Addr)
|
|
if err != nil {
|
|
return errors.Wrap(err, fmt.Sprintf("Can't listen on addr %s", flags.http.Addr))
|
|
}
|
|
|
|
if flags.monitor.Interval > 0 {
|
|
go metrics.NewMonitor(flags.monitor.Interval)
|
|
}
|
|
|
|
go http.Serve(listener, Routes(ctx))
|
|
<-ctx.Done()
|
|
|
|
return nil
|
|
}
|