goshare/app/app.go

61 lines
869 B
Go
Raw Normal View History

2024-01-23 19:37:51 +00:00
package app
import (
"context"
"database/sql"
"fmt"
"log"
"time"
"net/http"
_ "modernc.org/sqlite"
)
const filePath = "goshare.db"
type App struct {
router http.Handler
db *sql.DB
}
func New() *App {
db, err := sql.Open("sqlite3", filePath)
if err != nil {
log.Fatalf("failed to open db: %s", err)
}
return &App{
db: db,
}
}
func (a *App) Start(ctx context.Context) error {
server := &http.Server{
Addr: ":5454",
Handler: a.router,
}
fmt.Println("Starting server")
ch := make(chan error, 1)
go func () {
err := server.ListenAndServe()
if err != nil {
ch <- fmt.Errorf("failed to start server: %w", err)
}
close(ch)
}()
select {
case err := <-ch:
return err
case <-ctx.Done():
timeout, cancel := context.WithTimeout(context.Background(), time.Second*10)
defer cancel()
return server.Shutdown(timeout)
}
}