diff --git a/internal/action/run.go b/internal/action/run.go index bce32c2..83b6434 100644 --- a/internal/action/run.go +++ b/internal/action/run.go @@ -137,6 +137,8 @@ func (s *service) RunAction(action *domain.Action, release domain.Release) ([]st Status: domain.ReleasePushStatusApproved, Action: action.Name, Type: action.Type, + Client: action.Client.Name, + Filter: release.Filter.Name, Rejections: []string{}, Timestamp: time.Now(), } diff --git a/internal/database/migrate.go b/internal/database/migrate.go index 8c3048a..9348a6a 100644 --- a/internal/database/migrate.go +++ b/internal/database/migrate.go @@ -225,6 +225,8 @@ CREATE TABLE release_action_status status TEXT, action TEXT NOT NULL, type TEXT NOT NULL, + client TEXT, + filter TEXT, rejections TEXT [] DEFAULT '{}' NOT NULL, timestamp TIMESTAMP DEFAULT CURRENT_TIMESTAMP, raw TEXT, @@ -805,6 +807,13 @@ CREATE INDEX release_torrent_name_index CREATE INDEX indexer_identifier_index ON indexer (identifier); `, + ` + ALTER TABLE release_action_status + ADD COLUMN client; + + ALTER TABLE release_action_status + ADD COLUMN filter; + `, } const postgresSchema = ` @@ -1049,6 +1058,8 @@ CREATE TABLE release_action_status status TEXT, action TEXT NOT NULL, type TEXT NOT NULL, + client TEXT, + filter TEXT, rejections TEXT [] DEFAULT '{}' NOT NULL, timestamp TIMESTAMP DEFAULT CURRENT_TIMESTAMP, raw TEXT, @@ -1292,4 +1303,11 @@ CREATE INDEX release_torrent_name_index CREATE INDEX indexer_identifier_index ON indexer (identifier); `, + ` + ALTER TABLE release_action_status + ADD COLUMN client; + + ALTER TABLE release_action_status + ADD COLUMN filter; + `, } diff --git a/internal/database/release.go b/internal/database/release.go index a8d543a..9a807f3 100644 --- a/internal/database/release.go +++ b/internal/database/release.go @@ -75,8 +75,8 @@ func (repo *ReleaseRepo) StoreReleaseActionStatus(ctx context.Context, a *domain } else { queryBuilder := repo.db.squirrel. Insert("release_action_status"). - Columns("status", "action", "type", "rejections", "timestamp", "release_id"). - Values(a.Status, a.Action, a.Type, pq.Array(a.Rejections), a.Timestamp, a.ReleaseID). + Columns("status", "action", "type", "client", "filter", "rejections", "timestamp", "release_id"). + Values(a.Status, a.Action, a.Type, a.Client, a.Filter, pq.Array(a.Rejections), a.Timestamp, a.ReleaseID). Suffix("RETURNING id").RunWith(repo.db.handler) // return values @@ -160,11 +160,12 @@ func (repo *ReleaseRepo) findReleases(ctx context.Context, tx *Tx, params domain } query, args, err := queryBuilder.ToSql() - repo.log.Trace().Str("database", "release.find").Msgf("query: '%v', args: '%v'", query, args) if err != nil { return nil, 0, 0, errors.Wrap(err, "error building query") } + repo.log.Trace().Str("database", "release.find").Msgf("query: '%v', args: '%v'", query, args) + res := make([]*domain.Release, 0) rows, err := tx.QueryContext(ctx, query, args...) @@ -207,7 +208,7 @@ func (repo *ReleaseRepo) findReleases(ctx context.Context, tx *Tx, params domain func (repo *ReleaseRepo) FindRecent(ctx context.Context) ([]*domain.Release, error) { tx, err := repo.db.BeginTx(ctx, &sql.TxOptions{}) if err != nil { - return nil, err + return nil, errors.Wrap(err, "error begin transaction") } defer tx.Rollback() @@ -225,8 +226,7 @@ func (repo *ReleaseRepo) FindRecent(ctx context.Context) ([]*domain.Release, err } if err = tx.Commit(); err != nil { - repo.log.Error().Stack().Err(err).Msg("error finding releases") - return nil, err + return nil, errors.Wrap(err, "error transaction commit") } return releases, nil @@ -240,25 +240,23 @@ func (repo *ReleaseRepo) findRecentReleases(ctx context.Context, tx *Tx) ([]*dom Limit(10) query, args, err := queryBuilder.ToSql() - repo.log.Trace().Str("database", "release.find").Msgf("query: '%v', args: '%v'", query, args) if err != nil { - repo.log.Error().Stack().Err(err).Msg("error building query") - return nil, err + return nil, errors.Wrap(err, "error building query") } + repo.log.Trace().Str("database", "release.find").Msgf("query: '%v', args: '%v'", query, args) + res := make([]*domain.Release, 0) rows, err := tx.QueryContext(ctx, query, args...) if err != nil { - repo.log.Error().Stack().Err(err).Msg("error fetching releases") - return res, nil + return res, errors.Wrap(err, "error executing query") } defer rows.Close() if err := rows.Err(); err != nil { - repo.log.Error().Stack().Err(err) - return res, err + return res, errors.Wrap(err, "rows error") } for rows.Next() { @@ -267,8 +265,7 @@ func (repo *ReleaseRepo) findRecentReleases(ctx context.Context, tx *Tx) ([]*dom var indexer, filter sql.NullString if err := rows.Scan(&rls.ID, &rls.FilterStatus, pq.Array(&rls.Rejections), &indexer, &filter, &rls.Protocol, &rls.Title, &rls.TorrentName, &rls.Size, &rls.Timestamp); err != nil { - repo.log.Error().Stack().Err(err).Msg("release.find: error scanning data to struct") - return res, err + return res, errors.Wrap(err, "error scanning row") } rls.Indexer = indexer.String @@ -290,23 +287,20 @@ func (repo *ReleaseRepo) GetIndexerOptions(ctx context.Context) ([]string, error rows, err := repo.db.handler.QueryContext(ctx, query) if err != nil { - repo.log.Error().Stack().Err(err).Msg("error fetching indexer list") - return res, err + return res, errors.Wrap(err, "error executing query") } defer rows.Close() if err := rows.Err(); err != nil { - repo.log.Error().Stack().Err(err) - return res, err + return res, errors.Wrap(err, "rows error") } for rows.Next() { var indexer string if err := rows.Scan(&indexer); err != nil { - repo.log.Error().Stack().Err(err).Msg("release.find: error scanning data to struct") - return res, err + return res, errors.Wrap(err, "error scanning row") } res = append(res, indexer) @@ -318,18 +312,20 @@ func (repo *ReleaseRepo) GetIndexerOptions(ctx context.Context) ([]string, error func (repo *ReleaseRepo) GetActionStatusByReleaseID(ctx context.Context, releaseID int64) ([]domain.ReleaseActionStatus, error) { queryBuilder := repo.db.squirrel. - Select("id", "status", "action", "type", "rejections", "timestamp"). + Select("id", "status", "action", "type", "client", "filter", "rejections", "timestamp"). From("release_action_status"). Where("release_id = ?", releaseID) query, args, err := queryBuilder.ToSql() + if err != nil { + return nil, errors.Wrap(err, "error building query") + } res := make([]domain.ReleaseActionStatus, 0) rows, err := repo.db.handler.QueryContext(ctx, query, args...) if err != nil { - repo.log.Error().Stack().Err(err).Msg("error fetching releases") - return res, nil + return res, errors.Wrap(err, "error executing query") } defer rows.Close() @@ -342,11 +338,15 @@ func (repo *ReleaseRepo) GetActionStatusByReleaseID(ctx context.Context, release for rows.Next() { var rls domain.ReleaseActionStatus - if err := rows.Scan(&rls.ID, &rls.Status, &rls.Action, &rls.Type, pq.Array(&rls.Rejections), &rls.Timestamp); err != nil { - repo.log.Error().Stack().Err(err).Msg("release.find: error scanning data to struct") - return res, err + var client, filter sql.NullString + + if err := rows.Scan(&rls.ID, &rls.Status, &rls.Action, &rls.Type, &client, &filter, pq.Array(&rls.Rejections), &rls.Timestamp); err != nil { + return res, errors.Wrap(err, "error scanning row") } + rls.Client = client.String + rls.Filter = filter.String + res = append(res, rls) } @@ -356,11 +356,14 @@ func (repo *ReleaseRepo) GetActionStatusByReleaseID(ctx context.Context, release func (repo *ReleaseRepo) attachActionStatus(ctx context.Context, tx *Tx, releaseID int64) ([]domain.ReleaseActionStatus, error) { queryBuilder := repo.db.squirrel. - Select("id", "status", "action", "type", "rejections", "timestamp"). + Select("id", "status", "action", "type", "client", "filter", "rejections", "timestamp"). From("release_action_status"). Where("release_id = ?", releaseID) query, args, err := queryBuilder.ToSql() + if err != nil { + return nil, errors.Wrap(err, "error building query") + } res := make([]domain.ReleaseActionStatus, 0) @@ -378,10 +381,15 @@ func (repo *ReleaseRepo) attachActionStatus(ctx context.Context, tx *Tx, release for rows.Next() { var rls domain.ReleaseActionStatus - if err := rows.Scan(&rls.ID, &rls.Status, &rls.Action, &rls.Type, pq.Array(&rls.Rejections), &rls.Timestamp); err != nil { + var client, filter sql.NullString + + if err := rows.Scan(&rls.ID, &rls.Status, &rls.Action, &rls.Type, &client, &filter, pq.Array(&rls.Rejections), &rls.Timestamp); err != nil { return res, errors.Wrap(err, "error scanning row") } + rls.Client = client.String + rls.Filter = filter.String + res = append(res, rls) } diff --git a/internal/domain/release.go b/internal/domain/release.go index a9896a0..a3b7e8d 100644 --- a/internal/domain/release.go +++ b/internal/domain/release.go @@ -92,6 +92,8 @@ type ReleaseActionStatus struct { Status ReleasePushStatus `json:"status"` Action string `json:"action"` Type ActionType `json:"type"` + Client string `json:"client"` + Filter string `json:"filter"` Rejections []string `json:"rejections"` Timestamp time.Time `json:"timestamp"` ReleaseID int64 `json:"-"` diff --git a/web/src/components/data-table/Cells.tsx b/web/src/components/data-table/Cells.tsx index 04b6308..a13749e 100644 --- a/web/src/components/data-table/Cells.tsx +++ b/web/src/components/data-table/Cells.tsx @@ -4,6 +4,7 @@ import { CheckIcon } from "@heroicons/react/solid"; import { ClockIcon, BanIcon, ExclamationCircleIcon } from "@heroicons/react/outline"; import { classNames, simplifyDate } from "../../utils"; +import { Tooltip } from "../tooltips/Tooltip"; interface CellProps { value: string; @@ -52,30 +53,42 @@ const StatusCellMap: Record = { } }; -const GetReleaseStatusString = (releaseAction: ReleaseActionStatus) => { - const items: Array = [ - `action: ${releaseAction.action}`, - `type: ${releaseAction.type}`, - `status: ${releaseAction.status}`, - `time: ${simplifyDate(releaseAction.timestamp)}` - ]; - if (releaseAction.rejections.length) - items.push(`rejections: ${releaseAction.rejections}`); - return items.join(" | "); -}; +// const GetReleaseStatusString = (releaseAction: ReleaseActionStatus) => { +// const items: Array = [ +// `action: ${releaseAction.action}`, +// `type: ${releaseAction.type}`, +// `status: ${releaseAction.status}`, +// `time: ${simplifyDate(releaseAction.timestamp)}` +// ]; +// if (releaseAction.client != "") +// items.push(`client: ${releaseAction.client}`); +// if (releaseAction.filter != "") +// items.push(`filter: ${releaseAction.filter}`); +// if (releaseAction.rejections.length) +// items.push(`rejections: ${releaseAction.rejections}`); +// return items.join(" | "); +// }; export const ReleaseStatusCell = ({ value }: ReleaseStatusCellProps) => (
{value.map((v, idx) => (
- {StatusCellMap[v.status].icon} + +
    +
  1. Status: {v.status}
  2. +
  3. Action: {v.action}
  4. +
  5. Type: {v.type}
  6. + {v.client &&
  7. Client: {v.client}
  8. } + {v.filter &&
  9. Filter: {v.filter}
  10. } +
  11. Time: {simplifyDate(v.timestamp)}
  12. +
+
))}
diff --git a/web/src/components/tooltips/Tooltip.tsx b/web/src/components/tooltips/Tooltip.tsx new file mode 100644 index 0000000..2f5dd30 --- /dev/null +++ b/web/src/components/tooltips/Tooltip.tsx @@ -0,0 +1,15 @@ +import { ReactNode } from "react"; + +export const Tooltip = ({ children, button } : { + message?: string, children: ReactNode, button: ReactNode +}) => { + return ( +
+ {button} +
+ {children} +
+
+
+ ); +}; \ No newline at end of file diff --git a/web/src/screens/releases/ReleaseTable.tsx b/web/src/screens/releases/ReleaseTable.tsx index 7c3b0fe..0ae5a2d 100644 --- a/web/src/screens/releases/ReleaseTable.tsx +++ b/web/src/screens/releases/ReleaseTable.tsx @@ -191,7 +191,7 @@ export const ReleaseTable = () => { )) )} -
+
{headerGroups.map((headerGroup) => { @@ -269,7 +269,7 @@ export const ReleaseTable = () => {
- Page {pageIndex + 1} of {pageOptions.length} + Page {pageIndex + 1} of {pageOptions.length}