@DomainNode(searchQueryName = "searchIssues")
@Authorization(name = "READ", allowFromRelated = ["trackables"])
@Authorization(name = "MODERATOR", allowFromRelated = ["trackables"])
@Authorization(name = "COMMENT", allowFromRelated = ["trackables"])
@Authorization(name = "MANAGE_ISSUES", allowFromRelated = ["trackables"])
@Authorization(name = "EXPORT_ISSUES", allowFromRelated = ["trackables"])
class Issue(createdAt: OffsetDateTime, lastModifiedAt: OffsetDateTime, val templatedFields: MutableMap<String, String>, var title: String, var bodyBody: String, var lastUpdatedAt: OffsetDateTime) : AuditedNode, MutableTemplatedNode

An Issue in the Gropius system. Issues can be used to report bugs, request features, ask questions, ... Issues are synced to all IMSProjects of Trackables they are part of. All changes to the Issue are reflected by the timeline. READ is granted if READ is granted on any Trackable in `trackables`. Caution: due to confidentiality reasons, updates to `incomingRelations` do not cause updates on `lastModifiedBy` and `participants`, however, `lastModifiedAt` and `lastUpdatedAt` is still changed. The same applies to RelatedByIssueEvent, RemovedIncomingRelationEvent and IncomingRelationTypeChangedEvent.

Constructors

Link copied to clipboard
constructor(createdAt: OffsetDateTime, lastModifiedAt: OffsetDateTime, templatedFields: MutableMap<String, String>, title: String, bodyBody: String, lastUpdatedAt: OffsetDateTime)

Types

Link copied to clipboard
object Companion

Properties

Link copied to clipboard
@NodeRelationship(type = "AFFECTS", direction = Direction.OUTGOING)
@FilterProperty
val affects: LazyLoadingDelegate<AffectedByIssue, NodeSetPropertyDelegate.NodeSetProperty>

Entities which are in some regard affected by this Issue.

Link copied to clipboard
@NodeRelationship(type = "ISSUE", direction = Direction.INCOMING)
@FilterProperty
val aggregatedBy: LazyLoadingDelegate<AggregatedIssue, NodeSetPropertyDelegate.NodeSetProperty>

AggregatedIssues which aggregate this Issue.

Link copied to clipboard
@NodeRelationship(type = "ARTEFACT", direction = Direction.OUTGOING)
@FilterProperty
val artefacts: LazyLoadingDelegate<Artefact, NodeSetPropertyDelegate.NodeSetProperty>

Artefacts currently assigned to the Issue. For the history, see timelineItems.

Link copied to clipboard
@NodeRelationship(type = "ASSIGNMENT", direction = Direction.OUTGOING)
@FilterProperty
val assignments: LazyLoadingDelegate<Assignment, NodeSetPropertyDelegate.NodeSetProperty>

Current Assignments to this Issue. For the history, see timelineItems.

Link copied to clipboard
@NodeRelationship(type = "BODY", direction = Direction.OUTGOING)
@FilterProperty
val body: LazyLoadingDelegate<Body, NodePropertyDelegate.NodeProperty>

The Body of the Issue, a Comment directly associated with the Issue.

Link copied to clipboard
@SearchProperty
var bodyBody: String
Link copied to clipboard
@FilterProperty
@OrderProperty
val createdAt: OffsetDateTime

The DateTime this entity was created at.

Link copied to clipboard
@NodeRelationship(type = "CREATED_BY", direction = Direction.OUTGOING)
@FilterProperty
val createdBy: LazyLoadingDelegate<User, NodePropertyDelegate.NodeProperty>

The User who created this entity.

Link copied to clipboard
internal var fieldCache: MutableMap<String, Any?>
Link copied to clipboard
val graphQLId: ID

The unique id of this node

Link copied to clipboard
@Id
@GeneratedValue(generatorRef = "nodeIdGenerator")
internal var id: String?
Link copied to clipboard
@NodeRelationship(type = "ISSUE", direction = Direction.INCOMING)
@FilterProperty
val imsIssues: LazyLoadingDelegate<IMSIssue, NodeSetPropertyDelegate.NodeSetProperty>

Descriptions of each IMSProject this issue is synced to containing information specified by the sync

Link copied to clipboard
@NodeRelationship(type = "INCOMING_RELATION", direction = Direction.OUTGOING)
@FilterProperty
val incomingRelations: LazyLoadingDelegate<IssueRelation, NodeSetPropertyDelegate.NodeSetProperty>

Current IssueRelations which have this Issue as end point.

Link copied to clipboard
Link copied to clipboard
internal var isSaved: Boolean
Link copied to clipboard
@NodeRelationship(type = "ISSUE_COMMENT", direction = Direction.OUTGOING)
@FilterProperty
val issueComments: LazyLoadingDelegate<IssueComment, NodeSetPropertyDelegate.NodeSetProperty>

Comments on the Issue, subset of the timeline.

Link copied to clipboard
@NodeRelationship(type = "LABEL", direction = Direction.OUTGOING)
@FilterProperty
val labels: LazyLoadingDelegate<Label, NodeSetPropertyDelegate.NodeSetProperty>

Labels currently assigned to the Issue. For the history, see timelineItems.

Link copied to clipboard
@FilterProperty
@OrderProperty
var lastModifiedAt: OffsetDateTime

The DateTime this entity was last modified at.

Link copied to clipboard
@NodeRelationship(type = "LAST_MODIFIED_BY", direction = Direction.OUTGOING)
@FilterProperty
val lastModifiedBy: LazyLoadingDelegate<User, NodePropertyDelegate.NodeProperty>

