Coder Social home page Coder Social logo

nationalsecurityagency / skills-service Goto Github PK

View Code? Open in Web Editor NEW
375.0 375.0 83.0 423.61 MB

SkillTree is a micro-learning gamification platform supporting the rapid integration of a gamified tool training approach into new and existing applications.

Home Page: https://skilltreeplatform.dev

License: Apache License 2.0

JavaScript 26.60% HTML 0.14% Vue 15.26% CSS 0.01% Groovy 57.26% Java 0.58% Dockerfile 0.02% Shell 0.06% SCSS 0.07%

skills-service's People

Contributors

clarked-msft avatar dependabot[bot] avatar dwalizer avatar evenstensberg avatar jdbaudean avatar mosefer avatar nick-ward83 avatar rmmayo avatar shanesoh avatar snyk-bot avatar sudo-may avatar thefoxatwork avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

skills-service's Issues

Investigate log messages

cjmoses
2:56 PM
(hand typing this so it may have typos):
More than one TaskExecutor bean found with the context, and none is named 'taskExecutor'. Mark one of them as primary or name it 'taskExeuctor' (possibly as an alias) in order to use it for async processing: [clientInboundChannelExecutor, clientOutboundChannelExecutor, brokerChannelExecutor, messageBrokerTaskScheduler]

it's only showing up at INFO level, but seems as if it's the sort of theing that could impact performance?

also see a random stacktrace about "No converter for [class java.util.LinkedHashMap] but it's not clear why that happened

it did correspond to a particularly long page load of the dev dashboard

Investigate ability to makes updates to badge achievements in a single SQL

skills.services.admin.BadgeAdminService#identifyUsersMeetingBadgeRequirements

may cause performance or memory issues if a large number of users are retrieved.

Investigate ability to identify eligible users and make updates to badge achievements in a single SQL statement. This will enhance performance, improve usability and reduce changes of server crashes.

Add profiling and debugging to diagnose periodic latency when running stress tests

Add profiling and debugging to diagnose periodic latency when running stress tests

There is a significant amount of time that is not accounted int he profiling statements, for example:

| Profiling Endpoint: /api/projects/Project4/skills/Proj4Subj3Skill27
| |-> addSkill(projectId=Project4,skillId=Proj4Subj3Skill27,skillEventRequest=skills.controller.request.model.SkillEventRequest@7726d129) (1) : 891ms [001ms]
| |     |-> UserInfoService.getCurrentUser (1) : 000ms
| |     |-> retry-reportSkill (1) : 856ms [791ms]

[email protected] | | | | |-> SkillEventsService.getSkillDef (1) : 000ms
[email protected] | | | | |-> PointsAndAchievementsHandler.updatePointsAndAchievements (1) : 038ms [000ms]
[email protected] | | | | | |-> PointsAndAchi

Investigate projects_spec.js failure in 'Test Storing HttpSession in Redis' workflow

1) Projects Tests Add Admin:
     CypressError: Timed out retrying: expected '<span>' to be 'visible'

