etouch docs
API GraphQL

Types GraphQL

Documentation detaillee de tous les types GraphQL du schema etouch

Documentation complete des types definis dans apps/api/src/graphql/schema.graphql (1816 lignes).

Scalaires

ScalaireDescription
DateTimeDate/heure ISO 8601
JSONObjet JSON arbitraire

Enums

ProjectWorkflowState

Etats du workflow projet :

ValeurDescription
STUDIO_REVIEWRevue initiale par le studio
CLIENT_REVIEWSelection par le client
SELECTION_CONFIRMATIONConfirmation de la selection
IN_RETOUCHRetouche en cours
CLIENT_VALIDATIONValidation finale client
DONEProjet termine
ARCHIVEDProjet archive

OrganizationType

ValeurDescription
PLATFORMAdministrateurs systeme
STUDIOStudios photo
CLIENTClients
RETOUCHERRetoucheurs

AssetType

ValeurDescription
PHOTOPhotographie
VIDEOVideo
DOCUMENTDocument

AssetStatus

ValeurDescription
UPLOADINGUpload en cours
UPLOADEDUpload termine
PROCESSINGTraitement en cours
READYPret a l'usage
DELIVEREDLivre au client
ARCHIVEDArchive

ClientValidationStatus

ValeurDescription
PENDINGEn attente
APPROVEDApprouve
REJECTEDRejete

NotificationChannel

ValeurDescription
IN_APPNotification in-app
EMAILEmail
PUSHPush notification
WEBHOOKWebhook

GuidelineCategory

ValeurDescription
ON_MODELPhotographie sur modele
GHOSTMannequin fantome
FLATFlat lay
ACCESSORIESAccessoires
SHOESChaussures
JEWELRYBijoux
OTHERAutre

RetouchingCategory

ValeurDescription
CLOTHES_FLATVetements flat
CLOTHES_GHOSTVetements ghost
CLOTHES_GHOST_COMPLEXGhost complexe
CLOTHES_ON_MODELVetements sur modele
PIQUEPique
SHOES_ACCESSORIESChaussures et accessoires
SUNGLASSESLunettes de soleil
CLIPPINGDetourage
DETAILDetail
STACKEDEmpilement
JEWELLERYBijouterie
EXTRA_FORMAT_VARIANTVariante format extra
EXTRA_RECROPPINGRecadrage extra
EXTRA_COLOR_CHANGEChangement couleur extra

PaymentStatus

Valeur
UNPAID
PAID

InvoiceStatus

Valeur
DRAFT
OPEN
PAID
VOID
UNCOLLECTIBLE

QuoteStatus

Valeur
DRAFT
PUBLISHED

Autres enums

EnumValeurs
UploadBatchTypeSTANDARD, PRIORITY
DashboardTimeRangeLAST_7_DAYS, PREVIOUS_7_DAYS, LAST_30_DAYS, LAST_90_DAYS
IntegrationTypeOFFICIAL, EXTERNAL
IntegrationSettingTypeSWITCH, TEXT, SELECT
GlobalSearchResultTypePROJECT, CLIENT, RETOUCHER, ASSET, GUIDELINE, USER
ImportJobTypePENNYLANE_CUSTOMERS
ImportJobStatusPENDING, IN_PROGRESS, COMPLETED, FAILED, CANCELLED
FtpSyncDirectionPUSH, PULL
FtpSyncFolderTypeRAW, RETOUCHED
FtpSyncStatusPENDING, RUNNING, COMPLETED, FAILED
PriceMatchTypeAUTOMATIC, MANUAL
OrganizationSourceSYSTEM, PENNYLANE
LegalDocumentCodeTERMS_OF_USE, PRIVACY_POLICY

Types principaux

Viewer

Contexte de l'utilisateur connecte.

type Viewer {
  user: User
  organizations: [Organization!]!
  activeOrganization: Organization
  permissions: [String!]!
  roles: [String!]!
  isImpersonated: Boolean!
  impersonatedBy: String
}

Organization

type Organization {
  id: ID!
  name: String!
  slug: String!
  type: OrganizationType!
  timezone: String!
  locale: String!
  logoUrl: String
  settings: OrganizationSettings
  profile: OrganizationProfile
  parentOrganizationId: ID
  parent: Organization
  children: [Organization!]!
  guidelineFiles: [GuidelineFile!]!
  retouchCategories: [RetouchCategory!]!
  createdAt: DateTime!
}

OrganizationProfile

type OrganizationProfile {
  contact: OrganizationContactInfo
  address: OrganizationAddress
  billingAddress: OrganizationAddress
  siren: String
  tradeName: String
  vatNumber: String
  avatarUrl: String
  studioStatus: String
  clientStatus: String
  retoucherStatus: String
  tags: [String!]
  projectsCount: Int!
  totalAssetCount: Int!
  storageUsageBytes: String!
  validationRate: Float
  lastProjectDate: DateTime
  downloadAuthorization: String
  source: OrganizationSource
}

Project

