GraphQL profile ordering rejected EMAIL_ADDRESS because ProfileOrderField did not expose this enum value in connect and console schemas. Add EMAIL_ADDRESS to MembershipProfileOrderField and its validation list so order input coercion accepts the value consistently. Extend MembershipProfile cursor key encoding to support email ordering and avoid runtime panics during pagination. Update the MCP profile order enum to keep API surface definitions aligned with the same ordering capability. Signed-off-by: Cursor Agent <cursoragent@cursor.com> Co-authored-by: Bryan FRIMIN <bryan@frimin.fr>
170 lines
4.1 KiB
GraphQL
170 lines
4.1 KiB
GraphQL
type Profile implements Node {
|
|
id: ID!
|
|
fullName: String!
|
|
emailAddress: EmailAddr!
|
|
source: String!
|
|
state: ProfileState!
|
|
additionalEmailAddresses: [EmailAddr!]!
|
|
kind: String
|
|
position: String
|
|
contractStartDate: Datetime
|
|
contractEndDate: Datetime
|
|
createdAt: Datetime!
|
|
updatedAt: Datetime!
|
|
|
|
identity: Identity @goField(forceResolver: true)
|
|
organization: Organization @goField(forceResolver: true)
|
|
membership: Membership @goField(forceResolver: true)
|
|
pendingInvitations(
|
|
first: Int
|
|
after: CursorKey
|
|
last: Int
|
|
before: CursorKey
|
|
orderBy: InvitationOrder
|
|
): InvitationConnection @goField(forceResolver: true)
|
|
|
|
permission(action: String!): Boolean!
|
|
@goField(forceResolver: true)
|
|
@session(required: PRESENT)
|
|
}
|
|
|
|
enum ProfileState
|
|
@goModel(model: "go.probo.inc/probo/pkg/coredata.ProfileState") {
|
|
ACTIVE @goEnum(value: "go.probo.inc/probo/pkg/coredata.ProfileStateActive")
|
|
INACTIVE
|
|
@goEnum(value: "go.probo.inc/probo/pkg/coredata.ProfileStateInactive")
|
|
}
|
|
|
|
enum ProfileSource
|
|
@goModel(model: "go.probo.inc/probo/pkg/coredata.ProfileSource") {
|
|
MANUAL
|
|
@goEnum(value: "go.probo.inc/probo/pkg/coredata.ProfileSourceManual")
|
|
SAML @goEnum(value: "go.probo.inc/probo/pkg/coredata.ProfileSourceSAML")
|
|
SCIM @goEnum(value: "go.probo.inc/probo/pkg/coredata.ProfileSourceSCIM")
|
|
}
|
|
|
|
enum ProfileOrderField
|
|
@goModel(model: "go.probo.inc/probo/pkg/coredata.MembershipProfileOrderField") {
|
|
FULL_NAME
|
|
@goEnum(
|
|
value: "go.probo.inc/probo/pkg/coredata.MembershipProfileOrderFieldFullName"
|
|
)
|
|
CREATED_AT
|
|
@goEnum(
|
|
value: "go.probo.inc/probo/pkg/coredata.MembershipProfileOrderFieldCreatedAt"
|
|
)
|
|
EMAIL_ADDRESS
|
|
@goEnum(
|
|
value: "go.probo.inc/probo/pkg/coredata.MembershipProfileOrderFieldEmailAddress"
|
|
)
|
|
KIND @goEnum(value: "go.probo.inc/probo/pkg/coredata.MembershipProfileOrderFieldKind")
|
|
ORGANIZATION_NAME
|
|
@goEnum(
|
|
value: "go.probo.inc/probo/pkg/coredata.MembershipProfileOrderFieldOrganizationName"
|
|
)
|
|
STATE
|
|
@goEnum(
|
|
value: "go.probo.inc/probo/pkg/coredata.MembershipProfileOrderFieldState"
|
|
)
|
|
}
|
|
|
|
input ProfileFilter {
|
|
contractEnded: Boolean
|
|
state: ProfileState
|
|
}
|
|
|
|
input ProfileOrder
|
|
@goModel(
|
|
model: "go.probo.inc/probo/pkg/server/api/connect/v1/types.ProfileOrderBy"
|
|
) {
|
|
direction: OrderDirection!
|
|
field: ProfileOrderField!
|
|
}
|
|
|
|
type ProfileConnection
|
|
@goModel(
|
|
model: "go.probo.inc/probo/pkg/server/api/connect/v1/types.ProfileConnection"
|
|
) {
|
|
totalCount: Int @goField(forceResolver: true)
|
|
edges: [ProfileEdge!]!
|
|
pageInfo: PageInfo!
|
|
}
|
|
|
|
type ProfileEdge {
|
|
cursor: CursorKey!
|
|
node: Profile!
|
|
}
|
|
|
|
extend type Mutation {
|
|
createUser(input: CreateUserInput!): CreateUserPayload
|
|
@session(required: PRESENT)
|
|
deactivateUser(input: DeactivateUserInput!): DeactivateUserPayload
|
|
updateUser(input: UpdateUserInput!): UpdateUserPayload!
|
|
archiveUser(input: ArchiveUserInput!): ArchiveUserPayload
|
|
@session(required: PRESENT)
|
|
removeUser(input: RemoveUserInput!): RemoveUserPayload
|
|
@session(required: PRESENT)
|
|
}
|
|
|
|
input CreateUserInput {
|
|
organizationId: ID!
|
|
fullName: String!
|
|
emailAddress: EmailAddr!
|
|
role: MembershipRole!
|
|
additionalEmailAddresses: [EmailAddr!]
|
|
kind: String
|
|
position: String
|
|
contractStartDate: Datetime @goField(omittable: true)
|
|
contractEndDate: Datetime @goField(omittable: true)
|
|
}
|
|
|
|
input ActivateUserInput {
|
|
organizationId: ID!
|
|
profileId: ID!
|
|
}
|
|
|
|
input DeactivateUserInput {
|
|
organizationId: ID!
|
|
profileId: ID!
|
|
}
|
|
|
|
input UpdateUserInput {
|
|
id: ID!
|
|
fullName: String!
|
|
additionalEmailAddresses: [EmailAddr!]
|
|
kind: String
|
|
position: String
|
|
contractStartDate: Datetime @goField(omittable: true)
|
|
contractEndDate: Datetime @goField(omittable: true)
|
|
}
|
|
|
|
input RemoveUserInput {
|
|
organizationId: ID!
|
|
profileId: ID!
|
|
}
|
|
|
|
input ArchiveUserInput {
|
|
organizationId: ID!
|
|
profileId: ID!
|
|
}
|
|
|
|
type CreateUserPayload {
|
|
profileEdge: ProfileEdge!
|
|
}
|
|
|
|
type DeactivateUserPayload {
|
|
success: Boolean!
|
|
}
|
|
|
|
type UpdateUserPayload {
|
|
profile: Profile!
|
|
}
|
|
|
|
type RemoveUserPayload {
|
|
deletedProfileId: ID!
|
|
}
|
|
|
|
type ArchiveUserPayload {
|
|
archivedProfileId: ID!
|
|
}
|