123 lines
3.1 KiB
Go
123 lines
3.1 KiB
Go
package routes
|
|
|
|
import (
|
|
"context"
|
|
"database/sql"
|
|
"encoding/json"
|
|
"net/http"
|
|
|
|
//"net/http"
|
|
|
|
"github.com/go-chi/chi/v5"
|
|
"github.com/go-chi/chi/v5/middleware"
|
|
_ "github.com/lib/pq"
|
|
httpSwagger "github.com/swaggo/http-swagger"
|
|
|
|
"github.com/jtom38/newsbot/collector/database"
|
|
"github.com/jtom38/newsbot/collector/domain/models"
|
|
"github.com/jtom38/newsbot/collector/services/config"
|
|
)
|
|
|
|
type Server struct {
|
|
Router *chi.Mux
|
|
Db *database.Queries
|
|
ctx *context.Context
|
|
}
|
|
|
|
var (
|
|
ErrIdValueMissing string = "id value is missing"
|
|
ErrValueNotUuid string = "a value given was expected to be a uuid but was not correct."
|
|
ErrNoRecordFound string = "no record was found."
|
|
ErrUnableToConvertToJson string = "Unable to convert to json"
|
|
)
|
|
|
|
func NewServer(ctx context.Context) *Server {
|
|
s := &Server{
|
|
ctx: &ctx,
|
|
}
|
|
|
|
db, err := openDatabase(ctx)
|
|
if err != nil {
|
|
panic(err)
|
|
}
|
|
s.Db = db
|
|
|
|
s.Router = chi.NewRouter()
|
|
s.MountMiddleware()
|
|
s.MountRoutes()
|
|
return s
|
|
}
|
|
|
|
func openDatabase(ctx context.Context) (*database.Queries, error) {
|
|
_env := config.New()
|
|
connString := _env.GetConfig(config.Sql_Connection_String)
|
|
db, err := sql.Open("postgres", connString)
|
|
if err != nil {
|
|
panic(err)
|
|
}
|
|
|
|
queries := database.New(db)
|
|
return queries, err
|
|
}
|
|
|
|
func (s *Server) MountMiddleware() {
|
|
s.Router.Use(middleware.Logger)
|
|
s.Router.Use(middleware.Recoverer)
|
|
//s.Router.Use(middleware.Heartbeat())
|
|
}
|
|
|
|
func (s *Server) MountRoutes() {
|
|
s.Router.Get("/swagger/*", httpSwagger.Handler(
|
|
httpSwagger.URL("doc.json"), //The url pointing to API definition
|
|
))
|
|
|
|
/* Root Routes */
|
|
//s.Router.Get("/api/helloworld", helloWorld)
|
|
//s.Router.Get("/api/hello/{who}", helloWho)
|
|
//s.Router.Get("/api/ping", ping)
|
|
|
|
/* Article Routes */
|
|
s.Router.Get("/api/articles", s.listArticles)
|
|
s.Router.Route("/api/articles/{ID}", func(r chi.Router) {
|
|
r.Get("/", s.getArticleById)
|
|
})
|
|
s.Router.Get("/api/articles/by/sourceid", s.GetArticlesBySourceId)
|
|
|
|
/* Queue */
|
|
s.Router.Mount("/api/queue", s.GetQueueRouter())
|
|
|
|
/* Discord WebHooks */
|
|
s.Router.Get("/api/discord/webhooks", s.GetDiscordWebHooks)
|
|
s.Router.Post("/api/discord/webhooks/new", s.NewDiscordWebHook)
|
|
//s.Router.Get("/api/discord/webhooks/byId", s.GetDiscordWebHooksById)
|
|
s.Router.Get("/api/discord/webhooks/by/serverAndChannel", s.GetDiscordWebHooksByServerAndChannel)
|
|
|
|
s.Router.Route("/api/discord/webhooks/{ID}", func(r chi.Router) {
|
|
r.Get("/", s.GetDiscordWebHooksById)
|
|
r.Delete("/", s.deleteDiscordWebHook)
|
|
r.Post("/disable", s.disableDiscordWebHook)
|
|
r.Post("/enable", s.enableDiscordWebHook)
|
|
})
|
|
|
|
/* Settings */
|
|
s.Router.Get("/api/settings", s.getSettings)
|
|
|
|
s.Router.Mount("/api/sources", s.GetSourcesRouter())
|
|
s.Router.Mount("/api/subscriptions", s.GetSubscriptionsRouter())
|
|
}
|
|
|
|
func (s *Server) WriteError(w http.ResponseWriter, errMessage string, HttpStatusCode int, Payload interface{}) {
|
|
e := models.ApiError{
|
|
Message: errMessage,
|
|
StatusCode: http.StatusInternalServerError,
|
|
Payload: nil,
|
|
}
|
|
|
|
b, err := json.Marshal(e)
|
|
if err != nil {
|
|
http.Error(w, err.Error(), http.StatusInternalServerError)
|
|
}
|
|
|
|
w.Write(b)
|
|
}
|