This element '<span>' is not visible because its parent '<div.multiselect__content-wrapper>' has CSS property: 'display: none'
      at cypressErr (http://localhost:8080/__cypress/runner/cypress_runner.js:138036:9)
      at throwErr (http://localhost:8080/__cypress/runner/cypress_runner.js:137969:11)
      at Object.throwErrByPath (http://localhost:8080/__cypress/runner/cypress_runner.js:138017:3)
      at retry (http://localhost:8080/__cypress/runner/cypress_runner.js:132299:19)
      at onFailFn (http://localhost:8080/__cypress/runner/cypress_runner.js:120514:16)
      at tryCatcher (http://localhost:8080/__cypress/runner/cypress_runner.js:164895:23)
      at Promise._settlePromiseFromHandler (http://localhost:8080/__cypress/runner/cypress_runner.js:162831:31)
      at Promise._settlePromise (http://localhost:8080/__cypress/runner/cypress_runner.js:162888:18)
      at Promise._settlePromise0 (http://localhost:8080/__cypress/runner/cypress_runner.js:162933:10)
      at Promise._settlePromises (http://localhost:8080/__cypress/runner/cypress_runner.js:163008:18)
      at Async../node_modules/bluebird/js/release/async.js.Async._drainQueue (http://localhost:8080/__cypress/runner/cypress_runner.js:159620:16)
      at Async../node_modules/bluebird/js/release/async.js.Async._drainQueues (http://localhost:8080/__cypress/runner/cypress_runner.js:159630:10)
      at Async.drainQueues (http://localhost:8080/__cypress/runner/cypress_runner.js:159504:14)

https://github.com/NationalSecurityAgency/skills-service/runs/1011095970?check_suite_focus=true

call-stack-prof AsyncProcessSpecification."support drop-if-full option" periodically fails

call-stack-prof AsyncProcessSpecification."support drop-if-full option" periodically fails; looks like a race condition in the test itself

upport drop-if-full option on support drop-if-full option(callStack.profiler.AsyncProcessSpecification)(callStack.profiler.AsyncProcessSpecification)  Time elapsed: 10.056 sec  <<< FAILURE!
org.spockframework.runtime.ConditionNotSatisfiedError: Condition not satisfied:

!kept
||
|true
false

	at callStack.profiler.AsyncProcessSpecification.support drop-if-full option(AsyncProcessSpecification.groovy:155)


Results :

Failed tests: 
  AsyncProcessSpecification.support drop-if-full option:155 Condition not satisfied:

!kept
||
|true
false

Allow custom header/footers of greater than 255 characters

  • increase length of value field in settings table to > 255
  • add length validator to custom header/footer fields in dashboard
  • add server side validation of custom header/footer fields
  • add validation tests to e2e and integration tests

Unable to notify pending achievements error

noticed the following exception in skills-service logs:

[email protected]    | 2020-08-31 18:39:19.733 ERROR 8 --- [cTaskExecutor-2] s.services.events.SkillEventsService     : unable to notify user [000000000002] of pending achievements
[email protected]    | 
[email protected]    | java.lang.IllegalArgumentException: Parameter projectId in SkillEventsSupportRepo.findByProjectIdAndSkillId must not be null!
[email protected]    | 	at org.springframework.data.repository.core.support.MethodInvocationValidator.invoke(MethodInvocationValidator.java:94) ~[spring-data-commons-2.1.16.RELEASE.jar!/:2.1.16.RELEASE]
[email protected]    | 	at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186) ~[spring-aop-5.1.14.RELEASE.jar!/:5.1.14.RELEASE]
[email protected]    | 	at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:212) ~[spring-aop-5.1.14.RELEASE.jar!/:5.1.14.RELEASE]
[email protected]    | 	at com.sun.proxy.$Proxy196.findByProjectIdAndSkillId(Unknown Source) ~[na:na]
[email protected]    | 	at skills.services.events.SkillEventsService$_notifyUserOfAchievements_closure1.doCall(SkillEventsService.groovy:99) ~[classes!/:1.2.0-SNAPSHOT]
[email protected]    | 	at skills.services.events.SkillEventsService$_notifyUserOfAchievements_closure1.call(SkillEventsService.groovy) ~[classes!/:1.2.0-SNAPSHOT]
[email protected]    | 	at org.codehaus.groovy.runtime.DefaultGroovyMethods.each(DefaultGroovyMethods.java:2330) ~[groovy-2.5.9.jar!/:2.5.9]
[email protected]    | 	at org.codehaus.groovy.runtime.DefaultGroovyMethods.each(DefaultGroovyMethods.java:2315) ~[groovy-2.5.9.jar!/:2.5.9]
[email protected]    | 	at org.codehaus.groovy.runtime.DefaultGroovyMethods.each(DefaultGroovyMethods.java:2356) ~[groovy-2.5.9.jar!/:2.5.9]
[email protected]    | 	at skills.services.events.SkillEventsService.notifyUserOfAchievements(SkillEventsService.groovy:98) ~[classes!/:1.2.0-SNAPSHOT]
[email protected]    | 	at skills.services.events.SkillEventsService.identifyPendingNotifications(SkillEventsService.groovy:146) ~[classes!/:1.2.0-SNAPSHOT]
[email protected]    | 	at skills.services.events.SkillEventsService$$FastClassBySpringCGLIB$$51008f3c.invoke(<generated>) ~[classes!/:1.2.0-SNAPSHOT]
[email protected]    | 	at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:218) ~[spring-core-5.1.14.RELEASE.jar!/:5.1.14.RELEASE]
[email protected]    | 	at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.invokeJoinpoint(CglibAopProxy.java:750) ~[spring-aop-5.1.14.RELEASE.jar!/:5.1.14.RELEASE]
[email protected]    | 	at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163) ~[spring-aop-5.1.14.RELEASE.jar!/:5.1.14.RELEASE]
[email protected]    | 	at org.springframework.aop.interceptor.AsyncExecutionInterceptor.lambda$invoke$0(AsyncExecutionInterceptor.java:115) ~[spring-aop-5.1.14.RELEASE.jar!/:5.1.14.RELEASE]
[email protected]    | 	at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:264) ~[na:na]
[email protected]    | 	at java.base/java.lang.Thread.run(Thread.java:830) ~[na:na]
[email protected]    | 

remove extra padding from custom header/footer

when configured custom header and footer have minor padding on the left and on the right; header/footer should span the entire width

I am suspecting this is due to the markup residing under class=container-fluid, so probably just need to be outside of that class

Clients unable to establish web-socket connection due to CORS policy

Access to XMLHttpRequest at 'https://ip-10-113-80-245.evoforge.org:8443/skills-websocket/info?t=1598899998198' from origin 'https://ip-10-113-80-245.evoforge.org:9443' has been blocked by CORS policy: No 'Access-Control-Allow-Origin' header is present on the requested resource.

Error creating bean with name 'defaultAuthManager': Requested bean is currently in creation: Is there an unresolvable circular reference?

2020-07-13 14:45:02.618 ERROR 7 --- [           main] o.s.boot.SpringApplication               : Application run failed

org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'skillsOAuth2AuthManager' defined in URL [jar:file:/skills.jar!/BOOT-INF/classes!/skills/auth/form/oauth2/SkillsOAuth2AuthenticationManager.class]: Unsatisfied dependency expressed through constructor parameter 0; nested exception is org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'authorizationServerConfig': Unsatisfied dependency expressed through field 'authenticationManager'; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'formSecurityConfiguration' defined in URL [jar:file:/skills.jar!/BOOT-INF/classes!/skills/auth/form/FormSecurityConfiguration.class]: Initialization of bean failed; nested exception is org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'localUserDetailsService': Unsatisfied dependency expressed through field 'userAuthService'; nested exception is org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'userAuthService': Unsatisfied dependency expressed through field 'authenticationManager'; nested exception is org.springframework.beans.factory.BeanCurrentlyInCreationException: Error creating bean with name 'defaultAuthManager': Requested bean is currently in creation: Is there an unresolvable circular reference?
	at org.springframework.beans.factory.support.ConstructorResolver.createArgumentArray(ConstructorResolver.java:769) ~[spring-beans-5.1.14.RELEASE.jar!/:5.1.14.RELEASE]
	at org.springframework.beans.factory.support.ConstructorResolver.autowireConstructor(ConstructorResolver.java:218) ~[spring-beans-5.1.14.RELEASE.jar!/:5.1.14.RELEASE]
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.autowireConstructor(AbstractAutowireCapableBeanFactory.java:1340) ~[spring-beans-5.1.14.RELEASE.jar!/:5.1.14.RELEASE]
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:1186) ~[spring-beans-5.1.14.RELEASE.jar!/:5.1.14.RELEASE]
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:555) ~[spring-beans-5.1.14.RELEASE.jar!/:5.1.14.RELEASE]
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:515) ~[spring-beans-5.1.14.RELEASE.jar!/:5.1.14.RELEASE]
	at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:320) ~[spring-beans-5.1.14.RELEASE.jar!/:5.1.14.RELEASE]
	at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:222) ~[spring-beans-5.1.14.RELEASE.jar!/:5.1.14.RELEASE]
	at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:318) ~[spring-beans-5.1.14.RELEASE.jar!/:5.1.14.RELEASE]
	at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:199) ~[spring-beans-5.1.14.RELEASE.jar!/:5.1.14.RELEASE]
	at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:847) ~[spring-beans-5.1.14.RELEASE.jar!/:5.1.14.RELEASE]
	at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:877) ~[spring-context-5.1.14.RELEASE.jar!/:5.1.14.RELEASE]
	at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:549) ~[spring-context-5.1.14.RELEASE.jar!/:5.1.14.RELEASE]
	at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh(ServletWebServerApplicationContext.java:141) ~[spring-boot-2.1.13.RELEASE.jar!/:2.1.13.RELEASE]
	at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:744) ~[spring-boot-2.1.13.RELEASE.jar!/:2.1.13.RELEASE]
	at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:391) ~[spring-boot-2.1.13.RELEASE.jar!/:2.1.13.RELEASE]
	at org.springframework.boot.SpringApplication.run(SpringApplication.java:312) ~[spring-boot-2.1.13.RELEASE.jar!/:2.1.13.RELEASE]
	at org.springframework.boot.SpringApplication.run(SpringApplication.java:1215) ~[spring-boot-2.1.13.RELEASE.jar!/:2.1.13.RELEASE]
	at org.springframework.boot.SpringApplication.run(SpringApplication.java:1204) ~[spring-boot-2.1.13.RELEASE.jar!/:2.1.13.RELEASE]
	at skills.SpringBootApp.main(SpringBootApp.java:59) ~[classes!/:1.2.0-SNAPSHOT]
	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:na]
	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[na:na]
	at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:na]
	at java.base/java.lang.reflect.Method.invoke(Method.java:567) ~[na:na]
	at org.springframework.boot.loader.MainMethodRunner.run(MainMethodRunner.java:48) ~[skills.jar:1.2.0-SNAPSHOT]
	at org.springframework.boot.loader.Launcher.launch(Launcher.java:87) ~[skills.jar:1.2.0-SNAPSHOT]
	at org.springframework.boot.loader.Launcher.launch(Launcher.java:51) ~[skills.jar:1.2.0-SNAPSHOT]
	at org.springframework.boot.loader.JarLauncher.main(JarLauncher.java:52) ~[skills.jar:1.2.0-SNAPSHOT]
