Files
houston-be/cmd/app/server.go
Abhijeet Gupta 12ce39cb77 Revert "TP-0000 | middleware (#41)" (#42)
This reverts commit 3713b793a3.
2023-04-27 00:03:32 +05:30

174 lines
5.2 KiB
Go

package app
import (
"fmt"
"houston/cmd/app/handler"
"houston/pkg/slackbot"
"houston/service"
"net/http"
"strconv"
"strings"
"time"
"houston/internal/clients"
"houston/internal/metrics"
"github.com/gin-gonic/gin"
"github.com/spf13/viper"
"go.uber.org/zap"
"gorm.io/gorm"
)
type Server struct {
gin *gin.Engine
logger *zap.Logger
db *gorm.DB
mjolnirClient *clients.MjolnirClient
}
func NewServer(gin *gin.Engine, logger *zap.Logger, db *gorm.DB, mjolnirClient *clients.MjolnirClient) *Server {
return &Server{
gin: gin,
logger: logger,
db: db,
mjolnirClient: mjolnirClient,
}
}
func (s *Server) Handler() {
s.readinessHandler()
s.incidentClientHandler()
s.gin.Use(s.createMiddleware())
s.teamHandler()
s.severityHandler()
s.incidentHandler()
s.usersHandler()
s.filtersHandler()
metrics.AdminHandler()
//this should always be at the end since it opens websocket to connect to slackbot
s.houstonHandler()
}
func (s *Server) createMiddleware() gin.HandlerFunc {
return func(c *gin.Context) {
whitelistedDomains := getWhitelistedDomains()
//auth handling
isAuthEnabled := viper.GetBool("auth.enabled")
if isAuthEnabled {
sessionResponse, err := s.mjolnirClient.GetSessionResponse(c.Request.Header.Get("X-Session-Token"))
if err != nil || sessionResponse.StatusCode == 401 {
c.AbortWithStatus(http.StatusUnauthorized)
return
}
}
//cors handling
c.Writer.Header().Set("Access-Control-Allow-Methods", "POST, OPTIONS, GET, PUT")
c.Writer.Header().Set("Access-Control-Allow-Headers", viper.GetString("allowed.custom.headers"))
origin := c.Request.Header.Get("Origin")
if !whitelistedDomains[origin] {
c.AbortWithStatus(http.StatusUnauthorized)
return
}
c.Writer.Header().Set("Access-Control-Allow-Origin", origin)
if c.Request.Method == "OPTIONS" {
c.AbortWithStatus(http.StatusOK)
return
}
startTime := time.Now()
c.Next()
endTime := float64(time.Since(startTime))
//metrics publishing
status := strconv.Itoa(c.Writer.Status())
metrics.HoustonApiRequestCounter.WithLabelValues(c.Request.URL.Path, c.Request.Method, status).Inc()
metrics.HoustonApiRequestLatencySum.WithLabelValues(c.Request.URL.Path, c.Request.Method, status).Add(endTime)
metrics.HoustonApiRequestLatencyHistogram.WithLabelValues(c.Request.URL.Path, c.Request.Method, status).Observe(endTime)
metrics.HoustonApiRequestLatencySummary.WithLabelValues(c.Request.URL.Path, c.Request.Method, status).Observe(endTime)
}
}
func getWhitelistedDomains() map[string]bool {
allowedList := make(map[string]bool)
domains := strings.Split(viper.GetString("whitelisted.domains"), ",")
for _, domain := range domains {
domainLocal := domain
allowedList[domainLocal] = true
}
return allowedList
}
func (s *Server) houstonHandler() {
houstonClient := NewHoustonClient(s.logger)
houstonHandler := handler.NewSlackHandler(s.logger, s.db, houstonClient.socketModeClient)
houstonHandler.HoustonConnect()
}
func (s *Server) teamHandler() {
houstonClient := NewHoustonClient(s.logger)
slackClient := slackbot.NewSlackClient(s.logger, houstonClient.socketModeClient)
teamHandler := service.NewTeamService(s.gin, s.logger, s.db, slackClient)
s.gin.GET("/teams", teamHandler.GetTeams)
s.gin.GET("/teams/:id", teamHandler.GetTeams)
s.gin.POST("/teams", teamHandler.UpdateTeam)
}
func (s *Server) severityHandler() {
houstonClient := NewHoustonClient(s.logger)
slackClient := slackbot.NewSlackClient(s.logger, houstonClient.socketModeClient)
severityHandler := service.NewSeverityService(s.gin, s.logger, s.db, slackClient)
s.gin.GET("/severities", severityHandler.GetSeverities)
s.gin.GET("/severities/:id", severityHandler.GetSeverities)
s.gin.POST("/severities", severityHandler.UpdateSeverities)
}
func (s *Server) incidentClientHandler() {
houstonClient := NewHoustonClient(s.logger)
incidentHandler := service.NewIncidentService(s.gin, s.logger, s.db, houstonClient.socketModeClient)
s.gin.POST("/create-incident", incidentHandler.CreateIncident)
}
func (s *Server) incidentHandler() {
houstonClient := NewHoustonClient(s.logger)
incidentHandler := service.NewIncidentService(s.gin, s.logger, s.db, houstonClient.socketModeClient)
s.gin.GET("/incidents", incidentHandler.GetIncidents)
s.gin.GET("/incidents/:id", incidentHandler.GetIncidents)
s.gin.POST("/incidents", incidentHandler.UpdateIncident)
s.gin.GET("/incidents/header", incidentHandler.GetIncidentHeader)
}
func (s *Server) usersHandler() {
houstonClient := NewHoustonClient(s.logger)
slackClient := slackbot.NewSlackClient(s.logger, houstonClient.socketModeClient)
usersHandler := service.NewUserService(s.gin, s.logger, slackClient)
s.gin.GET("/users/:id", usersHandler.GetUserInfo)
s.gin.GET("/users", usersHandler.GetUsersInConversation)
}
func (s *Server) filtersHandler() {
filtersHandler := service.NewFilterService(s.gin, s.logger, s.db)
s.gin.GET("/filters", filtersHandler.GetFilters)
}
func (s *Server) readinessHandler() {
readinessHandler := service.NewReadinessService(s.gin)
s.gin.GET("/ping", readinessHandler.Ping)
}
func (s *Server) Start() {
s.logger.Info("starting houston server", zap.String("port", viper.GetString("port")))
s.gin.Run(fmt.Sprintf(":%v", "8080"))
}