From 43a25f817b29b45ed99e7c0cb5aad10dcd6d0ac6 Mon Sep 17 00:00:00 2001 From: alex Date: Mon, 26 Jun 2023 22:06:25 +0200 Subject: [PATCH] added logger for grouptasks and system --- grouptasks_lang_log_messages.json | 11 ++ log.json | 103 +++++++++++++ main.go | 1 + modules/database/database.go | 32 ++-- modules/logger/logger.go | 193 +++++++++++++++++++++++++ modules/structs/log.go | 33 +++++ modules/utils/globals.go | 5 + routers/router/api/v1/logger/logger.go | 42 ++++++ routers/router/router.go | 4 + socketclients/socketclients.go | 2 + socketserver/hub.go | 13 ++ system_lang_log_messages.json | 11 ++ 12 files changed, 441 insertions(+), 9 deletions(-) create mode 100644 grouptasks_lang_log_messages.json create mode 100644 log.json create mode 100644 modules/structs/log.go create mode 100644 routers/router/api/v1/logger/logger.go create mode 100644 system_lang_log_messages.json diff --git a/grouptasks_lang_log_messages.json b/grouptasks_lang_log_messages.json new file mode 100644 index 0000000..01c00e7 --- /dev/null +++ b/grouptasks_lang_log_messages.json @@ -0,0 +1,11 @@ +[ + { + "id": 0, + "languages": [ + { + "lang": "en", + "message": "%userId% has started group tasks" + } + ] + } +] \ No newline at end of file diff --git a/log.json b/log.json new file mode 100644 index 0000000..28622dc --- /dev/null +++ b/log.json @@ -0,0 +1,103 @@ +{"Id":0,"Time":"2023-06-26T14:40:53.344359537+02:00","Type":0,"Messages":[{"Type":"user","Value":"Alex"}]} +{"Id":0,"Time":"2023-06-26T14:40:54.388697469+02:00","Type":0,"Messages":[{"Type":"user","Value":"Alex"}]} +{"Id":0,"Time":"2023-06-26T14:41:08.397273014+02:00","Type":0,"Messages":[{"Type":"user","Value":"Alex"}]} +{"Id":0,"Time":"2023-06-26T14:41:09.059905327+02:00","Type":0,"Messages":[{"Type":"user","Value":"Alex"}]} +{"Id":0,"Time":"2023-06-26T14:44:00.704064229+02:00","Type":0,"Messages":[{"Type":"user","Value":"Alex"}]} +{"Id":0,"Time":"2023-06-26T14:44:00.757018863+02:00","Type":0,"Messages":[{"Type":"user","Value":"Alex"}]} +{"Id":0,"Time":"2023-06-26T14:48:22.373511048+02:00","Type":0,"Messages":[{"Type":"user","Value":"Alex"}]} +{"Id":0,"Time":"2023-06-26T14:48:23.113997674+02:00","Type":0,"Messages":[{"Type":"user","Value":"Alex"}]} +{"Id":0,"Time":"2023-06-26T14:48:32.581372985+02:00","Type":0,"Messages":[{"Type":"user","Value":"Alex"}]} +{"Id":0,"Time":"2023-06-26T14:48:33.399112571+02:00","Type":0,"Messages":[{"Type":"user","Value":"Alex"}]} +{"Id":0,"Time":"2023-06-26T14:53:21.353456966+02:00","Type":0,"Messages":[{"Type":"user","Value":"Alex"}]} +{"Id":0,"Time":"2023-06-26T14:53:21.392168992+02:00","Type":0,"Messages":[{"Type":"user","Value":"Alex"}]} +{"Id":0,"Time":"2023-06-26T14:53:42.372417807+02:00","Type":0,"Messages":[{"Type":"user","Value":"Alex"}]} +{"Id":0,"Time":"2023-06-26T14:53:42.479579138+02:00","Type":0,"Messages":[{"Type":"user","Value":"Alex"}]} +{"Id":0,"Time":"2023-06-26T14:53:53.388534593+02:00","Type":0,"Messages":[{"Type":"user","Value":"Alex"}]} +{"Id":0,"Time":"2023-06-26T14:53:53.569891973+02:00","Type":0,"Messages":[{"Type":"user","Value":"Alex"}]} +{"Id":0,"Time":"2023-06-26T15:15:55.476845699+02:00","Type":0,"Messages":[{"Type":"user","Value":"Alex"}]} +{"Id":0,"Time":"2023-06-26T15:15:55.562110779+02:00","Type":0,"Messages":[{"Type":"user","Value":"Alex"}]} +{"Id":0,"Time":"2023-06-26T15:18:00.139081715+02:00","Type":0,"Messages":[{"Type":"user","Value":"Alex"}]} +{"Id":0,"Time":"2023-06-26T15:18:00.188060672+02:00","Type":0,"Messages":[{"Type":"user","Value":"Alex"}]} +{"Id":0,"Time":"2023-06-26T15:20:56.252674262+02:00","Type":0,"Messages":[{"Type":"user","Value":"Alex"}]} +{"Id":0,"Time":"2023-06-26T15:20:56.322052586+02:00","Type":0,"Messages":[{"Type":"user","Value":"Alex"}]} +{"Id":0,"Time":"2023-06-26T15:21:34.183104637+02:00","Type":0,"Messages":[{"Type":"user","Value":"Alex"},{"Type":"role","Value":"Test"}]} +{"Id":0,"Time":"2023-06-26T15:21:34.238983689+02:00","Type":0,"Messages":[{"Type":"user","Value":"Alex"},{"Type":"role","Value":"Test"}]} +{"Id":0,"Time":"2023-06-26T15:21:47.901594058+02:00","Type":0,"Messages":[{"Type":"user","Value":"Alex"},{"Type":"role","Value":"Test"}]} +{"Id":0,"Time":"2023-06-26T15:21:47.957861269+02:00","Type":0,"Messages":[{"Type":"user","Value":"Alex"},{"Type":"role","Value":"Test"}]} +{"Id":0,"Time":"2023-06-26T15:21:55.00618043+02:00","Type":0,"Messages":[{"Type":"user","Value":"Alex"},{"Type":"role","Value":"Test"}]} +{"Id":0,"Time":"2023-06-26T15:21:55.094324945+02:00","Type":0,"Messages":[{"Type":"user","Value":"Alex"},{"Type":"role","Value":"Test"}]} +{"Id":0,"Time":"2023-06-26T15:28:17.378472657+02:00","Type":0,"Messages":[{"Type":"user","Value":"Alex"},{"Type":"role","Value":"Test"}]} +{"Id":0,"Time":"2023-06-26T15:28:17.442670752+02:00","Type":0,"Messages":[{"Type":"user","Value":"Alex"},{"Type":"role","Value":"Test"}]} +{"Id":0,"Time":"2023-06-26T15:46:42.852109566+02:00","Type":0,"Messages":[{"Type":"user","Value":"Alex"},{"Type":"role","Value":"Test"}]} +{"Id":0,"Time":"2023-06-26T15:46:44.117866181+02:00","Type":0,"Messages":[{"Type":"user","Value":"Alex"},{"Type":"role","Value":"Test"}]} +{"Id":0,"Time":"2023-06-26T15:51:04.075699656+02:00","Type":0,"Messages":[{"Type":"user","Value":"Alex"},{"Type":"role","Value":"Test"}]} +{"Id":0,"Time":"2023-06-26T15:51:04.139294474+02:00","Type":0,"Messages":[{"Type":"user","Value":"Alex"},{"Type":"role","Value":"Test"}]} +{"Id":0,"Time":"2023-06-26T15:53:33.812822579+02:00","Type":0,"Messages":[{"Type":"user","Value":"Alex"},{"Type":"role","Value":"Test"}]} +{"Id":0,"Time":"2023-06-26T15:53:55.750431162+02:00","Type":0,"Messages":[{"Type":"user","Value":"Alex"},{"Type":"role","Value":"Test"}]} +{"Id":0,"Time":"2023-06-26T15:54:23.509249057+02:00","Type":0,"Messages":[{"Type":"user","Value":"Alex"},{"Type":"role","Value":"Test"}]} +{"Id":0,"Time":"2023-06-26T15:54:32.489746458+02:00","Type":0,"Messages":[{"Type":"user","Value":"Alex"},{"Type":"role","Value":"Test"}]} +{"Id":0,"Time":"2023-06-26T15:54:42.425441725+02:00","Type":0,"Messages":[{"Type":"user","Value":"Alex"},{"Type":"role","Value":"Test"}]} +{"Id":0,"Time":"2023-06-26T15:56:05.308186703+02:00","Type":0,"Messages":[{"Type":"user","Value":"Alex"},{"Type":"role","Value":"Test"}]} +{"Id":0,"Time":"2023-06-26T16:01:23.072004383+02:00","Type":0,"Messages":[{"Type":"user","Value":"Alex"},{"Type":"role","Value":"Test"}]} +{"Id":0,"Time":"2023-06-26T16:01:46.172679342+02:00","Type":0,"Messages":[{"Type":"user","Value":"Alex"},{"Type":"role","Value":"Test"}]} +{"Id":0,"Time":"2023-06-26T16:03:39.737390245+02:00","Type":0,"Messages":[{"Type":"user","Value":"Alex"},{"Type":"role","Value":"Test"}]} +{"Id":0,"Time":"2023-06-26T16:04:05.088615344+02:00","Type":0,"Messages":[{"Type":"user","Value":"Alex"},{"Type":"role","Value":"Test"}]} +{"Id":0,"Time":"2023-06-26T16:04:21.533500276+02:00","Type":0,"Messages":[{"Type":"user","Value":"Alex"},{"Type":"role","Value":"Test"}]} +{"Id":0,"Time":"2023-06-26T16:05:02.034541248+02:00","Type":0,"Messages":[{"Type":"user","Value":"Alex"},{"Type":"role","Value":"Test"}]} +{"Id":0,"Time":"2023-06-26T16:05:06.571337816+02:00","Type":0,"Messages":[{"Type":"user","Value":"Alex"},{"Type":"role","Value":"Test"}]} +{"Id":0,"Time":"2023-06-26T16:15:54.596922828+02:00","Type":0,"Messages":[{"Type":"user","Value":"Alex"},{"Type":"role","Value":"Test"}]} +{"Id":0,"Time":"2023-06-26T16:15:54.663200369+02:00","Type":0,"Messages":[{"Type":"user","Value":"Alex"},{"Type":"role","Value":"Test"}]} +{"Id":0,"Time":"2023-06-26T16:16:58.723786041+02:00","Type":0,"Messages":[{"Type":"user","Value":"Alex"},{"Type":"role","Value":"Test"}]} +{"Id":0,"Time":"2023-06-26T16:16:58.778960869+02:00","Type":0,"Messages":[{"Type":"user","Value":"Alex"},{"Type":"role","Value":"Test"}]} +{"Id":0,"Time":"2023-06-26T16:17:14.941884767+02:00","Type":0,"Messages":[{"Type":"user","Value":"Alex"},{"Type":"role","Value":"Test"}]} +{"Id":0,"Time":"2023-06-26T16:23:21.562944663+02:00","Type":0,"Messages":[{"Type":"user","Value":"Alex"},{"Type":"role","Value":"Test"}]} +{"Id":0,"Time":"2023-06-26T16:23:22.371236719+02:00","Type":0,"Messages":[{"Type":"user","Value":"Alex"},{"Type":"role","Value":"Test"}]} +{"Id":0,"Time":"2023-06-26T16:23:38.205995944+02:00","Type":0,"Messages":[{"Type":"user","Value":"Alex"},{"Type":"role","Value":"Test"}]} +{"Id":0,"Time":"2023-06-26T16:23:44.81232114+02:00","Type":0,"Messages":[{"Type":"user","Value":"Alex"},{"Type":"role","Value":"Test"}]} +{"Id":0,"Time":"2023-06-26T16:25:37.248649355+02:00","Type":0,"Messages":[{"Type":"user","Value":"Alex"},{"Type":"role","Value":"Test"}]} +{"Id":0,"Time":"2023-06-26T16:25:37.80611411+02:00","Type":0,"Messages":[{"Type":"user","Value":"Alex"},{"Type":"role","Value":"Test"}]} +{"Id":0,"Time":"2023-06-26T16:25:46.934383621+02:00","Type":0,"Messages":[{"Type":"user","Value":"Alex"},{"Type":"role","Value":"Test"}]} +{"Id":0,"Time":"2023-06-26T16:25:47.015168493+02:00","Type":0,"Messages":[{"Type":"user","Value":"Alex"},{"Type":"role","Value":"Test"}]} +{"Id":0,"Time":"2023-06-26T16:26:23.528932114+02:00","Type":0,"Messages":[{"Type":"user","Value":"Alex"},{"Type":"role","Value":"Test"}]} +{"Id":0,"Time":"2023-06-26T16:27:19.857060312+02:00","Type":0,"Messages":[{"Type":"user","Value":"Alex"},{"Type":"role","Value":"Test"}]} +{"Id":0,"Time":"2023-06-26T16:31:50.791041651+02:00","Type":0,"Messages":[{"Type":"user","Value":"Alex"},{"Type":"role","Value":"Test"}]} +{"Id":0,"Time":"2023-06-26T16:37:07.810002714+02:00","Type":0,"Messages":[{"Type":"user","Value":"Alex"},{"Type":"role","Value":"Test"}]} +{"Id":0,"Time":"2023-06-26T16:37:08.514678749+02:00","Type":0,"Messages":[{"Type":"user","Value":"Alex"},{"Type":"role","Value":"Test"}]} +{"Id":0,"Time":"2023-06-26T16:59:33.232327496+02:00","Type":0,"Messages":[{"Type":"user","Value":"Alex"},{"Type":"role","Value":"Test"}]} +{"Id":0,"Time":"2023-06-26T16:59:33.85629423+02:00","Type":0,"Messages":[{"Type":"user","Value":"Alex"},{"Type":"role","Value":"Test"}]} +{"Id":0,"Time":"2023-06-26T17:15:41.86545891+02:00","Type":0,"Messages":[{"Type":"user","Value":"Alex"},{"Type":"role","Value":"Test"}]} +{"Id":0,"Time":"2023-06-26T17:15:41.935428528+02:00","Type":0,"Messages":[{"Type":"user","Value":"Alex"},{"Type":"role","Value":"Test"}]} +{"Id":0,"Time":"2023-06-26T17:15:43.062270121+02:00","Type":0,"Messages":[{"Type":"user","Value":"Alex"},{"Type":"role","Value":"Test"}]} +{"Id":0,"Time":"2023-06-26T17:15:43.859232118+02:00","Type":0,"Messages":[{"Type":"user","Value":"Alex"},{"Type":"role","Value":"Test"}]} +{"Id":0,"Time":"2023-06-26T17:19:02.902554585+02:00","Type":1,"Messages":[{"Type":"user","Value":"Alex"},{"Type":"role","Value":"Test"}]} +{"Id":0,"Time":"2023-06-26T17:19:02.952776992+02:00","Type":1,"Messages":[{"Type":"user","Value":"Alex"},{"Type":"role","Value":"Test"}]} +{"Id":0,"Time":"2023-06-26T17:19:03.001309906+02:00","Type":1,"Messages":[{"Type":"user","Value":"Alex"},{"Type":"role","Value":"Test"}]} +{"Id":0,"Time":"2023-06-26T17:19:03.040355365+02:00","Type":1,"Messages":[{"Type":"user","Value":"Alex"},{"Type":"role","Value":"Test"}]} +{"Id":0,"Time":"2023-06-26T17:19:58.303858277+02:00","Type":3,"Messages":[{"Type":"user","Value":"Alex"},{"Type":"role","Value":"Test"}]} +{"Id":0,"Time":"2023-06-26T17:19:58.826549462+02:00","Type":3,"Messages":[{"Type":"user","Value":"Alex"},{"Type":"role","Value":"Test"}]} +{"Id":0,"Time":"2023-06-26T17:19:58.869519116+02:00","Type":3,"Messages":[{"Type":"user","Value":"Alex"},{"Type":"role","Value":"Test"}]} +{"Id":0,"Time":"2023-06-26T17:19:59.210307836+02:00","Type":3,"Messages":[{"Type":"user","Value":"Alex"},{"Type":"role","Value":"Test"}]} +{"Id":0,"Time":"2023-06-26T17:20:17.84431075+02:00","Type":2,"Messages":[{"Type":"user","Value":"Alex"},{"Type":"role","Value":"Test"}]} +{"Id":0,"Time":"2023-06-26T17:20:17.898623303+02:00","Type":2,"Messages":[{"Type":"user","Value":"Alex"},{"Type":"role","Value":"Test"}]} +{"Id":0,"Time":"2023-06-26T17:20:17.985769915+02:00","Type":2,"Messages":[{"Type":"user","Value":"Alex"},{"Type":"role","Value":"Test"}]} +{"Id":0,"Time":"2023-06-26T17:20:18.049521892+02:00","Type":2,"Messages":[{"Type":"user","Value":"Alex"},{"Type":"role","Value":"Test"}]} +{"Id":0,"Time":"2023-06-26T17:25:10.872894974+02:00","Type":2,"Messages":[{"Type":"user","Value":"Alex"},{"Type":"role","Value":"Test"}]} +{"Id":0,"Time":"2023-06-26T17:25:26.032539587+02:00","Type":2,"Messages":[{"Type":"user","Value":"Alex"},{"Type":"role","Value":"Test"}]} +{"Id":0,"Time":"2023-06-26T17:28:51.958849106+02:00","Type":2,"Messages":[{"Type":"username","Value":"Alex"}]} +{"Id":0,"Time":"2023-06-26T17:28:52.051645006+02:00","Type":2,"Messages":[{"Type":"username","Value":"Alex"}]} +{"Id":0,"Time":"2023-06-26T17:28:52.0958333+02:00","Type":2,"Messages":[{"Type":"username","Value":"Alex"}]} +{"Id":0,"Time":"2023-06-26T17:29:09.128923843+02:00","Type":2,"Messages":[{"Type":"username","Value":"Alex"}]} +{"Id":0,"Time":"2023-06-26T17:29:09.179518658+02:00","Type":2,"Messages":[{"Type":"username","Value":"Alex"}]} +{"Id":0,"Time":"2023-06-26T17:29:10.007487297+02:00","Type":2,"Messages":[{"Type":"username","Value":"Alex"}]} +{"Id":0,"Time":"2023-06-26T17:29:23.009030867+02:00","Type":0,"Messages":[{"Type":"username","Value":"Alex"}]} +{"Id":0,"Time":"2023-06-26T17:29:23.079119037+02:00","Type":0,"Messages":[{"Type":"username","Value":"Alex"}]} +{"Id":0,"Time":"2023-06-26T17:29:23.146551593+02:00","Type":0,"Messages":[{"Type":"username","Value":"Alex"}]} +{"Id":0,"Time":"2023-06-26T17:35:05.91026836+02:00","Type":0,"Messages":[{"Type":"username","Value":"Alex"}]} +{"Id":0,"Time":"2023-06-26T17:35:06.030515145+02:00","Type":0,"Messages":[{"Type":"username","Value":"Alex"}]} +{"Id":0,"Time":"2023-06-26T17:35:07.115992125+02:00","Type":0,"Messages":[{"Type":"username","Value":"Alex"}]} +{"Id":0,"Time":"2023-06-26T17:35:07.803301779+02:00","Type":0,"Messages":[{"Type":"username","Value":"Alex"}]} +{"Id":0,"Time":"2023-06-26T17:35:39.912754022+02:00","Type":0,"Messages":[{"Type":"username","Value":"Alex"}]} +{"Id":0,"Time":"2023-06-26T18:49:59.589837134+02:00","Type":0,"Messages":[{"Type":"username","Value":"Alex"}]} +{"Id":0,"Time":"2023-06-26T19:00:39.906990709+02:00","Type":0,"Messages":[{"Type":"username","Value":"Alex"}]} +{"Id":0,"Time":"2023-06-26T19:03:21.070788107+02:00","Type":0,"Messages":[{"Type":"userId","Value":"34a2e968-8769-4794-97f9-8134db97d50f"}]} +{"Id":0,"Time":"2023-06-26T19:03:21.109272654+02:00","Type":0,"Messages":[{"Type":"userId","Value":"34a2e968-8769-4794-97f9-8134db97d50f"}]} diff --git a/main.go b/main.go index e0678cd..298c3ff 100644 --- a/main.go +++ b/main.go @@ -21,6 +21,7 @@ func init() { config.LoadConfig() logger.InitLogger() utils.ValidatorInit() + logger.ReadLanguageLogMessages() systempermissions.InitSystemPermissions() grouptasks.LoadGroups("") database.InitDatabase() diff --git a/modules/database/database.go b/modules/database/database.go index a3a9e05..6743ec9 100644 --- a/modules/database/database.go +++ b/modules/database/database.go @@ -37,13 +37,22 @@ func InitDatabase() { db.AutoMigrate(&structs.Role{}) db.AutoMigrate(&structs.RolePermission{}) - /* masterRoleId := handleMasterRolePermissions() */ - handleMasterRolePermissions() - //createUser(masterRoleId) + masterRoleId := handleMasterRolePermissions() + //handleMasterRolePermissions() + createDefaultAdminUser(masterRoleId) } -func createUser(masterRoleId string) { - pw := []byte("haha") +func createDefaultAdminUser(masterRoleId string) { + var userCount int64 + DB.Model(&structs.User{}).Count(&userCount) + + if userCount > 0 { + return + } + + log.Info().Msg("No users found. Master account was created:") + + pw := []byte("adminadmin") hashedPassword, err := bcrypt.GenerateFromPassword(pw, bcrypt.DefaultCost) @@ -51,14 +60,19 @@ func createUser(masterRoleId string) { panic(err) } - DB.Create(&structs.User{ + user := structs.User{ Id: uuid.New().String(), RoleId: masterRoleId, - Username: "Alex", - Email: "alex@roese.dev", + Username: "admin", + Email: "admin@roese.dev", Password: string(hashedPassword), CreatedAt: time.Now(), - }) + } + + DB.Create(&user) + + log.Info().Msgf("Username: %s", user.Username) + log.Info().Msgf("Password: %s", string(pw)) } func handleMasterRolePermissions() (roleId string) { diff --git a/modules/logger/logger.go b/modules/logger/logger.go index 229ce70..8206f32 100644 --- a/modules/logger/logger.go +++ b/modules/logger/logger.go @@ -1,13 +1,33 @@ package logger import ( + "bufio" + "encoding/json" + "fmt" + "io/ioutil" "janex/admin-dashboard-backend/modules/config" + "janex/admin-dashboard-backend/modules/structs" "os" + "sort" + "strconv" + "strings" + "time" "github.com/rs/zerolog" "github.com/rs/zerolog/log" ) +var systemLanguageLogMessages []structs.LanguageLogMessages +var grouptasksLanguageLogMessages []structs.LanguageLogMessages + +const ( + systemLogsRootPath = "./logs/system/" + groupTasksLogsRootPath = "./logs/grouptasks/" + + systemLanguageLogPath = "./system_lang_log_messages.json" + grouptasksLanguageLogPath = "./grouptasks_lang_log_messages.json" +) + func InitLogger() { zerolog.TimeFieldFormat = zerolog.TimeFormatUnix @@ -21,3 +41,176 @@ func InitLogger() { log.Logger = log.Output(zerolog.ConsoleWriter{Out: os.Stderr, TimeFormat: "15:04:05"}) } } + +func AddSystemLog(logMessage structs.LogMessage) { + addLog(logMessage, true) +} + +func AddGroupTasksLog(logMessage structs.LogMessage) { + addLog(logMessage, false) +} + +func addLog(logMessage structs.LogMessage, systemLog bool) { + year, month, day := time.Now().Date() + + path := systemLogsRootPath + + if !systemLog { + path = groupTasksLogsRootPath + } + + f, err := os.OpenFile(path+strconv.Itoa(day)+"-"+strconv.Itoa(int(month))+"-"+strconv.Itoa(year)+".json", os.O_APPEND|os.O_WRONLY|os.O_CREATE, 0644) + + if err != nil { + log.Error().Msgf("Failed to open log file %s", err.Error()) + return + } + + defer f.Close() + + logMessage.Time = time.Now() + + file, _ := json.Marshal(logMessage) + + if _, err = fmt.Fprintln(f, string(file)); err != nil { + log.Error().Msgf("Failed to write to log file %s", err.Error()) + } +} + +func ReadLogs(date string, systemLogs bool) []structs.LogMessageResponse { + path := systemLogsRootPath + + if !systemLogs { + path = groupTasksLogsRootPath + } + + file, err := os.Open(path + date + ".json") + + if err != nil { + log.Error().Msgf("Failed to read log file %s", err.Error()) + return nil + } + + defer file.Close() + + fileScanner := bufio.NewScanner(file) + + var logMessages []structs.LogMessageResponse + + for fileScanner.Scan() { + var logMessage structs.LogMessage + + if err := json.Unmarshal(fileScanner.Bytes(), &logMessage); err != nil { + log.Error().Msgf("Failed to unmarshal log message %v", err.Error()) + } + + var languageLogMessages []structs.LanguageLogMessages + + if systemLogs { + languageLogMessages = systemLanguageLogMessages + } else { + languageLogMessages = grouptasksLanguageLogMessages + } + + for _, systemLanguageLogMessage := range languageLogMessages { + if logMessage.Id == systemLanguageLogMessage.Id { + replacedLogMessage := systemLanguageLogMessage.Languages[0].Message + + for _, message := range logMessage.Messages { + replacedLogMessage = strings.ReplaceAll(replacedLogMessage, "%"+message.Type+"%", message.Value) + } + + logMessages = append(logMessages, structs.LogMessageResponse{ + Time: logMessage.Time, + Type: logMessage.Type, + Message: replacedLogMessage, + }) + break + } + } + } + + if err := fileScanner.Err(); err != nil { + log.Error().Msgf("Error while reading file: %s", err) + return nil + } + + return logMessages +} + +func GetAllLogMessagesDates(systemLogs bool) []string { + path := systemLogsRootPath + + if !systemLogs { + path = groupTasksLogsRootPath + } + + files, err := ioutil.ReadDir(path) + + if err != nil { + log.Error().Msgf("Failed to read log messages directory %s", err.Error()) + return []string{} + } + + var dates []string + + for _, file := range files { + dates = append(dates, strings.Split(file.Name(), ".")[0]) + } + + layout := "2-1-2006" + parsedDates := make([]time.Time, len(dates)) + + for i, dateStr := range dates { + parsedDate, err := time.Parse(layout, dateStr) + if err != nil { + log.Error().Msgf("Failed to parse date %s", err.Error()) + return []string{} + } + + parsedDates[i] = parsedDate + } + + sort.Slice(parsedDates, func(i, j int) bool { + return parsedDates[i].Before(parsedDates[j]) + }) + + sortedDates := []string{} + + for _, date := range parsedDates { + sortedDates = append(sortedDates, date.Format(layout)) + } + + return sortedDates +} + +func ReadLanguageLogMessages() { + readLanguageLogMessages(true) + readLanguageLogMessages(false) +} + +func readLanguageLogMessages(systemLogs bool) { + path := systemLanguageLogPath + + if !systemLogs { + path = grouptasksLanguageLogPath + } + + content, err := ioutil.ReadFile(path) + + if err != nil { + panic("Could not read language log messages: " + err.Error()) + } + + var langLogMessages []structs.LanguageLogMessages + + if err = json.Unmarshal(content, &langLogMessages); err != nil { + panic("Failed to unmarshal: " + err.Error()) + } + + if systemLogs { + systemLanguageLogMessages = langLogMessages + } else { + grouptasksLanguageLogMessages = langLogMessages + } +} diff --git a/modules/structs/log.go b/modules/structs/log.go new file mode 100644 index 0000000..5f895e8 --- /dev/null +++ b/modules/structs/log.go @@ -0,0 +1,33 @@ +package structs + +import ( + "time" +) + +type LogMessage struct { + Id uint16 + Time time.Time + Type uint8 + Messages []LogData +} + +type LogData struct { + Type string + Value string +} + +type LanguageLogMessages struct { + Id uint16 + Languages []LanguageLogMessagesLanguage +} + +type LanguageLogMessagesLanguage struct { + Lang string + Message string +} + +type LogMessageResponse struct { + Time time.Time + Type uint8 + Message string +} diff --git a/modules/utils/globals.go b/modules/utils/globals.go index 5ce9d85..acb7b41 100644 --- a/modules/utils/globals.go +++ b/modules/utils/globals.go @@ -120,3 +120,8 @@ const ( PermissionAdminAreaMoveRoleUpDown = _adminAreaRoles + "move_role_up_down" PermissionAdminAreaLogs = _adminArea + "logs" ) + +const ( + LogTypeInfo = 0 + LogTypeError = 1 +) diff --git a/routers/router/api/v1/logger/logger.go b/routers/router/api/v1/logger/logger.go new file mode 100644 index 0000000..09c1dc4 --- /dev/null +++ b/routers/router/api/v1/logger/logger.go @@ -0,0 +1,42 @@ +package logger + +import ( + "janex/admin-dashboard-backend/modules/logger" + "janex/admin-dashboard-backend/modules/structs" + "janex/admin-dashboard-backend/modules/utils" + "janex/admin-dashboard-backend/socketclients" + + "github.com/gofiber/fiber/v2" +) + +func GetSystemLog(c *fiber.Ctx) error { + t := c.Query("type") + date := c.Query("date") + + if t == "" || date == "" { + return c.SendStatus(fiber.StatusBadRequest) + } + + if t == "g" && !socketclients.HasPermission(c.Locals("userId").(string), utils.PermissionGroupTasksHistory) || t == "s" && !socketclients.HasPermission(c.Locals("userId").(string), utils.PermissionAdminAreaLogs) { + return c.SendStatus(fiber.StatusUnauthorized) + } + + if t == "g" { // grouptasks logs + return c.JSON(struct { + Logs []structs.LogMessageResponse + Dates []string + }{ + Logs: logger.ReadLogs(date, false), + Dates: logger.GetAllLogMessagesDates(false), + }) + } + + // system logs + return c.JSON(struct { + Logs []structs.LogMessageResponse + Dates []string + }{ + Logs: logger.ReadLogs(date, true), + Dates: logger.GetAllLogMessagesDates(true), + }) +} diff --git a/routers/router/router.go b/routers/router/router.go index e8b0b43..1117c84 100644 --- a/routers/router/router.go +++ b/routers/router/router.go @@ -5,6 +5,7 @@ import ( "janex/admin-dashboard-backend/modules/structs" "janex/admin-dashboard-backend/modules/utils" "janex/admin-dashboard-backend/routers/router/api/v1/jxscanner" + log "janex/admin-dashboard-backend/routers/router/api/v1/logger" "janex/admin-dashboard-backend/routers/router/api/v1/user" "github.com/gofiber/fiber/v2" @@ -24,6 +25,9 @@ func SetupRoutes(app *fiber.App) { s.Post("/scan", scannerSessionValidation, jxscanner.ScanResult) s.Delete("/", scannerSessionValidation, jxscanner.DeleteScanner) + l := v1.Group("/log") + l.Get("/", userSessionValidation, log.GetSystemLog) + app.Static("/", "./public") } diff --git a/socketclients/socketclients.go b/socketclients/socketclients.go index e28f7fb..1da3c43 100644 --- a/socketclients/socketclients.go +++ b/socketclients/socketclients.go @@ -722,11 +722,13 @@ func AllUsersCreateNewUser(sessionId string, body map[string]interface{}) { Username string RoleId string ConnectionStatus uint8 + Deactivated bool }{ Id: newUser.Id, Username: username, RoleId: roleId, ConnectionStatus: utils.ConnectionStateOffline, + Deactivated: false, }, }) } diff --git a/socketserver/hub.go b/socketserver/hub.go index bc0a05e..0f1d4a6 100644 --- a/socketserver/hub.go +++ b/socketserver/hub.go @@ -6,6 +6,7 @@ import ( "janex/admin-dashboard-backend/modules/cache" "janex/admin-dashboard-backend/modules/database" "janex/admin-dashboard-backend/modules/grouptasks" + "janex/admin-dashboard-backend/modules/logger" "janex/admin-dashboard-backend/modules/structs" "janex/admin-dashboard-backend/modules/utils" "janex/admin-dashboard-backend/socketclients" @@ -86,6 +87,18 @@ func RunHub() { socketclients.UpdateConnectedUsers(userId) socketclients.UpdateUserSessionsForUser(userId, sessionId) + logger.AddSystemLog(structs.LogMessage{ + Id: 0, + Type: utils.LogTypeInfo, + Messages: []structs.LogData{ + {Type: "userId", Value: user.Id}}}) + + logger.AddGroupTasksLog(structs.LogMessage{ + Id: 0, + Type: utils.LogTypeInfo, + Messages: []structs.LogData{ + {Type: "userId", Value: user.Id}}}) + case data := <-broadcast: var receivedMessage structs.ReceivedMessage diff --git a/system_lang_log_messages.json b/system_lang_log_messages.json new file mode 100644 index 0000000..9bebed3 --- /dev/null +++ b/system_lang_log_messages.json @@ -0,0 +1,11 @@ +[ + { + "id": 0, + "languages": [ + { + "lang": "en", + "message": "%userId% has logged in" + } + ] + } +] \ No newline at end of file