Caused by: org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'authorizationServerConfig': Unsatisfied dependency expressed through field 'authenticationManager'; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'formSecurityConfiguration' defined in URL [jar:file:/skills.jar!/BOOT-INF/classes!/skills/auth/form/FormSecurityConfiguration.class]: Initialization of bean failed; nested exception is org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'localUserDetailsService': Unsatisfied dependency expressed through field 'userAuthService'; nested exception is org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'userAuthService': Unsatisfied dependency expressed through field 'authenticationManager'; nested exception is org.springframework.beans.factory.BeanCurrentlyInCreationException: Error creating bean with name 'defaultAuthManager': Requested bean is currently in creation: Is there an unresolvable circular reference?
	at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:598) ~[spring-beans-5.1.14.RELEASE.jar!/:5.1.14.RELEASE]
	at org.springframework.beans.factory.annotation.InjectionMetadata.inject(InjectionMetadata.java:90) ~[spring-beans-5.1.14.RELEASE.jar!/:5.1.14.RELEASE]
	at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessProperties(AutowiredAnnotationBeanPostProcessor.java:376) ~[spring-beans-5.1.14.RELEASE.jar!/:5.1.14.RELEASE]
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1404) ~[spring-beans-5.1.14.RELEASE.jar!/:5.1.14.RELEASE]
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:592) ~[spring-beans-5.1.14.RELEASE.jar!/:5.1.14.RELEASE]
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:515) ~[spring-beans-5.1.14.RELEASE.jar!/:5.1.14.RELEASE]
	at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:320) ~[spring-beans-5.1.14.RELEASE.jar!/:5.1.14.RELEASE]
	at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:222) ~[spring-beans-5.1.14.RELEASE.jar!/:5.1.14.RELEASE]
	at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:318) ~[spring-beans-5.1.14.RELEASE.jar!/:5.1.14.RELEASE]
	at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:199) ~[spring-beans-5.1.14.RELEASE.jar!/:5.1.14.RELEASE]
	at org.springframework.beans.factory.support.ConstructorResolver.instantiateUsingFactoryMethod(ConstructorResolver.java:392) ~[spring-beans-5.1.14.RELEASE.jar!/:5.1.14.RELEASE]
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.instantiateUsingFactoryMethod(AbstractAutowireCapableBeanFactory.java:1320) ~[spring-beans-5.1.14.RELEASE.jar!/:5.1.14.RELEASE]
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:1159) ~[spring-beans-5.1.14.RELEASE.jar!/:5.1.14.RELEASE]
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:555) ~[spring-beans-5.1.14.RELEASE.jar!/:5.1.14.RELEASE]
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:515) ~[spring-beans-5.1.14.RELEASE.jar!/:5.1.14.RELEASE]
	at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:320) ~[spring-beans-5.1.14.RELEASE.jar!/:5.1.14.RELEASE]
	at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:222) ~[spring-beans-5.1.14.RELEASE.jar!/:5.1.14.RELEASE]
	at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:318) ~[spring-beans-5.1.14.RELEASE.jar!/:5.1.14.RELEASE]
	at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:199) ~[spring-beans-5.1.14.RELEASE.jar!/:5.1.14.RELEASE]
	at org.springframework.beans.factory.config.DependencyDescriptor.resolveCandidate(DependencyDescriptor.java:277) ~[spring-beans-5.1.14.RELEASE.jar!/:5.1.14.RELEASE]
	at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:1255) ~[spring-beans-5.1.14.RELEASE.jar!/:5.1.14.RELEASE]
	at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:1175) ~[spring-beans-5.1.14.RELEASE.jar!/:5.1.14.RELEASE]
	at org.springframework.beans.factory.support.ConstructorResolver.resolveAutowiredArgument(ConstructorResolver.java:857) ~[spring-beans-5.1.14.RELEASE.jar!/:5.1.14.RELEASE]
	at org.springframework.beans.factory.support.ConstructorResolver.createArgumentArray(ConstructorResolver.java:760) ~[spring-beans-5.1.14.RELEASE.jar!/:5.1.14.RELEASE]
	... 27 common frames omitted
Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'formSecurityConfiguration' defined in URL [jar:file:/skills.jar!/BOOT-INF/classes!/skills/auth/form/FormSecurityConfiguration.class]: Initialization of bean failed; nested exception is org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'localUserDetailsService': Unsatisfied dependency expressed through field 'userAuthService'; nested exception is org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'userAuthService': Unsatisfied dependency expressed through field 'authenticationManager'; nested exception is org.springframework.beans.factory.BeanCurrentlyInCreationException: Error creating bean with name 'defaultAuthManager': Requested bean is currently in creation: Is there an unresolvable circular reference?
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:601) ~[spring-beans-5.1.14.RELEASE.jar!/:5.1.14.RELEASE]
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:515) ~[spring-beans-5.1.14.RELEASE.jar!/:5.1.14.RELEASE]
	at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:320) ~[spring-beans-5.1.14.RELEASE.jar!/:5.1.14.RELEASE]
	at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:222) ~[spring-beans-5.1.14.RELEASE.jar!/:5.1.14.RELEASE]
	at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:318) ~[spring-beans-5.1.14.RELEASE.jar!/:5.1.14.RELEASE]
	at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:199) ~[spring-beans-5.1.14.RELEASE.jar!/:5.1.14.RELEASE]
	at org.springframework.beans.factory.support.ConstructorResolver.instantiateUsingFactoryMethod(ConstructorResolver.java:392) ~[spring-beans-5.1.14.RELEASE.jar!/:5.1.14.RELEASE]
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.instantiateUsingFactoryMethod(AbstractAutowireCapableBeanFactory.java:1320) ~[spring-beans-5.1.14.RELEASE.jar!/:5.1.14.RELEASE]
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:1159) ~[spring-beans-5.1.14.RELEASE.jar!/:5.1.14.RELEASE]
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:555) ~[spring-beans-5.1.14.RELEASE.jar!/:5.1.14.RELEASE]
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:515) ~[spring-beans-5.1.14.RELEASE.jar!/:5.1.14.RELEASE]
	at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:320) ~[spring-beans-5.1.14.RELEASE.jar!/:5.1.14.RELEASE]
	at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:222) ~[spring-beans-5.1.14.RELEASE.jar!/:5.1.14.RELEASE]
	at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:318) ~[spring-beans-5.1.14.RELEASE.jar!/:5.1.14.RELEASE]
	at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:199) ~[spring-beans-5.1.14.RELEASE.jar!/:5.1.14.RELEASE]
	at org.springframework.beans.factory.config.DependencyDescriptor.resolveCandidate(DependencyDescriptor.java:277) ~[spring-beans-5.1.14.RELEASE.jar!/:5.1.14.RELEASE]
	at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:1255) ~[spring-beans-5.1.14.RELEASE.jar!/:5.1.14.RELEASE]
	at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:1175) ~[spring-beans-5.1.14.RELEASE.jar!/:5.1.14.RELEASE]
	at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:595) ~[spring-beans-5.1.14.RELEASE.jar!/:5.1.14.RELEASE]
	... 50 common frames omitted