type Project {
  id: ID!
  reference: String!
  name: String!
  workflowState: ProjectWorkflowState!
  retouchEnabled: Boolean!
  retouchingCategory: RetouchingCategory
  studio: Organization!
  client: Organization!
  guidelineFile: GuidelineFile
  guidelines: [GuidelineFile!]!
  currentRoundNumber: Int!
  members: [ProjectMember!]!
  retouchVendors: [ProjectRetouchVendor!]!
  assets(input: PaginationInput): AssetConnection!
  retouchRounds(input: PaginationInput): RetouchRoundConnection!
  workflowEvents(input: PaginationInput): WorkflowEventConnection!
  comments(input: PaginationInput): CommentConnection!
  shootingDate: DateTime!
  kickoffDate: DateTime
  deadlineDate: DateTime
  createdAt: DateTime!
  updatedAt: DateTime!
  paymentStatus: PaymentStatus
  downloadUnlocked: Boolean
  billing: ProjectBilling
  pricingItems: [ProjectPricingItem!]!
  quoteStatus: QuoteStatus
  totalAssetCount: Int!
  retouchedAssetCount: Int!
  archivedAt: DateTime
  isPublic: Boolean!
  publicToken: String
}

Asset

type Asset {
  id: ID!
  title: String
  description: String
  status: AssetStatus!
  assetType: AssetType!
  sku: String
  view: String
  viewIndex: Int
  variation: String
  extraFormat: String
  originalUrl: String
  storageKey: String!
  sizeInBytes: String
  priority: Int!
  isHighEndRetouch: Boolean!
  isSelected: Boolean!
  clientValidationStatus: ClientValidationStatus!
  previewUrl: String
  thumbnailUrl: String
  retouchPreviewUrl: String
  retouchThumbnailUrl: String
  format: String
  uploader: User!
  versions: [AssetVersion!]!
  comments: [Comment!]!
  retouchVersions(input: PaginationInput): RetouchVersionConnection!
  metadata: JSON!
  tags: [String!]!
  uploadedAt: DateTime!
}

User

type User {
  id: ID!
  email: String!
  displayName: String!
  avatarUrl: String
  locale: String
  timezone: String
  lastLoginAt: DateTime
  emailVerified: Boolean!
  mfaEnabled: Boolean!
  createdAt: DateTime!
  isActive: Boolean!
  roles: [String!]!
  organizations: [UserOrganizationMembership!]!
  projects: [UserProjectSummary!]!
  _count: UserEntityCount!
}

GuidelineFile

type GuidelineFile {
  id: ID!
  name: String!
  category: GuidelineCategory!
  view: String!
  filePath: String!
  fileName: String!
  extension: String!
  sizeInBytes: String
  referenceImages: [GuidelineReferenceImage!]!
  imageSpecifications: JSON
  createdAt: DateTime!
  updatedAt: DateTime!
  organization: Organization!
  pricingCategories: [GuidelinePricingCategory!]!
  organizationPrices(organizationId: ID): [GuidelineOrganizationPrice!]!
}

Invoice

type Invoice {
  id: ID!
  stripeInvoiceId: String
  stripeInvoicePdf: String
  stripeHostedUrl: String
  receiptUrl: String
  totalCents: Int!
  status: InvoiceStatus!
  createdAt: DateTime!
  dueDate: DateTime
  paidAt: DateTime
  voidedAt: DateTime
  project: Project
}

ProjectBilling

type ProjectBilling {
  currency: String!
  pricingModel: String!
  clientUnitPrice: Int
  retoucherUnitPrice: Int
  pricingItems: [ProjectPricingItem!]!
  estimatedTotalRevenue: Int
  estimatedTotalCost: Int
  estimatedMargin: Int
  estimatedMarginPercent: Float
}

Integration

type Integration {
  id: ID!
  name: String!
  category: String!
  active: Boolean!
  logo: String
  shortDescription: String
  description: String
  overview: String
  images: [String!]!
  installed: Boolean!
  type: IntegrationType!
  developerName: String
  website: String
  scopes: [String!]
  installUrl: String
  createdAt: DateTime
  status: String
  lastUsedAt: DateTime
  settings: [IntegrationSetting!]
  userSettings: [IntegrationSetting!]
  requiredSettingIds: [String!]
  requiresSettings: Boolean
  installMode: String
}

Comment

type Comment {
  id: ID!
  body: String!
  context: JSON
  author: User!
  createdAt: DateTime!
  replies: [Comment!]!
}

WorkflowEvent

type WorkflowEvent {
  id: ID!
  fromState: ProjectWorkflowState
  toState: ProjectWorkflowState!
  message: String
  metadata: JSON
  createdAt: DateTime!
  actor: User!
}

Notification

type Notification {
  id: ID!
  type: String!
  title: String!
  message: String!
  payload: JSON
  createdAt: DateTime!
  channels: [NotificationDelivery!]!
}

RetouchRound

type RetouchRound {
  id: ID!
  roundNumber: Int!
  status: String!
  startedAt: DateTime
  completedAt: DateTime
  createdAt: DateTime!
  updatedAt: DateTime!
  versions(input: PaginationInput): RetouchVersionConnection!
}

RetouchVersion

type RetouchVersion {
  id: ID!
  filePath: String!
  previewUrl: String
  thumbnailUrl: String
  format: String
  baseVariant: String
  crop: String
  status: String!
  feedback: String
  createdAt: DateTime!
  asset: Asset!
  uploadedBy: User!
}

DashboardOverview

type DashboardOverview {
  stats: DashboardStatsSummary!
  completionTrend: [DashboardCompletionPoint!]!
  recentProjects: [DashboardProjectSummary!]!
  topClients: [DashboardTopClient!]!
  topRetouchers: [DashboardTopRetoucher!]!
  activities: [DashboardActivity!]!
  projectStateSummary: [DashboardProjectStateSummary!]!
}

DownloadEvent

type DownloadEvent {
  id: ID!
  projectId: ID!
  userId: ID!
  assetIds: [String!]!
  assetCount: Int!
  downloadType: String!
  createdAt: DateTime!
  project: Project!
  user: User!
}