| package services |
|
|
| import ( |
| "context" |
| "fmt" |
|
|
| "github.com/router-for-me/CLIProxyAPI/v6/internal/domain/errors" |
| "github.com/router-for-me/CLIProxyAPI/v6/internal/domain/ports" |
| ) |
|
|
| |
| type LogService struct { |
| repo ports.LogRepository |
| logger Logger |
| } |
|
|
| |
| func NewLogService(repo ports.LogRepository, logger Logger) *LogService { |
| return &LogService{ |
| repo: repo, |
| logger: logger, |
| } |
| } |
|
|
| |
| func (s *LogService) GetLogs(ctx context.Context, after int64, limit int) (*ports.LogContent, error) { |
| if s.logger != nil { |
| s.logger.Debug(ctx, "retrieving logs") |
| } |
|
|
| if !s.repo.IsLoggingEnabled() { |
| return nil, errors.ErrLoggingDisabled |
| } |
|
|
| content, err := s.repo.ReadLogFile(ctx, "", after, limit) |
| if err != nil { |
| if s.logger != nil { |
| s.logger.Error(ctx, "failed to retrieve logs", err) |
| } |
| return nil, err |
| } |
|
|
| return content, nil |
| } |
|
|
| |
| func (s *LogService) DeleteLogs(ctx context.Context) (*ports.DeleteLogResult, error) { |
| if s.logger != nil { |
| s.logger.Debug(ctx, "deleting logs") |
| } |
|
|
| if !s.repo.IsLoggingEnabled() { |
| return nil, errors.ErrLoggingDisabled |
| } |
|
|
| result, err := s.repo.DeleteLogFiles(ctx) |
| if err != nil { |
| if s.logger != nil { |
| s.logger.Error(ctx, "failed to delete logs", err) |
| } |
| return nil, err |
| } |
|
|
| if s.logger != nil { |
| s.logger.Infof(ctx, "logs deleted: %d files removed", result.Removed) |
| } |
|
|
| return result, nil |
| } |
|
|
| |
| func (s *LogService) GetRequestErrorLogs(ctx context.Context) ([]*ports.LogFileInfo, error) { |
| if s.logger != nil { |
| s.logger.Debug(ctx, "retrieving request error logs") |
| } |
|
|
| files, err := s.repo.GetRequestErrorLogs(ctx) |
| if err != nil { |
| if s.logger != nil { |
| s.logger.Error(ctx, "failed to retrieve request error logs", err) |
| } |
| return nil, err |
| } |
|
|
| return files, nil |
| } |
|
|
| |
| func (s *LogService) GetRequestLogByID(ctx context.Context, requestID string) ([]byte, error) { |
| if requestID == "" { |
| return nil, errors.New(errors.InvalidInput, "request ID is empty") |
| } |
|
|
| if s.logger != nil { |
| s.logger.Debugf(ctx, "retrieving request log: %s", requestID) |
| } |
|
|
| data, err := s.repo.GetRequestLogByID(ctx, requestID) |
| if err != nil { |
| if s.logger != nil { |
| s.logger.Error(ctx, fmt.Sprintf("failed to retrieve request log: %s", requestID), err) |
| } |
| return nil, err |
| } |
|
|
| return data, nil |
| } |
|
|
| |
| func (s *LogService) DownloadRequestErrorLog(ctx context.Context, filename string) ([]byte, error) { |
| if filename == "" { |
| return nil, errors.New(errors.InvalidInput, "filename is empty") |
| } |
|
|
| if s.logger != nil { |
| s.logger.Debugf(ctx, "downloading error log: %s", filename) |
| } |
|
|
| data, err := s.repo.DownloadRequestErrorLog(ctx, filename) |
| if err != nil { |
| if s.logger != nil { |
| s.logger.Error(ctx, fmt.Sprintf("failed to download error log: %s", filename), err) |
| } |
| return nil, err |
| } |
|
|
| return data, nil |
| } |
|
|
| |
| var _ ports.LogService = (*LogService)(nil) |
|
|