Caused by: org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'localUserDetailsService': Unsatisfied dependency expressed through field 'userAuthService'; nested exception is org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'userAuthService': Unsatisfied dependency expressed through field 'authenticationManager'; nested exception is org.springframework.beans.factory.BeanCurrentlyInCreationException: Error creating bean with name 'defaultAuthManager': Requested bean is currently in creation: Is there an unresolvable circular reference?
	at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:598) ~[spring-beans-5.1.14.RELEASE.jar!/:5.1.14.RELEASE]
	at org.springframework.beans.factory.annotation.InjectionMetadata.inject(InjectionMetadata.java:90) ~[spring-beans-5.1.14.RELEASE.jar!/:5.1.14.RELEASE]
	at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessProperties(AutowiredAnnotationBeanPostProcessor.java:376) ~[spring-beans-5.1.14.RELEASE.jar!/:5.1.14.RELEASE]
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1404) ~[spring-beans-5.1.14.RELEASE.jar!/:5.1.14.RELEASE]
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:592) ~[spring-beans-5.1.14.RELEASE.jar!/:5.1.14.RELEASE]
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:515) ~[spring-beans-5.1.14.RELEASE.jar!/:5.1.14.RELEASE]
	at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:320) ~[spring-beans-5.1.14.RELEASE.jar!/:5.1.14.RELEASE]
	at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:222) ~[spring-beans-5.1.14.RELEASE.jar!/:5.1.14.RELEASE]
	at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:318) ~[spring-beans-5.1.14.RELEASE.jar!/:5.1.14.RELEASE]
	at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:199) ~[spring-beans-5.1.14.RELEASE.jar!/:5.1.14.RELEASE]
	at org.springframework.context.annotation.ConfigurationClassEnhancer$BeanMethodInterceptor.resolveBeanReference(ConfigurationClassEnhancer.java:394) ~[spring-context-5.1.14.RELEASE.jar!/:5.1.14.RELEASE]
	at org.springframework.context.annotation.ConfigurationClassEnhancer$BeanMethodInterceptor.intercept(ConfigurationClassEnhancer.java:366) ~[spring-context-5.1.14.RELEASE.jar!/:5.1.14.RELEASE]
	at skills.auth.form.FormSecurityConfiguration$$EnhancerBySpringCGLIB$$e18cfa29.localUserDetailsService(<generated>) ~[classes!/:1.2.0-SNAPSHOT]
	at org.codehaus.groovy.vmplugin.v7.IndyInterface.selectMethod(IndyInterface.java:234) ~[groovy-2.5.9.jar!/:2.5.9]
	at skills.auth.form.FormSecurityConfiguration.configureGlobal(FormSecurityConfiguration.groovy:81) ~[classes!/:1.2.0-SNAPSHOT]
	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:na]
	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[na:na]
	at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:na]
	at java.base/java.lang.reflect.Method.invoke(Method.java:567) ~[na:na]
	at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredMethodElement.inject(AutowiredAnnotationBeanPostProcessor.java:710) ~[spring-beans-5.1.14.RELEASE.jar!/:5.1.14.RELEASE]
	at org.springframework.beans.factory.annotation.InjectionMetadata.inject(InjectionMetadata.java:90) ~[spring-beans-5.1.14.RELEASE.jar!/:5.1.14.RELEASE]
	at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessProperties(AutowiredAnnotationBeanPostProcessor.java:376) ~[spring-beans-5.1.14.RELEASE.jar!/:5.1.14.RELEASE]
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1404) ~[spring-beans-5.1.14.RELEASE.jar!/:5.1.14.RELEASE]
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:592) ~[spring-beans-5.1.14.RELEASE.jar!/:5.1.14.RELEASE]
	... 68 common frames omitted
