-
Notifications
You must be signed in to change notification settings - Fork 25
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
#1275 List of issue service configurations
- Loading branch information
1 parent
3d37be7
commit d02e08c
Showing
8 changed files
with
207 additions
and
120 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
33 changes: 18 additions & 15 deletions
33
...ension-issues/src/main/java/net/nemerosa/ontrack/extension/issues/IssueServiceRegistry.kt
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,31 +1,34 @@ | ||
package net.nemerosa.ontrack.extension.issues; | ||
package net.nemerosa.ontrack.extension.issues | ||
|
||
import net.nemerosa.ontrack.extension.issues.model.ConfiguredIssueService; | ||
import net.nemerosa.ontrack.extension.issues.model.IssueServiceConfigurationRepresentation; | ||
import org.jetbrains.annotations.Nullable; | ||
import net.nemerosa.ontrack.common.asOptional | ||
import net.nemerosa.ontrack.extension.issues.model.ConfiguredIssueService | ||
import net.nemerosa.ontrack.extension.issues.model.IssueServiceConfigurationRepresentation | ||
import java.util.* | ||
|
||
import java.util.Collection; | ||
import java.util.List; | ||
import java.util.Optional; | ||
|
||
public interface IssueServiceRegistry { | ||
interface IssueServiceRegistry { | ||
|
||
/** | ||
* Gets all the issue services | ||
*/ | ||
Collection<IssueServiceExtension> getIssueServices(); | ||
val issueServices: Collection<IssueServiceExtension> | ||
|
||
/** | ||
* Gets an issue service by its ID. It may be present or not. | ||
*/ | ||
fun findIssueServiceById(id: String): IssueServiceExtension? | ||
|
||
/** | ||
* Gets an issue service by its ID. It may be present or not. | ||
*/ | ||
Optional<IssueServiceExtension> getOptionalIssueService(String id); | ||
@Deprecated("Use findIssueServiceById", replaceWith = ReplaceWith("findIssueServiceById")) | ||
fun getOptionalIssueService(id: String): Optional<IssueServiceExtension> = | ||
findIssueServiceById(id).asOptional() | ||
|
||
List<IssueServiceConfigurationRepresentation> getAvailableIssueServiceConfigurations(); | ||
val availableIssueServiceConfigurations: List<IssueServiceConfigurationRepresentation> | ||
|
||
/** | ||
* Gets the association between a service and a configuration, or <code>null</code> | ||
* Gets the association between a service and a configuration, or `null` | ||
* if neither service nor configuration can be found. | ||
*/ | ||
@Nullable | ||
ConfiguredIssueService getConfiguredIssueService(String issueServiceConfigurationIdentifier); | ||
fun getConfiguredIssueService(issueServiceConfigurationIdentifier: String): ConfiguredIssueService? | ||
} |
33 changes: 33 additions & 0 deletions
33
...a/net/nemerosa/ontrack/extension/issues/graphql/GQLRootQueryIssueServiceConfigurations.kt
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,33 @@ | ||
package net.nemerosa.ontrack.extension.issues.graphql | ||
|
||
import graphql.schema.GraphQLFieldDefinition | ||
import net.nemerosa.ontrack.extension.issues.IssueServiceRegistry | ||
import net.nemerosa.ontrack.extension.issues.model.IssueServiceConfigurationRepresentation | ||
import net.nemerosa.ontrack.graphql.schema.GQLRootQuery | ||
import net.nemerosa.ontrack.graphql.support.listType | ||
import org.springframework.stereotype.Component | ||
|
||
@Component | ||
class GQLRootQueryIssueServiceConfigurations( | ||
private val issueServiceConfigurationRepresentationGQLType: IssueServiceConfigurationRepresentationGQLType, | ||
private val issueServiceRegistry: IssueServiceRegistry, | ||
) : GQLRootQuery { | ||
|
||
override fun getFieldDefinition(): GraphQLFieldDefinition = | ||
GraphQLFieldDefinition.newFieldDefinition() | ||
.name("issueServiceConfigurations") | ||
.description("List of issue services") | ||
.type(listType(issueServiceConfigurationRepresentationGQLType.typeRef)) | ||
.dataFetcher { | ||
issueServiceRegistry.issueServices.flatMap { service -> | ||
service.configurationList.map { config -> | ||
IssueServiceConfigurationRepresentation.of( | ||
issueServiceExtension = service, | ||
issueServiceConfiguration = config, | ||
) | ||
} | ||
} | ||
} | ||
.build() | ||
|
||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
106 changes: 46 additions & 60 deletions
106
...s/src/main/java/net/nemerosa/ontrack/extension/issues/support/IssueServiceRegistryImpl.kt
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,77 +1,63 @@ | ||
package net.nemerosa.ontrack.extension.issues.support; | ||
package net.nemerosa.ontrack.extension.issues.support | ||
|
||
import net.nemerosa.ontrack.extension.api.ExtensionManager; | ||
import net.nemerosa.ontrack.extension.issues.IssueServiceExtension; | ||
import net.nemerosa.ontrack.extension.issues.IssueServiceRegistry; | ||
import net.nemerosa.ontrack.extension.issues.model.ConfiguredIssueService; | ||
import net.nemerosa.ontrack.extension.issues.model.IssueServiceConfiguration; | ||
import net.nemerosa.ontrack.extension.issues.model.IssueServiceConfigurationIdentifier; | ||
import net.nemerosa.ontrack.extension.issues.model.IssueServiceConfigurationRepresentation; | ||
import org.springframework.beans.factory.annotation.Autowired; | ||
import org.springframework.stereotype.Service; | ||
|
||
import java.util.*; | ||
import java.util.stream.Collectors; | ||
import net.nemerosa.ontrack.extension.api.ExtensionManager | ||
import net.nemerosa.ontrack.extension.issues.IssueServiceExtension | ||
import net.nemerosa.ontrack.extension.issues.IssueServiceRegistry | ||
import net.nemerosa.ontrack.extension.issues.model.ConfiguredIssueService | ||
import net.nemerosa.ontrack.extension.issues.model.IssueServiceConfigurationIdentifier.Companion.parse | ||
import net.nemerosa.ontrack.extension.issues.model.IssueServiceConfigurationRepresentation | ||
import net.nemerosa.ontrack.extension.issues.model.IssueServiceConfigurationRepresentation.Companion.of | ||
import org.springframework.stereotype.Service | ||
|
||
@Service | ||
public class IssueServiceRegistryImpl implements IssueServiceRegistry { | ||
|
||
private final ExtensionManager extensionManager; | ||
|
||
@Autowired | ||
public IssueServiceRegistryImpl(ExtensionManager extensionManager) { | ||
this.extensionManager = extensionManager; | ||
} | ||
|
||
protected Map<String, IssueServiceExtension> getIssueServiceExtensionMap() { | ||
return extensionManager.getExtensions(IssueServiceExtension.class).stream() | ||
.collect(Collectors.toMap( | ||
IssueServiceExtension::getId, | ||
x -> x | ||
) | ||
); | ||
} | ||
class IssueServiceRegistryImpl( | ||
private val extensionManager: ExtensionManager | ||
) : IssueServiceRegistry { | ||
|
||
@Override | ||
public Collection<IssueServiceExtension> getIssueServices() { | ||
return getIssueServiceExtensionMap().values(); | ||
private val issueServiceExtensionMap: Map<String, IssueServiceExtension> by lazy { | ||
extensionManager.getExtensions(IssueServiceExtension::class.java).associateBy { it.id } | ||
} | ||
|
||
@Override | ||
public Optional<IssueServiceExtension> getOptionalIssueService(String id) { | ||
return Optional.ofNullable(getIssueServiceExtensionMap().get(id)); | ||
} | ||
override val issueServices: Collection<IssueServiceExtension> | ||
get() { | ||
return issueServiceExtensionMap.values | ||
} | ||
|
||
@Override | ||
public List<IssueServiceConfigurationRepresentation> getAvailableIssueServiceConfigurations() { | ||
List<IssueServiceConfigurationRepresentation> issueServiceConfigurationRepresentations = new ArrayList<>(); | ||
for (IssueServiceExtension issueServiceExtension : getIssueServiceExtensionMap().values()) { | ||
List<? extends IssueServiceConfiguration> configurationList = issueServiceExtension.getConfigurationList(); | ||
for (IssueServiceConfiguration issueServiceConfiguration : configurationList) { | ||
issueServiceConfigurationRepresentations.add( | ||
IssueServiceConfigurationRepresentation.Companion.of( | ||
issueServiceExtension, | ||
issueServiceConfiguration | ||
override fun findIssueServiceById(id: String): IssueServiceExtension? = issueServiceExtensionMap[id] | ||
|
||
override val availableIssueServiceConfigurations: List<IssueServiceConfigurationRepresentation> | ||
get() { | ||
val issueServiceConfigurationRepresentations = mutableListOf<IssueServiceConfigurationRepresentation>() | ||
for (issueServiceExtension in issueServiceExtensionMap.values) { | ||
val configurationList = issueServiceExtension.configurationList | ||
for (issueServiceConfiguration in configurationList) { | ||
issueServiceConfigurationRepresentations.add( | ||
of( | ||
issueServiceExtension, | ||
issueServiceConfiguration | ||
) | ||
); | ||
) | ||
} | ||
} | ||
return issueServiceConfigurationRepresentations | ||
} | ||
return issueServiceConfigurationRepresentations; | ||
} | ||
|
||
@Override | ||
public ConfiguredIssueService getConfiguredIssueService(String issueServiceConfigurationIdentifier) { | ||
override fun getConfiguredIssueService(issueServiceConfigurationIdentifier: String): ConfiguredIssueService? { | ||
// Parsing | ||
IssueServiceConfigurationIdentifier identifier = IssueServiceConfigurationIdentifier.parse(issueServiceConfigurationIdentifier); | ||
val identifier = parse(issueServiceConfigurationIdentifier) | ||
if (identifier != null) { | ||
Optional<IssueServiceExtension> issueService = getOptionalIssueService(identifier.getServiceId()); | ||
return issueService.map(issueServiceExtension -> new ConfiguredIssueService( | ||
issueServiceExtension, | ||
issueServiceExtension.getConfigurationByName(identifier.getName()) | ||
)).orElse(null); | ||
val issueService = findIssueServiceById(identifier.serviceId) | ||
return issueService?.run { | ||
val config = getConfigurationByName(identifier.name) | ||
config?.let { | ||
ConfiguredIssueService( | ||
this, | ||
it | ||
) | ||
} | ||
} | ||
} else { | ||
return null; | ||
return null | ||
} | ||
} | ||
|
||
} |
33 changes: 33 additions & 0 deletions
33
...net/nemerosa/ontrack/extension/issues/graphql/GQLRootQueryIssueServiceConfigurationsIT.kt
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,33 @@ | ||
package net.nemerosa.ontrack.extension.issues.graphql | ||
|
||
import net.nemerosa.ontrack.graphql.AbstractQLKTITSupport | ||
import org.junit.jupiter.api.Test | ||
import kotlin.test.assertEquals | ||
|
||
class GQLRootQueryIssueServiceConfigurationsIT : AbstractQLKTITSupport() { | ||
|
||
@Test | ||
fun `Getting the issue service configurations with GraphQL`() { | ||
asAdmin { | ||
run( | ||
""" | ||
{ | ||
issueServiceConfigurations { | ||
id | ||
name | ||
serviceId | ||
} | ||
} | ||
""" | ||
) { data -> | ||
val configs = data.path("issueServiceConfigurations") | ||
val testConfigs = configs.filter { it.path("serviceId").asText() == "test" } | ||
assertEquals(1, testConfigs.size) | ||
val testConfig = testConfigs.first() | ||
assertEquals("default (Test issues)", testConfig?.path("name")?.asText()) | ||
assertEquals("test//default", testConfig?.path("id")?.asText()) | ||
} | ||
} | ||
} | ||
|
||
} |
32 changes: 32 additions & 0 deletions
32
ontrack-web-core/components/extension/issues/SelectIssueService.js
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,32 @@ | ||
import {Select, Space, Typography} from "antd"; | ||
import {useEffect, useState} from "react"; | ||
|
||
export default function SelectIssueService({value, onChange, self}) { | ||
|
||
const [options, setOptions] = useState([]) | ||
const [selfAdded, setSelfAdded] = useState(false) | ||
|
||
useEffect(() => { | ||
if (self && !selfAdded) { | ||
setOptions(items => [...items, { | ||
value: "self", | ||
label: <Space> | ||
<Typography.Text>{self}</Typography.Text> | ||
<Typography.Text type="secondary">[self]</Typography.Text> | ||
</Space>, | ||
}]) | ||
setSelfAdded(true) | ||
} | ||
}, [self, selfAdded]) | ||
|
||
return ( | ||
<> | ||
<Select | ||
options={options} | ||
value={value} | ||
onChange={onChange} | ||
allowClear={true} | ||
/> | ||
</> | ||
) | ||
} |
Oops, something went wrong.