From 2b89e49e93832a85854ff8b6591c444b2337d283 Mon Sep 17 00:00:00 2001 From: InfiniteStash <117855276+InfiniteStash@users.noreply.github.com> Date: Sat, 23 Nov 2024 22:07:35 +0000 Subject: [PATCH 1/2] Add configurable edit update limits --- frontend/src/components/editCard/EditCard.tsx | 3 +- .../src/graphql/fragments/EditFragment.gql | 2 + frontend/src/graphql/queries/EditUpdate.gql | 2 + frontend/src/graphql/types.ts | 65 ++++++ frontend/src/pages/edits/Edit.tsx | 16 +- frontend/src/pages/edits/EditUpdate.tsx | 13 +- frontend/src/utils/index.ts | 1 + frontend/src/utils/intl.ts | 14 ++ graphql/schema/types/edit.graphql | 2 + pkg/api/resolver_model_edit.go | 18 ++ pkg/api/resolver_mutation_edit.go | 47 ++-- pkg/database/database.go | 2 +- .../postgres/39_edits_updates.up.sql | 3 + pkg/manager/config/config.go | 7 + pkg/manager/edit/edit.go | 5 + pkg/models/edit.go | 1 + pkg/models/generated_exec.go | 220 ++++++++++++++++++ pkg/models/model_edit.go | 25 +- pkg/sqlx/querybuilder_edit.go | 9 + 19 files changed, 397 insertions(+), 58 deletions(-) create mode 100644 frontend/src/utils/intl.ts create mode 100644 pkg/database/migrations/postgres/39_edits_updates.up.sql diff --git a/frontend/src/components/editCard/EditCard.tsx b/frontend/src/components/editCard/EditCard.tsx index e1a69ebd2..e5601f9f2 100644 --- a/frontend/src/components/editCard/EditCard.tsx +++ b/frontend/src/components/editCard/EditCard.tsx @@ -7,7 +7,7 @@ import { Icon, Tooltip } from "src/components/fragments"; import { OperationEnum, EditFragment } from "src/graphql"; -import { formatDateTime, editHref, userHref } from "src/utils"; +import { formatDateTime, editHref, userHref, formatOrdinals } from "src/utils"; import ModifyEdit from "./ModifyEdit"; import EditComment from "./EditComment"; import EditHeader from "./EditHeader"; @@ -78,6 +78,7 @@ const EditCardComponent: FC = ({ edit, showVotes = false }) => {
Updated: {formatDateTime(edit.updated)} + {`${formatOrdinals(edit.update_count)} revision`}
)} diff --git a/frontend/src/graphql/fragments/EditFragment.gql b/frontend/src/graphql/fragments/EditFragment.gql index 0f4030ddd..b68043a36 100644 --- a/frontend/src/graphql/fragments/EditFragment.gql +++ b/frontend/src/graphql/fragments/EditFragment.gql @@ -17,6 +17,8 @@ fragment EditFragment on Edit { updated closed expires + update_count + updatable vote_count destructive comments { diff --git a/frontend/src/graphql/queries/EditUpdate.gql b/frontend/src/graphql/queries/EditUpdate.gql index 8a4e49939..cbb2bf645 100644 --- a/frontend/src/graphql/queries/EditUpdate.gql +++ b/frontend/src/graphql/queries/EditUpdate.gql @@ -12,6 +12,8 @@ query EditUpdate($id: ID!) { applied created updated + updatable + update_count vote_count merge_sources { ... on Tag { diff --git a/frontend/src/graphql/types.ts b/frontend/src/graphql/types.ts index 433f10614..9fa68c65d 100644 --- a/frontend/src/graphql/types.ts +++ b/frontend/src/graphql/types.ts @@ -160,6 +160,8 @@ export type Edit = { /** Object being edited - null if creating a new object */ target?: Maybe; target_type: TargetTypeEnum; + updatable: Scalars["Boolean"]["output"]; + update_count: Scalars["Int"]["output"]; updated?: Maybe; user?: Maybe; /** = Accepted - Rejected */ @@ -1960,6 +1962,8 @@ export type EditFragment = { updated?: string | null; closed?: string | null; expires?: string | null; + update_count: number; + updatable: boolean; vote_count: number; destructive: boolean; comments: Array<{ @@ -3290,6 +3294,8 @@ export type ApplyEditMutation = { updated?: string | null; closed?: string | null; expires?: string | null; + update_count: number; + updatable: boolean; vote_count: number; destructive: boolean; comments: Array<{ @@ -4515,6 +4521,8 @@ export type PerformerEditMutation = { updated?: string | null; closed?: string | null; expires?: string | null; + update_count: number; + updatable: boolean; vote_count: number; destructive: boolean; comments: Array<{ @@ -5550,6 +5558,8 @@ export type PerformerEditUpdateMutation = { updated?: string | null; closed?: string | null; expires?: string | null; + update_count: number; + updatable: boolean; vote_count: number; destructive: boolean; comments: Array<{ @@ -6629,6 +6639,8 @@ export type SceneEditMutation = { updated?: string | null; closed?: string | null; expires?: string | null; + update_count: number; + updatable: boolean; vote_count: number; destructive: boolean; comments: Array<{ @@ -7664,6 +7676,8 @@ export type SceneEditUpdateMutation = { updated?: string | null; closed?: string | null; expires?: string | null; + update_count: number; + updatable: boolean; vote_count: number; destructive: boolean; comments: Array<{ @@ -8698,6 +8712,8 @@ export type StudioEditMutation = { updated?: string | null; closed?: string | null; expires?: string | null; + update_count: number; + updatable: boolean; vote_count: number; destructive: boolean; comments: Array<{ @@ -9733,6 +9749,8 @@ export type StudioEditUpdateMutation = { updated?: string | null; closed?: string | null; expires?: string | null; + update_count: number; + updatable: boolean; vote_count: number; destructive: boolean; comments: Array<{ @@ -10767,6 +10785,8 @@ export type TagEditMutation = { updated?: string | null; closed?: string | null; expires?: string | null; + update_count: number; + updatable: boolean; vote_count: number; destructive: boolean; comments: Array<{ @@ -11802,6 +11822,8 @@ export type TagEditUpdateMutation = { updated?: string | null; closed?: string | null; expires?: string | null; + update_count: number; + updatable: boolean; vote_count: number; destructive: boolean; comments: Array<{ @@ -12980,6 +13002,8 @@ export type VoteMutation = { updated?: string | null; closed?: string | null; expires?: string | null; + update_count: number; + updatable: boolean; vote_count: number; destructive: boolean; comments: Array<{ @@ -14274,6 +14298,8 @@ export type EditQuery = { updated?: string | null; closed?: string | null; expires?: string | null; + update_count: number; + updatable: boolean; vote_count: number; destructive: boolean; comments: Array<{ @@ -15305,6 +15331,8 @@ export type EditUpdateQuery = { applied: boolean; created: string; updated?: string | null; + updatable: boolean; + update_count: number; vote_count: number; merge_sources: Array< | { __typename: "Performer"; id: string } @@ -15747,6 +15775,8 @@ export type EditsQuery = { updated?: string | null; closed?: string | null; expires?: string | null; + update_count: number; + updatable: boolean; vote_count: number; destructive: boolean; comments: Array<{ @@ -17098,6 +17128,8 @@ export type QueryExistingSceneQuery = { updated?: string | null; closed?: string | null; expires?: string | null; + update_count: number; + updatable: boolean; vote_count: number; destructive: boolean; comments: Array<{ @@ -19372,6 +19404,8 @@ export const EditFragmentDoc = { { kind: "Field", name: { kind: "Name", value: "updated" } }, { kind: "Field", name: { kind: "Name", value: "closed" } }, { kind: "Field", name: { kind: "Name", value: "expires" } }, + { kind: "Field", name: { kind: "Name", value: "update_count" } }, + { kind: "Field", name: { kind: "Name", value: "updatable" } }, { kind: "Field", name: { kind: "Name", value: "vote_count" } }, { kind: "Field", name: { kind: "Name", value: "destructive" } }, { @@ -22152,6 +22186,8 @@ export const ApplyEditDocument = { { kind: "Field", name: { kind: "Name", value: "updated" } }, { kind: "Field", name: { kind: "Name", value: "closed" } }, { kind: "Field", name: { kind: "Name", value: "expires" } }, + { kind: "Field", name: { kind: "Name", value: "update_count" } }, + { kind: "Field", name: { kind: "Name", value: "updatable" } }, { kind: "Field", name: { kind: "Name", value: "vote_count" } }, { kind: "Field", name: { kind: "Name", value: "destructive" } }, { @@ -24633,6 +24669,8 @@ export const PerformerEditDocument = { { kind: "Field", name: { kind: "Name", value: "updated" } }, { kind: "Field", name: { kind: "Name", value: "closed" } }, { kind: "Field", name: { kind: "Name", value: "expires" } }, + { kind: "Field", name: { kind: "Name", value: "update_count" } }, + { kind: "Field", name: { kind: "Name", value: "updatable" } }, { kind: "Field", name: { kind: "Name", value: "vote_count" } }, { kind: "Field", name: { kind: "Name", value: "destructive" } }, { @@ -26242,6 +26280,8 @@ export const PerformerEditUpdateDocument = { { kind: "Field", name: { kind: "Name", value: "updated" } }, { kind: "Field", name: { kind: "Name", value: "closed" } }, { kind: "Field", name: { kind: "Name", value: "expires" } }, + { kind: "Field", name: { kind: "Name", value: "update_count" } }, + { kind: "Field", name: { kind: "Name", value: "updatable" } }, { kind: "Field", name: { kind: "Name", value: "vote_count" } }, { kind: "Field", name: { kind: "Name", value: "destructive" } }, { @@ -28037,6 +28077,8 @@ export const SceneEditDocument = { { kind: "Field", name: { kind: "Name", value: "updated" } }, { kind: "Field", name: { kind: "Name", value: "closed" } }, { kind: "Field", name: { kind: "Name", value: "expires" } }, + { kind: "Field", name: { kind: "Name", value: "update_count" } }, + { kind: "Field", name: { kind: "Name", value: "updatable" } }, { kind: "Field", name: { kind: "Name", value: "vote_count" } }, { kind: "Field", name: { kind: "Name", value: "destructive" } }, { @@ -29643,6 +29685,8 @@ export const SceneEditUpdateDocument = { { kind: "Field", name: { kind: "Name", value: "updated" } }, { kind: "Field", name: { kind: "Name", value: "closed" } }, { kind: "Field", name: { kind: "Name", value: "expires" } }, + { kind: "Field", name: { kind: "Name", value: "update_count" } }, + { kind: "Field", name: { kind: "Name", value: "updatable" } }, { kind: "Field", name: { kind: "Name", value: "vote_count" } }, { kind: "Field", name: { kind: "Name", value: "destructive" } }, { @@ -31236,6 +31280,8 @@ export const StudioEditDocument = { { kind: "Field", name: { kind: "Name", value: "updated" } }, { kind: "Field", name: { kind: "Name", value: "closed" } }, { kind: "Field", name: { kind: "Name", value: "expires" } }, + { kind: "Field", name: { kind: "Name", value: "update_count" } }, + { kind: "Field", name: { kind: "Name", value: "updatable" } }, { kind: "Field", name: { kind: "Name", value: "vote_count" } }, { kind: "Field", name: { kind: "Name", value: "destructive" } }, { @@ -32842,6 +32888,8 @@ export const StudioEditUpdateDocument = { { kind: "Field", name: { kind: "Name", value: "updated" } }, { kind: "Field", name: { kind: "Name", value: "closed" } }, { kind: "Field", name: { kind: "Name", value: "expires" } }, + { kind: "Field", name: { kind: "Name", value: "update_count" } }, + { kind: "Field", name: { kind: "Name", value: "updatable" } }, { kind: "Field", name: { kind: "Name", value: "vote_count" } }, { kind: "Field", name: { kind: "Name", value: "destructive" } }, { @@ -34435,6 +34483,8 @@ export const TagEditDocument = { { kind: "Field", name: { kind: "Name", value: "updated" } }, { kind: "Field", name: { kind: "Name", value: "closed" } }, { kind: "Field", name: { kind: "Name", value: "expires" } }, + { kind: "Field", name: { kind: "Name", value: "update_count" } }, + { kind: "Field", name: { kind: "Name", value: "updatable" } }, { kind: "Field", name: { kind: "Name", value: "vote_count" } }, { kind: "Field", name: { kind: "Name", value: "destructive" } }, { @@ -36041,6 +36091,8 @@ export const TagEditUpdateDocument = { { kind: "Field", name: { kind: "Name", value: "updated" } }, { kind: "Field", name: { kind: "Name", value: "closed" } }, { kind: "Field", name: { kind: "Name", value: "expires" } }, + { kind: "Field", name: { kind: "Name", value: "update_count" } }, + { kind: "Field", name: { kind: "Name", value: "updatable" } }, { kind: "Field", name: { kind: "Name", value: "vote_count" } }, { kind: "Field", name: { kind: "Name", value: "destructive" } }, { @@ -38310,6 +38362,8 @@ export const VoteDocument = { { kind: "Field", name: { kind: "Name", value: "updated" } }, { kind: "Field", name: { kind: "Name", value: "closed" } }, { kind: "Field", name: { kind: "Name", value: "expires" } }, + { kind: "Field", name: { kind: "Name", value: "update_count" } }, + { kind: "Field", name: { kind: "Name", value: "updatable" } }, { kind: "Field", name: { kind: "Name", value: "vote_count" } }, { kind: "Field", name: { kind: "Name", value: "destructive" } }, { @@ -40755,6 +40809,8 @@ export const EditDocument = { { kind: "Field", name: { kind: "Name", value: "updated" } }, { kind: "Field", name: { kind: "Name", value: "closed" } }, { kind: "Field", name: { kind: "Name", value: "expires" } }, + { kind: "Field", name: { kind: "Name", value: "update_count" } }, + { kind: "Field", name: { kind: "Name", value: "updatable" } }, { kind: "Field", name: { kind: "Name", value: "vote_count" } }, { kind: "Field", name: { kind: "Name", value: "destructive" } }, { @@ -41910,6 +41966,11 @@ export const EditUpdateDocument = { { kind: "Field", name: { kind: "Name", value: "applied" } }, { kind: "Field", name: { kind: "Name", value: "created" } }, { kind: "Field", name: { kind: "Name", value: "updated" } }, + { kind: "Field", name: { kind: "Name", value: "updatable" } }, + { + kind: "Field", + name: { kind: "Name", value: "update_count" }, + }, { kind: "Field", name: { kind: "Name", value: "vote_count" } }, { kind: "Field", @@ -43389,6 +43450,8 @@ export const EditsDocument = { { kind: "Field", name: { kind: "Name", value: "updated" } }, { kind: "Field", name: { kind: "Name", value: "closed" } }, { kind: "Field", name: { kind: "Name", value: "expires" } }, + { kind: "Field", name: { kind: "Name", value: "update_count" } }, + { kind: "Field", name: { kind: "Name", value: "updatable" } }, { kind: "Field", name: { kind: "Name", value: "vote_count" } }, { kind: "Field", name: { kind: "Name", value: "destructive" } }, { @@ -45862,6 +45925,8 @@ export const QueryExistingSceneDocument = { { kind: "Field", name: { kind: "Name", value: "updated" } }, { kind: "Field", name: { kind: "Name", value: "closed" } }, { kind: "Field", name: { kind: "Name", value: "expires" } }, + { kind: "Field", name: { kind: "Name", value: "update_count" } }, + { kind: "Field", name: { kind: "Name", value: "updatable" } }, { kind: "Field", name: { kind: "Name", value: "vote_count" } }, { kind: "Field", name: { kind: "Name", value: "destructive" } }, { diff --git a/frontend/src/pages/edits/Edit.tsx b/frontend/src/pages/edits/Edit.tsx index 007a651e8..8a3984875 100644 --- a/frontend/src/pages/edits/Edit.tsx +++ b/frontend/src/pages/edits/Edit.tsx @@ -81,15 +81,13 @@ const EditComponent: FC = () => { const buttons = (isAdmin(auth.user) || auth.user?.id === edit.user?.id) && edit.status === VoteStatusEnum.PENDING && (
- {auth.user?.id === edit.user?.id && - edit.operation !== OperationEnum.DESTROY && - !edit.updated && ( - - - - )} + {edit.updatable && ( + + + + )}