openreplay/backend/pkg/projects/projects.go
Alexander 45c956c489
Json logs format (#1952)
* feat(backend): try a new approach for logs formatting (http)

* feat(backend): added logger module

* feat(backend): added project/session info to /i endpoint

* feat(backend): found a solution for correct caller information

* feat(backend): finished logs for http handlers

* feat(backend): finished logs for mobile http handlers

* feat(backend): finished ender

* feat(backend): finished assets

* feat(backend): finished heuristics

* feat(backend): finished image-storage

* feat(backend): finished sink

* feat(backend): finished storage

* feat(backend): formatted logs in all services

* feat(backend): finished foss part

* feat(backend): added missed foss part

* feat(backend): fixed panic in memory manager and sink service

* feat(backend): connectors
2024-03-14 12:51:14 +01:00

76 lines
2 KiB
Go

package projects
import (
"context"
"errors"
"time"
"openreplay/backend/pkg/cache"
"openreplay/backend/pkg/db/postgres/pool"
"openreplay/backend/pkg/db/redis"
"openreplay/backend/pkg/logger"
)
type Projects interface {
GetProject(projectID uint32) (*Project, error)
GetProjectByKey(projectKey string) (*Project, error)
}
type projectsImpl struct {
log logger.Logger
db pool.Pool
cache Cache
projectsByID cache.Cache
projectsByKeys cache.Cache
}
func New(log logger.Logger, db pool.Pool, redis *redis.Client) Projects {
cl := NewCache(redis)
return &projectsImpl{
log: log,
db: db,
cache: cl,
projectsByID: cache.New(time.Minute*5, time.Minute*10),
projectsByKeys: cache.New(time.Minute*5, time.Minute*10),
}
}
func (c *projectsImpl) GetProject(projectID uint32) (*Project, error) {
if proj, ok := c.projectsByID.Get(projectID); ok {
return proj.(*Project), nil
}
if proj, err := c.cache.GetByID(projectID); err == nil {
c.projectsByID.Set(projectID, proj)
return proj, nil
}
p, err := c.getProject(projectID)
if err != nil {
return nil, err
}
c.projectsByID.Set(projectID, p)
if err = c.cache.Set(p); err != nil && !errors.Is(err, ErrDisabledCache) {
ctx := context.WithValue(context.Background(), "projectID", projectID)
c.log.Error(ctx, "failed to cache project: %s", err)
}
return p, nil
}
func (c *projectsImpl) GetProjectByKey(projectKey string) (*Project, error) {
if proj, ok := c.projectsByKeys.Get(projectKey); ok {
return proj.(*Project), nil
}
if proj, err := c.cache.GetByKey(projectKey); err == nil {
c.projectsByKeys.Set(projectKey, proj)
return proj, nil
}
p, err := c.getProjectByKey(projectKey)
if err != nil {
return nil, err
}
c.projectsByKeys.Set(projectKey, p)
if err := c.cache.Set(p); err != nil && !errors.Is(err, ErrDisabledCache) {
ctx := context.WithValue(context.Background(), "projectKey", projectKey)
c.log.Error(ctx, "failed to cache project: %s", err)
}
return p, nil
}