Caused by: org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'userAuthService': Unsatisfied dependency expressed through field 'authenticationManager'; nested exception is org.springframework.beans.factory.BeanCurrentlyInCreationException: Error creating bean with name 'defaultAuthManager': Requested bean is currently in creation: Is there an unresolvable circular reference?
	at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:598) ~[spring-beans-5.1.14.RELEASE.jar!/:5.1.14.RELEASE]
	at org.springframework.beans.factory.annotation.InjectionMetadata.inject(InjectionMetadata.java:90) ~[spring-beans-5.1.14.RELEASE.jar!/:5.1.14.RELEASE]
	at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessProperties(AutowiredAnnotationBeanPostProcessor.java:376) ~[spring-beans-5.1.14.RELEASE.jar!/:5.1.14.RELEASE]
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1404) ~[spring-beans-5.1.14.RELEASE.jar!/:5.1.14.RELEASE]
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:592) ~[spring-beans-5.1.14.RELEASE.jar!/:5.1.14.RELEASE]
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:515) ~[spring-beans-5.1.14.RELEASE.jar!/:5.1.14.RELEASE]
	at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:320) ~[spring-beans-5.1.14.RELEASE.jar!/:5.1.14.RELEASE]
	at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:222) ~[spring-beans-5.1.14.RELEASE.jar!/:5.1.14.RELEASE]
	at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:318) ~[spring-beans-5.1.14.RELEASE.jar!/:5.1.14.RELEASE]
	at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:199) ~[spring-beans-5.1.14.RELEASE.jar!/:5.1.14.RELEASE]
	at org.springframework.beans.factory.config.DependencyDescriptor.resolveCandidate(DependencyDescriptor.java:277) ~[spring-beans-5.1.14.RELEASE.jar!/:5.1.14.RELEASE]
	at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:1255) ~[spring-beans-5.1.14.RELEASE.jar!/:5.1.14.RELEASE]
	at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:1175) ~[spring-beans-5.1.14.RELEASE.jar!/:5.1.14.RELEASE]
	at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:595) ~[spring-beans-5.1.14.RELEASE.jar!/:5.1.14.RELEASE]
	... 91 common frames omitted