The User who last modified this entity.

Link copied to clipboard
@FilterProperty
@OrderProperty
var lastUpdatedAt: OffsetDateTime

The DateTime when the Issue was last updated, this includes a changed timeline.

Link copied to clipboard
@ConvertWith(converter = LazyLoadingContextConverter::class)
internal var lazyLoadingContext: LazyLoadingContext?
Link copied to clipboard
@Version
private var nodeVersion: Long

Version used for optimistic locking

Link copied to clipboard
internal var orderFields: MutableMap<String, Any?>?
Link copied to clipboard
@NodeRelationship(type = "OUTGOING_RELATION", direction = Direction.OUTGOING)
@FilterProperty
val outgoingRelations: LazyLoadingDelegate<IssueRelation, NodeSetPropertyDelegate.NodeSetProperty>

Current IssueRelations which have this Issue as start point.

Link copied to clipboard
@NodeRelationship(type = "PARTICIPANT", direction = Direction.OUTGOING)
@FilterProperty
val participants: LazyLoadingDelegate<User, NodeSetPropertyDelegate.NodeSetProperty>

Users who participated on the Issue, e.g. commented, added Labels, ...

Link copied to clipboard
@NodeRelationship(type = "PINNED_ON", direction = Direction.OUTGOING)
@FilterProperty
val pinnedOn: LazyLoadingDelegate<Trackable, NodeSetPropertyDelegate.NodeSetProperty>

Trackables this Issue is currently pinned on. For the history, see timelineItems.

Link copied to clipboard
@NodeRelationship(type = "PRIORITY", direction = Direction.OUTGOING)
@FilterProperty
@OrderProperty
val priority: LazyLoadingDelegate<IssuePriority?, NodePropertyDelegate.NodeProperty>

The priority of the Issue, e.g. HIGH. Allowed IssuePriorities are defined by the template.

Link copied to clipboard
internal val propertyLookup: MutableMap<String, PropertyDelegate<*>>
Link copied to clipboard
Link copied to clipboard
@NodeRelationship(type = "STATE", direction = Direction.OUTGOING)
@FilterProperty
@OrderProperty
val state: LazyLoadingDelegate<IssueState, NodePropertyDelegate.NodeProperty>

The state of the Issue, e.g. OPEN. Allowed IssueStates are defined by the template. The state also defines if this Issue is considered open or closed.

Link copied to clipboard
@NodeRelationship(type = "USED_IN", direction = Direction.INCOMING)
@FilterProperty
@OrderProperty
open override val template: LazyLoadingDelegate<IssueTemplate, NodePropertyDelegate.NodeProperty>

Template associated with the TemplatedNode

Link copied to clipboard

The values for all templated fields. The schema is defined by the Template of this node

Link copied to clipboard
@NodeRelationship(type = "TIMELINE", direction = Direction.OUTGOING)
@FilterProperty
val timelineItems: LazyLoadingDelegate<TimelineItem, NodeSetPropertyDelegate.NodeSetProperty>

Timeline of the Issue, shows how the Issue changed over time.

Link copied to clipboard
@FilterProperty
@OrderProperty
@SearchProperty
var title: String

Title of the Issue, usually a short description of the Issue.

Link copied to clipboard
@NodeRelationship(type = "ISSUE", direction = Direction.INCOMING)
@FilterProperty
val trackables: LazyLoadingDelegate<Trackable, NodeSetPropertyDelegate.NodeSetProperty>

Trackables this Issue is part of.

Link copied to clipboard
@NodeRelationship(type = "TYPE", direction = Direction.OUTGOING)
@FilterProperty
@OrderProperty
val type: LazyLoadingDelegate<IssueType, NodePropertyDelegate.NodeProperty>

The type of the Issue, e.g. BUG. Allowed IssueTypes are defined by the template.

Functions

Link copied to clipboard
operator override fun equals(other: Any?): Boolean
Link copied to clipboard
internal suspend fun getFromGraphQL(@Autowired nodeQueryParser: NodeQueryParser, dataFetchingEnvironment: DataFetchingEnvironment): Any?
Link copied to clipboard
internal fun <T : PropertyDelegate<*>> getProperty(property: KProperty1<*, *>): T
Link copied to clipboard

Dummy function to avoid GraphQL kotlin optimization weirdness

Link copied to clipboard
override fun hashCode(): Int
Link copied to clipboard
internal suspend fun <T : Node?> loadNodesOfRelationship(property: KProperty1<*, *>, loader: LazyLoadingSubqueryGenerator<T>.() -> Unit?)
Link copied to clipboard
protected fun <T : Node?> NodeProperty(): PropertyDelegateProvider<Node, NodePropertyDelegate<T>>
Link copied to clipboard
protected fun <T : Node> NodeSetProperty(): PropertyDelegateProvider<Node, NodeSetPropertyDelegate<T>>
Link copied to clipboard
internal fun registerQueryResult(entry: NodeQueryEntry<*>, queryResult: Any?)
Link copied to clipboard
open fun templatedField(name: String, @Autowired objectMapper: ObjectMapper): JsonNode?

Value of a field defined by the template. Error if such a field is not defined.

Link copied to clipboard
open fun templatedFields(names: List<String>?, prefixMatching: Boolean?, @Autowired objectMapper: ObjectMapper): List<JSONField>

All templatedFields If `names` is provided, only those matching the name. If `prefixMatching` is true, matching is done by prefix, otherwise by full name.

Link copied to clipboard
open override fun toString(): String