tauraamui/bluepanda

View on GitHub
internal/service/http_service.go

Summary

Maintainability
A
0 mins
Test Coverage
// Copyright (c) 2023 Adam Prakash Stringer
// All rights reserved.
//
// Redistribution and use in source and binary forms, with or without
// modification, are permitted (subject to the limitations in the disclaimer
// below) provided that the following conditions are met:
//
//     * Redistributions of source code must retain the above copyright notice,
//     this list of conditions and the following disclaimer.
//
//     * Redistributions in binary form must reproduce the above copyright
//     notice, this list of conditions and the following disclaimer in the
//     documentation and/or other materials provided with the distribution.
//
//     * Neither the name of the copyright holder nor the names of its
//     contributors may be used to endorse or promote products derived from this
//     software without specific prior written permission.
//
// NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE GRANTED BY
// THIS LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
// CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
// PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
// EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
// BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
// IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
// POSSIBILITY OF SUCH DAMAGE.

package service

import (
    "os"
    "path/filepath"
    "strings"
    "time"

    "github.com/dgraph-io/badger/v3"
    "github.com/gofiber/fiber/v2"
    "github.com/tauraamui/bluepanda/internal/logging"
    "github.com/tauraamui/bluepanda/pkg/kvs"
)

type Server interface {
    Type() string
    Listen(port string) error
    Shutdown() error
    ShutdownWithTimeout(d time.Duration) error
    Cleanup(log logging.Logger) error
}

type server struct {
    db  kvs.KVDB
    app *fiber.App
}

func NewHTTP(log logging.Logger) (Server, error) {
    parentDir, err := os.UserConfigDir()
    if err != nil {
        return nil, err
    }

    conn, err := badger.Open(badger.DefaultOptions(filepath.Join(parentDir, "bluepanda", "data")).WithLogger(nil))
    if err != nil {
        return nil, err
    }

    db, err := kvs.NewKVDB(conn)
    if err != nil {
        return nil, err
    }

    svr := server{
        db:  db,
        app: fiber.New(fiber.Config{DisableStartupMessage: true}),
    }

    svr.app.Post("/insert/:type/:uuid", handleInserts(log, db, PKS{}))
    svr.app.Post("/fetch/:type/:uuid", handleFetch(log, db))

    return svr, nil
}

func (s server) Type() string {
    return "HTTP"
}

func (s server) Listen(port string) error {
    return s.app.Listen(port)
}

func (s server) Cleanup(log logging.Logger) error {
    dbg := strings.Builder{}
    s.db.DumpTo(&dbg)
    log.Debug().Msg(dbg.String())
    s.db.Close()
    return nil
}

func (s server) Shutdown() error {
    return s.app.Shutdown()
}

func (s server) ShutdownWithTimeout(d time.Duration) error {
    return s.app.ShutdownWithTimeout(d)
}