Caused by: org.springframework.beans.factory.BeanCurrentlyInCreationException: Error creating bean with name 'defaultAuthManager': Requested bean is currently in creation: Is there an unresolvable circular reference?
	at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.beforeSingletonCreation(DefaultSingletonBeanRegistry.java:339) ~[spring-beans-5.1.14.RELEASE.jar!/:5.1.14.RELEASE]
	at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:215) ~[spring-beans-5.1.14.RELEASE.jar!/:5.1.14.RELEASE]
	at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:318) ~[spring-beans-5.1.14.RELEASE.jar!/:5.1.14.RELEASE]
	at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:199) ~[spring-beans-5.1.14.RELEASE.jar!/:5.1.14.RELEASE]
	at org.springframework.beans.factory.config.DependencyDescriptor.resolveCandidate(DependencyDescriptor.java:277) ~[spring-beans-5.1.14.RELEASE.jar!/:5.1.14.RELEASE]
	at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:1255) ~[spring-beans-5.1.14.RELEASE.jar!/:5.1.14.RELEASE]
	at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:1175) ~[spring-beans-5.1.14.RELEASE.jar!/:5.1.14.RELEASE]
	at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:595) ~[spring-beans-5.1.14.RELEASE.jar!/:5.1.14.RELEASE]
	... 104 common frames omitted

