mirror of
https://github.com/muety/wakapi.git
synced 2023-08-10 21:12:56 +03:00
ref: remove unnecessary unicode characters
This commit is contained in:
parent
222024dabb
commit
6d762f5fd6
@ -269,12 +269,12 @@ func IsDev(env string) bool {
|
|||||||
func readColors() map[string]map[string]string {
|
func readColors() map[string]map[string]string {
|
||||||
// Read language colors
|
// Read language colors
|
||||||
// Source:
|
// Source:
|
||||||
// – https://raw.githubusercontent.com/ozh/github-colors/master/colors.json
|
// - https://raw.githubusercontent.com/ozh/github-colors/master/colors.json
|
||||||
// – https://wakatime.com/colors/operating_systems
|
// - https://wakatime.com/colors/operating_systems
|
||||||
// - https://wakatime.com/colors/editors
|
// - https://wakatime.com/colors/editors
|
||||||
// Extracted from Wakatime website with XPath (see below) and did a bit of regex magic after.
|
// Extracted from Wakatime website with XPath (see below) and did a bit of regex magic after.
|
||||||
// – $x('//span[@class="editor-icon tip"]/@data-original-title').map(e => e.nodeValue)
|
// - $x('//span[@class="editor-icon tip"]/@data-original-title').map(e => e.nodeValue)
|
||||||
// – $x('//span[@class="editor-icon tip"]/div[1]/text()').map(e => e.nodeValue)
|
// - $x('//span[@class="editor-icon tip"]/div[1]/text()').map(e => e.nodeValue)
|
||||||
|
|
||||||
raw := data.ColorsFile
|
raw := data.ColorsFile
|
||||||
if IsDev(env) {
|
if IsDev(env) {
|
||||||
|
@ -140,7 +140,7 @@ func initSentry(config sentryConfig, debug bool) {
|
|||||||
return event
|
return event
|
||||||
},
|
},
|
||||||
}); err != nil {
|
}); err != nil {
|
||||||
logbuch.Fatal("failed to initialized sentry – %v", err)
|
logbuch.Fatal("failed to initialized sentry - %v", err)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -105,7 +105,7 @@ func (m *WakatimeRelayMiddleware) ServeHTTP(w http.ResponseWriter, r *http.Reque
|
|||||||
func (m *WakatimeRelayMiddleware) send(method, url string, body io.Reader, headers http.Header, forUser *models.User) {
|
func (m *WakatimeRelayMiddleware) send(method, url string, body io.Reader, headers http.Header, forUser *models.User) {
|
||||||
request, err := http.NewRequest(method, url, body)
|
request, err := http.NewRequest(method, url, body)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
logbuch.Warn("error constructing relayed request – %v", err)
|
logbuch.Warn("error constructing relayed request - %v", err)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -117,7 +117,7 @@ func (m *WakatimeRelayMiddleware) send(method, url string, body io.Reader, heade
|
|||||||
|
|
||||||
response, err := m.httpClient.Do(request)
|
response, err := m.httpClient.Do(request)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
logbuch.Warn("error executing relayed request – %v", err)
|
logbuch.Warn("error executing relayed request - %v", err)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -46,7 +46,7 @@ func RunPreMigrations(db *gorm.DB, cfg *config.Config) {
|
|||||||
for _, m := range preMigrations {
|
for _, m := range preMigrations {
|
||||||
logbuch.Info("potentially running migration '%s'", m.name)
|
logbuch.Info("potentially running migration '%s'", m.name)
|
||||||
if err := m.f(db, cfg); err != nil {
|
if err := m.f(db, cfg); err != nil {
|
||||||
logbuch.Fatal("migration '%s' failed – %v", m.name, err)
|
logbuch.Fatal("migration '%s' failed - %v", m.name, err)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -57,7 +57,7 @@ func RunPostMigrations(db *gorm.DB, cfg *config.Config) {
|
|||||||
for _, m := range postMigrations {
|
for _, m := range postMigrations {
|
||||||
logbuch.Info("potentially running migration '%s'", m.name)
|
logbuch.Info("potentially running migration '%s'", m.name)
|
||||||
if err := m.f(db, cfg); err != nil {
|
if err := m.f(db, cfg); err != nil {
|
||||||
logbuch.Fatal("migration '%s' failed – %v", m.name, err)
|
logbuch.Fatal("migration '%s' failed - %v", m.name, err)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -40,7 +40,7 @@ func NewDurationFromHeartbeat(h *Heartbeat) *Duration {
|
|||||||
func (d *Duration) Hashed() *Duration {
|
func (d *Duration) Hashed() *Duration {
|
||||||
hash, err := hashstructure.Hash(d, hashstructure.FormatV2, nil)
|
hash, err := hashstructure.Hash(d, hashstructure.FormatV2, nil)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
logbuch.Error("CRITICAL ERROR: failed to hash struct – %v", err)
|
logbuch.Error("CRITICAL ERROR: failed to hash struct - %v", err)
|
||||||
}
|
}
|
||||||
d.GroupHash = fmt.Sprintf("%x", hash)
|
d.GroupHash = fmt.Sprintf("%x", hash)
|
||||||
return d
|
return d
|
||||||
|
@ -103,7 +103,7 @@ func (f *Filters) IsEmpty() bool {
|
|||||||
func (f *Filters) Hash() string {
|
func (f *Filters) Hash() string {
|
||||||
hash, err := hashstructure.Hash(f, hashstructure.FormatV2, nil)
|
hash, err := hashstructure.Hash(f, hashstructure.FormatV2, nil)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
logbuch.Error("CRITICAL ERROR: failed to hash struct – %v", err)
|
logbuch.Error("CRITICAL ERROR: failed to hash struct - %v", err)
|
||||||
}
|
}
|
||||||
return fmt.Sprintf("%x", hash) // "uint64 values with high bit set are not supported"
|
return fmt.Sprintf("%x", hash) // "uint64 values with high bit set are not supported"
|
||||||
}
|
}
|
||||||
|
@ -94,7 +94,7 @@ func (h *Heartbeat) String() string {
|
|||||||
func (h *Heartbeat) Hashed() *Heartbeat {
|
func (h *Heartbeat) Hashed() *Heartbeat {
|
||||||
hash, err := hashstructure.Hash(h, hashstructure.FormatV2, nil)
|
hash, err := hashstructure.Hash(h, hashstructure.FormatV2, nil)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
logbuch.Error("CRITICAL ERROR: failed to hash struct – %v", err)
|
logbuch.Error("CRITICAL ERROR: failed to hash struct - %v", err)
|
||||||
}
|
}
|
||||||
h.Hash = fmt.Sprintf("%x", hash) // "uint64 values with high bit set are not supported"
|
h.Hash = fmt.Sprintf("%x", hash) // "uint64 values with high bit set are not supported"
|
||||||
return h
|
return h
|
||||||
|
@ -98,7 +98,7 @@ func (h *HeartbeatApiHandler) Post(w http.ResponseWriter, r *http.Request) {
|
|||||||
if err := h.heartbeatSrvc.InsertBatch(heartbeats); err != nil {
|
if err := h.heartbeatSrvc.InsertBatch(heartbeats); err != nil {
|
||||||
w.WriteHeader(http.StatusInternalServerError)
|
w.WriteHeader(http.StatusInternalServerError)
|
||||||
w.Write([]byte(conf.ErrInternalServerError))
|
w.Write([]byte(conf.ErrInternalServerError))
|
||||||
conf.Log().Request(r).Error("failed to batch-insert heartbeats – %v", err)
|
conf.Log().Request(r).Error("failed to batch-insert heartbeats - %v", err)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -107,7 +107,7 @@ func (h *HeartbeatApiHandler) Post(w http.ResponseWriter, r *http.Request) {
|
|||||||
if _, err := h.userSrvc.Update(user); err != nil {
|
if _, err := h.userSrvc.Update(user); err != nil {
|
||||||
w.WriteHeader(http.StatusInternalServerError)
|
w.WriteHeader(http.StatusInternalServerError)
|
||||||
w.Write([]byte(conf.ErrInternalServerError))
|
w.Write([]byte(conf.ErrInternalServerError))
|
||||||
conf.Log().Request(r).Error("failed to update user – %v", err)
|
conf.Log().Request(r).Error("failed to update user - %v", err)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -260,7 +260,7 @@ func (h *MetricsHandler) getAdminMetrics(user *models.User) (*mm.Metrics, error)
|
|||||||
|
|
||||||
activeUsers, err := h.userSrvc.GetActive(false)
|
activeUsers, err := h.userSrvc.GetActive(false)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
logbuch.Error("failed to retrieve active users for metric – %v", err)
|
logbuch.Error("failed to retrieve active users for metric - %v", err)
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -284,7 +284,7 @@ func (h *LoginHandler) PostResetPassword(w http.ResponseWriter, r *http.Request)
|
|||||||
go func(user *models.User) {
|
go func(user *models.User) {
|
||||||
link := fmt.Sprintf("%s/set-password?token=%s", h.config.Server.GetPublicUrl(), user.ResetToken)
|
link := fmt.Sprintf("%s/set-password?token=%s", h.config.Server.GetPublicUrl(), user.ResetToken)
|
||||||
if err := h.mailSrvc.SendPasswordReset(user, link); err != nil {
|
if err := h.mailSrvc.SendPasswordReset(user, link); err != nil {
|
||||||
conf.Log().Request(r).Error("failed to send password reset mail to %s – %v", user.ID, err)
|
conf.Log().Request(r).Error("failed to send password reset mail to %s - %v", user.ID, err)
|
||||||
} else {
|
} else {
|
||||||
logbuch.Info("sent password reset mail to %s", user.ID)
|
logbuch.Info("sent password reset mail to %s", user.ID)
|
||||||
}
|
}
|
||||||
|
@ -492,7 +492,7 @@ func (h *SettingsHandler) actionImportWakatime(w http.ResponseWriter, r *http.Re
|
|||||||
|
|
||||||
insert := func(batch []*models.Heartbeat) {
|
insert := func(batch []*models.Heartbeat) {
|
||||||
if err := h.heartbeatSrvc.InsertBatch(batch); err != nil {
|
if err := h.heartbeatSrvc.InsertBatch(batch); err != nil {
|
||||||
logbuch.Warn("failed to insert imported heartbeat, already existing? – %v", err)
|
logbuch.Warn("failed to insert imported heartbeat, already existing? - %v", err)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -518,13 +518,13 @@ func (h *SettingsHandler) actionImportWakatime(w http.ResponseWriter, r *http.Re
|
|||||||
if !user.HasData {
|
if !user.HasData {
|
||||||
user.HasData = true
|
user.HasData = true
|
||||||
if _, err := h.userSrvc.Update(user); err != nil {
|
if _, err := h.userSrvc.Update(user); err != nil {
|
||||||
conf.Log().Request(r).Error("failed to set 'has_data' flag for user %s – %v", user.ID, err)
|
conf.Log().Request(r).Error("failed to set 'has_data' flag for user %s - %v", user.ID, err)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if user.Email != "" {
|
if user.Email != "" {
|
||||||
if err := h.mailSrvc.SendImportNotification(user, time.Now().Sub(start), int(countAfter-countBefore)); err != nil {
|
if err := h.mailSrvc.SendImportNotification(user, time.Now().Sub(start), int(countAfter-countBefore)); err != nil {
|
||||||
conf.Log().Request(r).Error("failed to send import notification mail to %s – %v", user.ID, err)
|
conf.Log().Request(r).Error("failed to send import notification mail to %s - %v", user.ID, err)
|
||||||
} else {
|
} else {
|
||||||
logbuch.Info("sent import notification mail to %s", user.ID)
|
logbuch.Info("sent import notification mail to %s", user.ID)
|
||||||
}
|
}
|
||||||
@ -546,11 +546,11 @@ func (h *SettingsHandler) actionRegenerateSummaries(w http.ResponseWriter, r *ht
|
|||||||
|
|
||||||
go func(user *models.User) {
|
go func(user *models.User) {
|
||||||
if err := h.regenerateSummaries(user); err != nil {
|
if err := h.regenerateSummaries(user); err != nil {
|
||||||
conf.Log().Request(r).Error("failed to regenerate summaries for user '%s' – %v", user.ID, err)
|
conf.Log().Request(r).Error("failed to regenerate summaries for user '%s' - %v", user.ID, err)
|
||||||
}
|
}
|
||||||
}(middlewares.GetPrincipal(r))
|
}(middlewares.GetPrincipal(r))
|
||||||
|
|
||||||
return http.StatusAccepted, "summaries are being regenerated – this may take a up to a couple of minutes, please come back later", ""
|
return http.StatusAccepted, "summaries are being regenerated - this may take a up to a couple of minutes, please come back later", ""
|
||||||
}
|
}
|
||||||
|
|
||||||
func (h *SettingsHandler) actionDeleteUser(w http.ResponseWriter, r *http.Request) (int, string, string) {
|
func (h *SettingsHandler) actionDeleteUser(w http.ResponseWriter, r *http.Request) (int, string, string) {
|
||||||
@ -563,7 +563,7 @@ func (h *SettingsHandler) actionDeleteUser(w http.ResponseWriter, r *http.Reques
|
|||||||
logbuch.Info("deleting user '%s' shortly", user.ID)
|
logbuch.Info("deleting user '%s' shortly", user.ID)
|
||||||
time.Sleep(5 * time.Minute)
|
time.Sleep(5 * time.Minute)
|
||||||
if err := h.userSrvc.Delete(user); err != nil {
|
if err := h.userSrvc.Delete(user); err != nil {
|
||||||
conf.Log().Request(r).Error("failed to delete user '%s' – %v", user.ID, err)
|
conf.Log().Request(r).Error("failed to delete user '%s' - %v", user.ID, err)
|
||||||
} else {
|
} else {
|
||||||
logbuch.Info("successfully deleted user '%s'", user.ID)
|
logbuch.Info("successfully deleted user '%s'", user.ID)
|
||||||
}
|
}
|
||||||
|
@ -84,7 +84,7 @@ func (srv *AggregationService) Run(userIds map[string]bool) error {
|
|||||||
func (srv *AggregationService) summaryWorker(jobs <-chan *AggregationJob, summaries chan<- *models.Summary) {
|
func (srv *AggregationService) summaryWorker(jobs <-chan *AggregationJob, summaries chan<- *models.Summary) {
|
||||||
for job := range jobs {
|
for job := range jobs {
|
||||||
if summary, err := srv.summaryService.Summarize(job.From, job.To, &models.User{ID: job.UserID}, nil); err != nil {
|
if summary, err := srv.summaryService.Summarize(job.From, job.To, &models.User{ID: job.UserID}, nil); err != nil {
|
||||||
config.Log().Error("failed to generate summary (%v, %v, %s) – %v", job.From, job.To, job.UserID, err)
|
config.Log().Error("failed to generate summary (%v, %v, %s) - %v", job.From, job.To, job.UserID, err)
|
||||||
} else {
|
} else {
|
||||||
logbuch.Info("successfully generated summary (%v, %v, %s)", job.From, job.To, job.UserID)
|
logbuch.Info("successfully generated summary (%v, %v, %s)", job.From, job.To, job.UserID)
|
||||||
summaries <- summary
|
summaries <- summary
|
||||||
@ -95,7 +95,7 @@ func (srv *AggregationService) summaryWorker(jobs <-chan *AggregationJob, summar
|
|||||||
func (srv *AggregationService) persistWorker(summaries <-chan *models.Summary) {
|
func (srv *AggregationService) persistWorker(summaries <-chan *models.Summary) {
|
||||||
for summary := range summaries {
|
for summary := range summaries {
|
||||||
if err := srv.summaryService.Insert(summary); err != nil {
|
if err := srv.summaryService.Insert(summary); err != nil {
|
||||||
config.Log().Error("failed to save summary (%v, %v, %s) – %v", summary.UserID, summary.FromTime, summary.ToTime, err)
|
config.Log().Error("failed to save summary (%v, %v, %s) - %v", summary.UserID, summary.FromTime, summary.ToTime, err)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -45,7 +45,7 @@ func (w *WakatimeHeartbeatImporter) Import(user *models.User, minFrom time.Time,
|
|||||||
|
|
||||||
startDate, endDate, err := w.fetchRange(baseUrl)
|
startDate, endDate, err := w.fetchRange(baseUrl)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
config.Log().Error("failed to fetch date range while importing wakatime heartbeats for user '%s' – %v", user.ID, err)
|
config.Log().Error("failed to fetch date range while importing wakatime heartbeats for user '%s' - %v", user.ID, err)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -58,13 +58,13 @@ func (w *WakatimeHeartbeatImporter) Import(user *models.User, minFrom time.Time,
|
|||||||
|
|
||||||
userAgents, err := w.fetchUserAgents(baseUrl)
|
userAgents, err := w.fetchUserAgents(baseUrl)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
config.Log().Error("failed to fetch user agents while importing wakatime heartbeats for user '%s' – %v", user.ID, err)
|
config.Log().Error("failed to fetch user agents while importing wakatime heartbeats for user '%s' - %v", user.ID, err)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
machinesNames, err := w.fetchMachineNames(baseUrl)
|
machinesNames, err := w.fetchMachineNames(baseUrl)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
config.Log().Error("failed to fetch machine names while importing wakatime heartbeats for user '%s' – %v", user.ID, err)
|
config.Log().Error("failed to fetch machine names while importing wakatime heartbeats for user '%s' - %v", user.ID, err)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -76,7 +76,7 @@ func (w *WakatimeHeartbeatImporter) Import(user *models.User, minFrom time.Time,
|
|||||||
|
|
||||||
for _, d := range days {
|
for _, d := range days {
|
||||||
if err := sem.Acquire(ctx, 1); err != nil {
|
if err := sem.Acquire(ctx, 1); err != nil {
|
||||||
logbuch.Error("failed to acquire semaphore – %v", err)
|
logbuch.Error("failed to acquire semaphore - %v", err)
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -87,7 +87,7 @@ func (w *WakatimeHeartbeatImporter) Import(user *models.User, minFrom time.Time,
|
|||||||
d := day.Format(config.SimpleDateFormat)
|
d := day.Format(config.SimpleDateFormat)
|
||||||
heartbeats, err := w.fetchHeartbeats(d, baseUrl)
|
heartbeats, err := w.fetchHeartbeats(d, baseUrl)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
config.Log().Error("failed to fetch heartbeats for day '%s' and user '%s' – &v", d, user.ID, err)
|
config.Log().Error("failed to fetch heartbeats for day '%s' and user '%s' - &v", d, user.ID, err)
|
||||||
}
|
}
|
||||||
|
|
||||||
for _, h := range heartbeats {
|
for _, h := range heartbeats {
|
||||||
|
@ -89,7 +89,7 @@ func (srv *ReportService) SyncSchedule(u *models.User) bool {
|
|||||||
At(t).
|
At(t).
|
||||||
Tag(u.ID).
|
Tag(u.ID).
|
||||||
Do(srv.Run, u, 7*24*time.Hour); err != nil {
|
Do(srv.Run, u, 7*24*time.Hour); err != nil {
|
||||||
config.Log().Error("failed to schedule report job for user '%s' – %v", u.ID, err)
|
config.Log().Error("failed to schedule report job for user '%s' - %v", u.ID, err)
|
||||||
} else {
|
} else {
|
||||||
logbuch.Info("next report for user %s is scheduled for %v", u.ID, job.NextRun())
|
logbuch.Info("next report for user %s is scheduled for %v", u.ID, job.NextRun())
|
||||||
}
|
}
|
||||||
@ -114,7 +114,7 @@ func (srv *ReportService) Run(user *models.User, duration time.Duration) error {
|
|||||||
|
|
||||||
summary, err := srv.summaryService.Aliased(start, end, user, srv.summaryService.Retrieve, nil, false)
|
summary, err := srv.summaryService.Aliased(start, end, user, srv.summaryService.Retrieve, nil, false)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
config.Log().Error("failed to generate report for '%s' – %v", user.ID, err)
|
config.Log().Error("failed to generate report for '%s' - %v", user.ID, err)
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -126,7 +126,7 @@ func (srv *ReportService) Run(user *models.User, duration time.Duration) error {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if err := srv.mailService.SendReport(user, report); err != nil {
|
if err := srv.mailService.SendReport(user, report); err != nil {
|
||||||
config.Log().Error("failed to send report for '%s' – %v", user.ID, err)
|
config.Log().Error("failed to send report for '%s' - %v", user.ID, err)
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -30,7 +30,7 @@ done
|
|||||||
echo ""
|
echo ""
|
||||||
|
|
||||||
echo "Running test collection ..."
|
echo "Running test collection ..."
|
||||||
newman run "Wakapi API Tests.postman_collection.json"
|
newman run "wakapi_api_tests.postman_collection.json"
|
||||||
exit_code=$?
|
exit_code=$?
|
||||||
|
|
||||||
echo "Shutting down Wakapi ..."
|
echo "Shutting down Wakapi ..."
|
||||||
@ -39,4 +39,4 @@ kill -TERM $pid
|
|||||||
echo "Deleting database ..."
|
echo "Deleting database ..."
|
||||||
rm wakapi_testing.db
|
rm wakapi_testing.db
|
||||||
|
|
||||||
exit $exit_code
|
exit $exit_code
|
||||||
|
@ -12,7 +12,7 @@
|
|||||||
<div class="absolute flex top-0 right-0 mr-8 mt-10 py-2">
|
<div class="absolute flex top-0 right-0 mr-8 mt-10 py-2">
|
||||||
<div class="mx-1">
|
<div class="mx-1">
|
||||||
<a href="login" class="btn-primary">
|
<a href="login" class="btn-primary">
|
||||||
<span class="iconify inline" data-icon="fluent:key-24-filled"></span> Login️</a>
|
<span class="iconify inline" data-icon="fluent:key-24-filled"></span> Login</a>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user