Brijesh's Git Server — watchman @ 9d309b4532c566f9be86d545f8e4cd8791a4ee8c

observability tool, needs to be rewritten once identity is stable

main.go (view raw)

 1
 2
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
 100
 101
 102
 103
 104
 105
 106
 107
 108
 109
 110
 111
 112
 113
 114
 115
 116
 117
 118
 119
 120
 121
 122
 123
 124
 125
 126
package main

import (
	"database/sql"
	"fmt"
	"log"
	"net/http"
	"watchman/internal"
	"watchman/middleware"
	"watchman/utils"

	_ "github.com/mattn/go-sqlite3"
)

const (
	RED          = "\033[31m"
	RESET_COLOUR = "\033[0m"
)

func init() {
	env_vars := []string{"PORT"}

	for _, env_var := range env_vars {
		if !utils.Verify_ENV_Exists(env_var) {
			log.Fatal(RED + "Error: " + env_var + " not found in .env file" + RESET_COLOUR)
		}
	}
}

func main() {
	port := utils.Load_ENV("PORT")

	db_connection, err := sql.Open("sqlite3", "./watchman.db")
	if err != nil {
		panic(err)
	}
	defer db_connection.Close()

	multiplexer := http.NewServeMux()

	multiplexer.HandleFunc("/health", utils.Health_Check_Handler)

	multiplexer.HandleFunc("/project", func(w http.ResponseWriter, r *http.Request) {
		switch r.Method {
		case http.MethodGet:
			internal.GetProjectByID(w, r, db_connection)
		default:
			utils.Method_Not_Allowed_Handler(w, r)
		}
	})

	multiplexer.HandleFunc("/projects", func(w http.ResponseWriter, r *http.Request) {
		switch r.Method {
		case http.MethodPost:
			internal.CreateProject(w, r, db_connection)
		case http.MethodGet:
			internal.ListProjects(w, r, db_connection)
		case http.MethodPut:
			internal.UpdateProject(w, r, db_connection)
		case http.MethodDelete:
			internal.DeleteProject(w, r, db_connection)
		default:
			utils.Method_Not_Allowed_Handler(w, r)
		}
	})

	multiplexer.HandleFunc("/logs", func(w http.ResponseWriter, r *http.Request) {
		switch r.Method {
		case http.MethodPost:
			internal.CreateLog(w, r, db_connection)
		case http.MethodGet:
			internal.GetAllLogs(w, r, db_connection)
		default:
			utils.Method_Not_Allowed_Handler(w, r)
		}
	})

	multiplexer.HandleFunc("/logs/project", func(w http.ResponseWriter, r *http.Request) {
		switch r.Method {
		case http.MethodGet:
			internal.GetLogsByProjectID(w, r, db_connection)
		// case http.MethodDelete:
		// 	internal.DeleteLogsByProjectID(w, r, db_c nnection)
		default:
			utils.Method_Not_Allowed_Handler(w, r)
		}
	})

	multiplexer.HandleFunc("/logs/user", func(w http.ResponseWriter, r *http.Request) {
		switch r.Method {
		case http.MethodGet:
			internal.GetLogsByUserID(w, r, db_connection)
		// case http.MethodDelete:
		// 	internal.DeleteLogsByUserID(w, r, db_connection)
		default:
			utils.Method_Not_Allowed_Handler(w, r)
		}
	})

	multiplexer.HandleFunc("/logs/time", func(w http.ResponseWriter, r *http.Request) {
		switch r.Method {
		case http.MethodGet:
			internal.GetLogsInTimeRange(w, r, db_connection)
		// case http.MethodDelete:
		// 	internal.DeleteLogsByTimeRange(w, r, db_connection)
		default:
			utils.Method_Not_Allowed_Handler(w, r)
		}
	})

	multiplexer.HandleFunc("/logs/level", func(w http.ResponseWriter, r *http.Request) {
		switch r.Method {
		case http.MethodGet:
			internal.GetLogsByLevel(w, r, db_connection)
		default:
			utils.Method_Not_Allowed_Handler(w, r)
		}
	})

	fmt.Println("Starting server on " + port)
	log.Fatal(http.ListenAndServe(":"+port,
		middleware.RequestIDMiddleware(
			middleware.Ratelimit(
				multiplexer,
			))))
}