Investigate global_badges_spec.js failure on 'Test Against Postgres' workflow

 1) Global Badges Tests Can add Skill and Level requirements to disabled Global Badge:
     CypressError: Timed out retrying: cy.wait() timed out waiting 10000ms for the 1st request to the route: 'getGlobalBadges'. No request ever occurred.
      at cypressErr (http://localhost:8080/__cypress/runner/cypress_runner.js:138036:9)
      at throwErr (http://localhost:8080/__cypress/runner/cypress_runner.js:137969:11)
      at Object.throwErrByPath (http://localhost:8080/__cypress/runner/cypress_runner.js:138017:3)
      at Object.retry (http://localhost:8080/__cypress/runner/cypress_runner.js:132299:19)
      at checkForXhr (http://localhost:8080/__cypress/runner/cypress_runner.js:128622:17)
      at http://localhost:8080/__cypress/runner/cypress_runner.js:128623:28
      at tryCatcher (http://localhost:8080/__cypress/runner/cypress_runner.js:164895:23)
      at Function.Promise.attempt.Promise.try (http://localhost:8080/__cypress/runner/cypress_runner.js:162170:29)
      at tryFn (http://localhost:8080/__cypress/runner/cypress_runner.js:132763:21)
      at whenStable (http://localhost:8080/__cypress/runner/cypress_runner.js:132798:12)
      at http://localhost:8080/__cypress/runner/cypress_runner.js:132342:16
      at tryCatcher (http://localhost:8080/__cypress/runner/cypress_runner.js:164895:23)
      at Promise._settlePromiseFromHandler (http://localhost:8080/__cypress/runner/cypress_runner.js:162831:31)
      at Promise._settlePromise (http://localhost:8080/__cypress/runner/cypress_runner.js:162888:18)
      at Promise._settlePromise0 (http://localhost:8080/__cypress/runner/cypress_runner.js:162933:10)
      at Promise._settlePromises (http://localhost:8080/__cypress/runner/cypress_runner.js:163012:18)

https://github.com/NationalSecurityAgency/skills-service/runs/1010972758?check_suite_focus=true

Extract from email to configuration

Extract the from email used in EmailSendingService to either system properties or configuration via the user interface available to the Root User account.

Support dynamic variables in the customer header/footer

Support the following properties:

  • release.version: software release version (ex. 1.2.3)
  • build.date: print friendly date of when software artifact was created

Implementation idea:

  • Return these properties in /public/config endpoint; they are automatically added to the store

Syntax suggestion:

{{ release.version }}

TODO: Update skills-docs

DataMigrationDBIT must ensure database does not exist before executing

Test against PostgreSQL CI is failing because the database still exists from previous tests.

[ERROR] Tests run: 1, Failures: 0, Errors: 1, Skipped: 0, Time elapsed: 23.628 s <<< FAILURE! - in skills.intTests.DataMigrationDBIT
[ERROR] validate migration1(skills.intTests.DataMigrationDBIT)  Time elapsed: 22.334 s  <<< ERROR!
org.springframework.dao.DuplicateKeyException: 
StatementCallback; SQL [INSERT INTO public.user_attrs (id, user_id, first_name, last_name, dn, email, nickname, user_id_for_display, created, updated) VALUES (1, '[email protected]', 'Skills', 'Test', null, '[email protected]', 'Skills Test', '[email protected]', '2020-07-08 21:18:39.684787', '2020-07-08 21:18:39.684787');]; ERROR: duplicate key value violates unique constraint "index_users_attrs_user_id"
  Detail: Key (user_id)=([email protected]) already exists.; nested exception is org.postgresql.util.PSQLException: ERROR: duplicate key value violates unique constraint "index_users_attrs_user_id"
  Detail: Key (user_id)=([email protected]) already exists.
	at skills.intTests.DataMigrationDBIT.insertPreMigration1TestData_closure1(DataMigrationDBIT.groovy:133)
	at skills.intTests.DataMigrationDBIT.insertPreMigration1TestData(DataMigrationDBIT.groovy:132)
	at skills.intTests.DataMigrationDBIT.validate migration1(DataMigrationDBIT.groovy:74)
Caused by: org.postgresql.util.PSQLException: 
ERROR: duplicate key value violates unique constraint "index_users_attrs_user_id"
  Detail: Key (user_id)=([email protected]) already exists.
	at skills.intTests.DataMigrationDBIT.insertPreMigration1TestData_closure1(DataMigrationDBIT.groovy:133)
	at skills.intTests.DataMigrationDBIT.insertPreMigration1TestData(DataMigrationDBIT.groovy:132)
	at skills.intTests.DataMigrationDBIT.validate migration1(DataMigrationDBIT.groovy:74)

Log should not show email server connection warning during start up

Log should not show email server connection warning during start up:

2020-08-14 12:27:10.540  WARN 4849 --- [           main] skills.settings.EmailSettingsService     : Email connection failed!

com.sun.mail.util.MailConnectException: Couldn't connect to host, port: localhost, 25; timeout -1
	at com.sun.mail.smtp.SMTPTransport.openServer(SMTPTransport.java:2209) ~[javax.mail-1.6.2.jar!/:1.6.2]
	at com.sun.mail.smtp.SMTPTransport.protocolConnect(SMTPTransport.java:740) ~[javax.mail-1.6.2.jar!/:1.6.2]
	at javax.mail.Service.connect(Service.java:366) ~[javax.mail-1.6.2.jar!/:1.6.2]
	at org.springframework.mail.javamail.JavaMailSenderImpl.connectTransport(JavaMailSenderImpl.java:518) ~[spring-context-support-5.1.14.RELEASE.jar!/:5.1.14.RELEASE]
	at org.springframework.mail.javamail.JavaMailSenderImpl.testConnection(JavaMailSenderImpl.java:398) ~[spring-context-support-5.1.14.RELEASE.jar!/:5.1.14.RELEASE]
	at org.codehaus.groovy.vmplugin.v7.IndyInterface.selectMethod(IndyInterface.java:234) ~[groovy-2.5.9.jar!/:2.5.9]
	at skills.settings.EmailSettingsService.configureMailSender(EmailSettingsService.groovy:88) ~[classes!/:1.2.0-SNAPSHOT]
	at org.codehaus.groovy.vmplugin.v7.IndyInterface.selectMethod(IndyInterface.java:234) ~[groovy-2.5.9.jar!/:2.5.9]
	at skills.settings.EmailSettingsService.init(EmailSettingsService.groovy:72) ~[classes!/:1.2.0-SNAPSHOT]
	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:na]
	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[na:na]
	at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:na]
	at java.base/java.lang.reflect.Method.invoke(Method.java:566) ~[na:na]
	at org.springframework.beans.factory.annotation.InitDestroyAnnotationBeanPostProcessor$LifecycleElement.invoke(InitDestroyAnnotationBeanPostProcessor.java:363) ~[spring-beans-5.1.14.RELEASE.jar!/:5.1.14.RELEASE]
	at org.springframework.beans.factory.annotation.InitDestroyAnnotationBeanPostProcessor$LifecycleMetadata.invokeInitMethods(InitDestroyAnnotationBeanPostProcessor.java:307) ~[spring-beans-5.1.14.RELEASE.jar!/:5.1.14.RELEASE]
	at org.springframework.beans.factory.annotation.InitDestroyAnnotationBeanPostProcessor.postProcessBeforeInitialization(InitDestroyAnnotationBeanPostProcessor.java:136) ~[spring-beans-5.1.14.RELEASE.jar!/:5.1.14.RELEASE]
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyBeanPostProcessorsBeforeInitialization(AbstractAutowireCapableBeanFactory.java:414) ~[spring-beans-5.1.14.RELEASE.jar!/:5.1.14.RELEASE]
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1763) ~[spring-beans-5.1.14.RELEASE.jar!/:5.1.14.RELEASE]
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:593) ~[spring-beans-5.1.14.RELEASE.jar!/:5.1.14.RELEASE]
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:515) ~[spring-beans-5.1.14.RELEASE.jar!/:5.1.14.RELEASE]
	at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:320) ~[spring-beans-5.1.14.RELEASE.jar!/:5.1.14.RELEASE]
	at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:222) ~[spring-beans-5.1.14.RELEASE.jar!/:5.1.14.RELEASE]
	at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:318) ~[spring-beans-5.1.14.RELEASE.jar!/:5.1.14.RELEASE]
	at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:199) ~[spring-beans-5.1.14.RELEASE.jar!/:5.1.14.RELEASE]
	at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:847) ~[spring-beans-5.1.14.RELEASE.jar!/:5.1.14.RELEASE]
	at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:877) ~[spring-context-5.1.14.RELEASE.jar!/:5.1.14.RELEASE]
	at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:549) ~[spring-context-5.1.14.RELEASE.jar!/:5.1.14.RELEASE]
	at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh(ServletWebServerApplicationContext.java:141) ~[spring-boot-2.1.13.RELEASE.jar!/:2.1.13.RELEASE]
	at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:744) ~[spring-boot-2.1.13.RELEASE.jar!/:2.1.13.RELEASE]
	at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:391) ~[spring-boot-2.1.13.RELEASE.jar!/:2.1.13.RELEASE]
	at org.springframework.boot.SpringApplication.run(SpringApplication.java:312) ~[spring-boot-2.1.13.RELEASE.jar!/:2.1.13.RELEASE]
	at org.springframework.boot.SpringApplication.run(SpringApplication.java:1215) ~[spring-boot-2.1.13.RELEASE.jar!/:2.1.13.RELEASE]
	at org.springframework.boot.SpringApplication.run(SpringApplication.java:1204) ~[spring-boot-2.1.13.RELEASE.jar!/:2.1.13.RELEASE]
	at skills.SpringBootApp.main(SpringBootApp.java:58) ~[classes!/:1.2.0-SNAPSHOT]
	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:na]
	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[na:na]
	at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:na]
	at java.base/java.lang.reflect.Method.invoke(Method.java:566) ~[na:na]
	at org.springframework.boot.loader.MainMethodRunner.run(MainMethodRunner.java:48) ~[skills-service-1.2.0-SNAPSHOT.jar:1.2.0-SNAPSHOT]
	at org.springframework.boot.loader.Launcher.launch(Launcher.java:87) ~[skills-service-1.2.0-SNAPSHOT.jar:1.2.0-SNAPSHOT]
	at org.springframework.boot.loader.Launcher.launch(Launcher.java:51) ~[skills-service-1.2.0-SNAPSHOT.jar:1.2.0-SNAPSHOT]
	at org.springframework.boot.loader.JarLauncher.main(JarLauncher.java:52) ~[skills-service-1.2.0-SNAPSHOT.jar:1.2.0-SNAPSHOT]
