package capa import ( "log/slog" "net/url" "net/http" "fmt" "io" "git.jmbit.de/jmb/scanfile/server/internal/database" "git.jmbit.de/jmb/scanfile/server/internal/sqlc" "github.com/jackc/pgx/v5/pgtype" "github.com/spf13/viper" ) func CapaProcessing(job sqlc.ProcessingJob) error { database.StartProcessingJob(job.ID) capaBytes, err := CapaScan(job.FileID) if err != nil { database.FailProcessingJob(job.ID, err) slog.Error("Error processing file", "file-uuid", job.FileID.String(), "error", err) return err } var params sqlc.InsertFileCapaParams params.FileID = job.FileID params.Data = capaBytes err = database.InsertFileCapa(params) if err != nil { database.FailProcessingJob(job.ID, err) slog.Error("Error processing file CAPA data", "file-uuid", job.FileID.String(), "error", err) return err } database.FinishProcessingJob(job.ID) return nil } func CapaScan(fileID pgtype.UUID) ([]byte, error) { var by []byte slog.Debug("Started Capa scan", "file-uuid", fileID.String()) capaUrl, err := url.Parse(viper.GetString("processing.capaurl")) if err != nil { slog.Error("Error in CapaScan parsing URL for ole service", "file-uuid", fileID.String(), "error", err) return by, err } capaUrl.Path = "/capa/analyze" capaUrl.RawQuery = fmt.Sprintf("file=%s", fileID.String()) capaResp, err := http.Get(capaUrl.String()) slog.Debug("CAPA scan request", "file-uuid", fileID.String(), "url", capaUrl.String(), "status-code", capaResp.StatusCode) if err != nil { slog.Error("Error in CapaScan getting capa result from service", "file-uuid", fileID.String(), "error", err) } defer capaResp.Body.Close() body, err := io.ReadAll(capaResp.Body) if err != nil { slog.Error("Error in CapaScan parsing body", "file-uuid", fileID.String(), "error", err) } slog.Debug("CapaScan", "file-uuid", fileID.String(), "data", body) return body, nil }