Skip to content
Snippets Groups Projects
Select Git revision
  • eb90c0a68e75bb19754c16e97c593521251b3915
  • main default protected
2 results

server.go

Blame
  • user avatar
    Kevin Lyda authored
    eb90c0a6
    History
    user avatar eb90c0a6
    server.go 1.74 KiB
    // Package server implements the server.
    package server
    
    import (
    	"context"
    	"database/sql"
    	"fmt"
    
    	// The sqlite db and migration driver.
    	_ "github.com/golang-migrate/migrate/v4/database/sqlite"
    
    	"git.lyda.ie/kevin/boxes/api"
    	"git.lyda.ie/kevin/boxes/database"
    	"github.com/golang-migrate/migrate/v4"
    	"github.com/golang-migrate/migrate/v4/source/iofs"
    	"github.com/labstack/echo/v4"
    	"github.com/labstack/echo/v4/middleware"
    	"github.com/spf13/cobra"
    	"modernc.org/sqlite"
    )
    
    // Run starts the metrics and API servers.
    func Run(cmd *cobra.Command, _ []string) {
    	// Get configuration and basic pieces.
    	listen, err := cmd.Flags().GetString("listen")
    	cobra.CheckErr(err)
    	dbfile, err := cmd.Flags().GetString("database")
    	cobra.CheckErr(err)
    
    	// Get the web server up.
    	e := echo.New()
    	e.Use(middleware.LoggerWithConfig(middleware.LoggerConfig{}))
    
    	// Connect and configure the database.
    	// See https://theitsolutions.io/blog/modernc.org-sqlite-with-go
    	const pragmas = `
    	PRAGMA foreign_keys = ON;
    `
    	ctx := context.TODO()
    	sqlite.RegisterConnectionHook(func(conn sqlite.ExecQuerierContext, _ string) error {
    		_, err = conn.ExecContext(ctx, pragmas, nil)
    
    		return err
    	})
    
    	migrationFS, err := iofs.New(database.MigrationsFS, "migrations")
    	cobra.CheckErr(err)
    	migration, err := migrate.NewWithSourceInstance("iofs", migrationFS, "sqlite://"+dbfile)
    	cobra.CheckErr(err)
    	err = migration.Up()
    	if err != nil && err != migrate.ErrNoChange {
    		cobra.CheckErr(err)
    	}
    
    	db, err := sql.Open("sqlite", dbfile)
    	cobra.CheckErr(err)
    
    	// Get the endpoint handler set up.
    	endpoints := NewEndpoints(db)
    	server := api.NewStrictHandler(endpoints, nil)
    	api.RegisterHandlers(e, server)
    
    	// Put it all together.
    	fmt.Printf("Server exited with: %+v\n", e.Start(listen))
    }