Caused by: java.net.ConnectException: Connection refused (Connection refused)
	at java.base/java.net.PlainSocketImpl.socketConnect(Native Method) ~[na:na]
	at java.base/java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:399) ~[na:na]
	at java.base/java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:242) ~[na:na]
	at java.base/java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:224) ~[na:na]
	at java.base/java.net.SocksSocketImpl.connect(SocksSocketImpl.java:403) ~[na:na]
	at java.base/java.net.Socket.connect(Socket.java:609) ~[na:na]
	at java.base/java.net.Socket.connect(Socket.java:558) ~[na:na]
	at com.sun.mail.util.SocketFetcher.createSocket(SocketFetcher.java:359) ~[javax.mail-1.6.2.jar!/:1.6.2]
	at com.sun.mail.util.SocketFetcher.getSocket(SocketFetcher.java:238) ~[javax.mail-1.6.2.jar!/:1.6.2]
	at com.sun.mail.smtp.SMTPTransport.openServer(SMTPTransport.java:2175) ~[javax.mail-1.6.2.jar!/:1.6.2]
	... 41 common frames omitted

Improve notification message when initiated from schema changes or badge enabling

imported from Gitlab:

When schema is muted (or badge went live) that causes level or badge achieved the messages is emitted to the client event listeners. Some of the attributes do not depict the event accurately.

Here is an example when badge went live and caused the badge to be achieved for this user, the following notification was sent:

{
  "success": true,
  "projectId": "movies",
  "skillId": "testBadgeBadge",
  "name": "testBadge",
  "pointsEarned": 0,
  "skillApplied": true,
  "explanation": "Skill event was applied",
  "completed": [
    {
      "type": "Badge",
      "level": null,
      "id": "testBadgeBadge",
      "name": "testBadge"
    }
  ]
}

Few ideas/questions to improve:

  • fix explanation to accurately report what happened
  • skillApplied should be either null or false
  • should skillId be changed?? maybe ok to remain as badgeId
  • do we need to add any other attributes??

Setup CI

Work to configure CI using GitHub Actions

dashboard should display a graceful message rather than re-direct to an error page when accessing a valid url

ticket migrated from gitlab
dashboard should display a graceful message rather than re-direct to an error page when accessing a valid url

project use-case
if a person is not an admin of a project (and lets say someone shares the url) then error page is displayed;
this ticket will instead display a user friendly message, something like:
"You don't have permission to view and manage this project OR this project simply does not exist"

other pages
support other pages as well
-subjects
-badges
-skill

Modifying email settings doesn't report errors back to the user

Log in as an admin then Settings > Email

  • change port to 8000 (or anything)
  • click save

The request runs for a while then timeout happens but nothing is reported to the user.

How about:

  • Continue to report status to the user since this operation may take awhile
  • Report errors back to user

In addition looks like once email settings are persisted next time the page is loaded the saved settings are not properly reflected.

Add support for a generic application-wide header and footer in the dashboard

Support generic application-wide header and footer in the dashboard

  • once header and footer is configured they will render on very page of the dashboard application
  • only SkillTree dashboard admins will be able to configure these items
  • add ability to input html for header, footer and associated styles on the Global Settings page (/settings)
    • design idea: have 3 input boxes: header that takes html, footer that takes html, css that applies to header and footer
    • design idea #2: 2 input boxes that will have inline styles
  • Consider creating new Navigation item on /settings page (especially if we go with three input boxes)
  • Validate that <script> tab is NOT supplied (both client and server)
  • Implement extensive Cypress Tests and applicable backend integration tests

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.