Skip to content

Commit

Permalink
issue #1 - init components
Browse files Browse the repository at this point in the history
  • Loading branch information
cbellone committed Aug 19, 2014
1 parent fa1a798 commit 0fcddc0
Show file tree
Hide file tree
Showing 300 changed files with 81,797 additions and 30 deletions.
3 changes: 3 additions & 0 deletions .bowerrc
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
{
"directory": "src/main/webapp/resources/bower_components"
}
2 changes: 2 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -2,3 +2,5 @@
.classpath
.project
.settings/
.idea/
*.iml
17 changes: 17 additions & 0 deletions pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,16 @@
<type>jar</type>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-core</artifactId>
<version>2.2.3</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.2.3</version>
</dependency>

<!-- Spring security -->
<dependency>
Expand Down Expand Up @@ -118,6 +128,13 @@
<artifactId>log4j-slf4j-impl</artifactId>
<version>${org.apache.logging.log4j.version}</version>
</dependency> -->

<!-- utilities -->
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
<version>3.3.2</version>
</dependency>
</dependencies>

<build>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,12 +14,13 @@
* You should have received a copy of the GNU General Public License
* along with bagarino. If not, see <http://www.gnu.org/licenses/>.
*/
package io.bagarino.interceptor;
package io.bagarino.config;

import io.bagarino.model.system.ConfigurationKeys;
import io.bagarino.repository.system.ConfigurationRepository;
import io.bagarino.repository.user.RoleRepository;
import io.bagarino.repository.user.AuthorityRepository;
import io.bagarino.repository.user.UserRepository;
import lombok.extern.log4j.Log4j2;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationListener;
import org.springframework.context.event.ContextRefreshedEvent;
Expand All @@ -30,20 +31,21 @@
import java.util.UUID;

@Component
@Log4j2
public class ConfigurationStatusChecker implements ApplicationListener<ContextRefreshedEvent> {

private final ConfigurationRepository configurationRepository;
private final UserRepository userRepository;
private final RoleRepository roleRepository;
private final AuthorityRepository authorityRepository;
private final PasswordEncoder passwordEncoder;

@Autowired
public ConfigurationStatusChecker(ConfigurationRepository configurationRepository,
UserRepository userRepository,
RoleRepository roleRepository,
AuthorityRepository authorityRepository,
PasswordEncoder passwordEncoder) {
this.configurationRepository = configurationRepository;
this.roleRepository = roleRepository;
this.authorityRepository = authorityRepository;
this.userRepository = userRepository;
this.passwordEncoder = passwordEncoder;
}
Expand All @@ -58,14 +60,14 @@ public void onApplicationEvent(ContextRefreshedEvent contextRefreshedEvent) {
}
if (!initCompleted) {
String adminPassword = Long.toHexString(UUID.randomUUID().getMostSignificantBits());
String logMessage = "*******************************************************\n"+
" This is the first time you're running bagarino\n"+
" a new Admin Password has been generated:\n"+
" " + adminPassword+"\n"+
"*******************************************************";
userRepository.create("admin", passwordEncoder.encode(adminPassword), "The", "Administrator", "admin@localhost", true);
roleRepository.create("admin", "ROLE_ADMIN");
System.out.println(logMessage);
authorityRepository.create("admin", AuthorityRepository.ROLE_ADMIN);
log.info("*******************************************************");
log.info(" This is the first time you're running bagarino");
log.info(" here the generated admin credentials:");
log.info(" {} ", adminPassword);
log.info("*******************************************************");

configurationRepository.insert(ConfigurationKeys.INIT_COMPLETED, "true");
}
}
Expand Down
59 changes: 51 additions & 8 deletions src/main/java/io/bagarino/config/MvcConfiguration.java
Original file line number Diff line number Diff line change
Expand Up @@ -16,30 +16,36 @@
*/
package io.bagarino.config;

import io.bagarino.interceptor.ConfigurationStatusChecker;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.MessageSource;
import org.springframework.context.ResourceLoaderAware;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.support.ResourceBundleMessageSource;
import org.springframework.core.io.ResourceLoader;
import org.springframework.http.MediaType;
import org.springframework.http.converter.HttpMessageConverter;
import org.springframework.http.converter.StringHttpMessageConverter;
import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter;
import org.springframework.web.servlet.LocaleResolver;
import org.springframework.web.servlet.ViewResolver;
import org.springframework.web.servlet.config.annotation.EnableWebMvc;
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
import org.springframework.web.servlet.config.annotation.ViewControllerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;
import org.springframework.web.servlet.config.annotation.*;
import org.springframework.web.servlet.i18n.SessionLocaleResolver;
import org.springframework.web.servlet.view.mustache.MustacheViewResolver;
import org.springframework.web.servlet.view.mustache.jmustache.JMustacheTemplateFactory;
import org.springframework.web.servlet.view.mustache.jmustache.JMustacheTemplateLoader;
import org.springframework.web.servlet.view.mustache.jmustache.LocalizationMessageInterceptor;

import java.util.Arrays;
import java.util.List;
import java.util.Locale;

@Configuration
@ComponentScan(basePackages = "io.bagarino")
@EnableWebMvc
public class MvcConfiguration extends WebMvcConfigurerAdapter implements ResourceLoaderAware {

private ResourceLoader resourceLoader;
@Autowired
private ConfigurationStatusChecker configurationStatusChecker;

@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
Expand All @@ -49,16 +55,53 @@ public void addResourceHandlers(ResourceHandlerRegistry registry) {
@Override
public void addViewControllers(ViewControllerRegistry registry) {
registry.addViewController("/admin/").setViewName("/admin/index");
registry.addViewController("/admin/partials/index.html").setViewName("/admin/partials/main");
registry.addViewController("/admin/partials/main/organizations.html").setViewName("/admin/partials/organizations");
}

@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(getTemplateMessagesInterceptor());
}

@Bean
public MessageSource messageSource() {
ResourceBundleMessageSource source = new ResourceBundleMessageSource();
source.setBasenames("io.bagarino.i18n.application", "io.bagarino.i18n.admin");
return source;
}

@Bean
public LocalizationMessageInterceptor getTemplateMessagesInterceptor() {
LocalizationMessageInterceptor interceptor = new LocalizationMessageInterceptor();
interceptor.setLocaleResolver(getLocaleResolver());
interceptor.setMessageSource(messageSource());
return interceptor;
}

@Bean
public LocaleResolver getLocaleResolver() {
SessionLocaleResolver localeResolver = new SessionLocaleResolver();
localeResolver.setDefaultLocale(Locale.ENGLISH);
return localeResolver;
}

@Bean
public ViewResolver getViewResolver() throws Exception {
MustacheViewResolver viewResolver = new MustacheViewResolver();
viewResolver.setSuffix("");
viewResolver.setTemplateFactory(getTemplateFactory());
viewResolver.setOrder(1);
return viewResolver;
}

@Override
public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
StringHttpMessageConverter converter = new StringHttpMessageConverter();
converter.setSupportedMediaTypes(Arrays.asList(MediaType.TEXT_HTML));
converters.add(new MappingJackson2HttpMessageConverter());
}

@Bean
public JMustacheTemplateFactory getTemplateFactory() throws Exception {
final JMustacheTemplateFactory templateFactory = new JMustacheTemplateFactory();
Expand Down
7 changes: 6 additions & 1 deletion src/main/java/io/bagarino/config/WebSecurityConfig.java
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,9 @@
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {

private static final String ROLE_ADMIN = "ADMIN";
private static final String ROLE_OWNER = "OWNER";
public static final String ADMIN_API = "/admin/api";

@Autowired
private DataSource dataSource;

Expand All @@ -52,7 +55,9 @@ public PasswordEncoder getPasswordEncoder() {
@Override
protected void configure(HttpSecurity http) throws Exception {
http.authorizeRequests()
.antMatchers("/admin/").hasRole(ROLE_ADMIN)
.antMatchers(ADMIN_API + "/organizations/new",
ADMIN_API + "/users/**").hasRole(ROLE_ADMIN)
.antMatchers("/admin/**").hasAnyRole(ROLE_ADMIN, ROLE_OWNER)
.and().formLogin();

}
Expand Down
38 changes: 38 additions & 0 deletions src/main/java/io/bagarino/controller/api/AdminApiController.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
package io.bagarino.controller.api;

import io.bagarino.manager.user.UserManager;
import io.bagarino.model.user.Organization;
import io.bagarino.model.user.User;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseStatus;
import org.springframework.web.bind.annotation.RestController;

import java.security.Principal;
import java.util.List;

@RestController
@RequestMapping("/admin/api")
public class AdminApiController {

private final UserManager userManager;

@Autowired
public AdminApiController(UserManager userManager) {
this.userManager = userManager;
}


@RequestMapping("/organizations")
@ResponseStatus(HttpStatus.OK)
public List<Organization> getAllOrganizations(Principal principal) {
return userManager.findUserOrganizations(principal.getName());
}

@RequestMapping("/users")
public List<User> getAllUsers(Principal principal) {
return userManager.findAllUsers();
}

}
4 changes: 4 additions & 0 deletions src/main/java/io/bagarino/manager/EventManager.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
package io.bagarino.manager;

public class EventManager {
}
68 changes: 68 additions & 0 deletions src/main/java/io/bagarino/manager/user/UserManager.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,68 @@
package io.bagarino.manager.user;

import io.bagarino.model.user.Authority;
import io.bagarino.model.user.Organization;
import io.bagarino.model.user.User;
import io.bagarino.repository.user.AuthorityRepository;
import io.bagarino.repository.user.OrganizationRepository;
import io.bagarino.repository.user.UserRepository;
import io.bagarino.repository.user.join.UserOrganizationRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import java.util.List;
import java.util.stream.Collectors;

@Component
public class UserManager {

private final AuthorityRepository authorityRepository;
private final OrganizationRepository organizationRepository;
private final UserOrganizationRepository userOrganizationRepository;
private final UserRepository userRepository;

@Autowired
public UserManager(AuthorityRepository authorityRepository,
OrganizationRepository organizationRepository,
UserOrganizationRepository userOrganizationRepository,
UserRepository userRepository) {
this.authorityRepository = authorityRepository;
this.organizationRepository = organizationRepository;
this.userOrganizationRepository = userOrganizationRepository;
this.userRepository = userRepository;
}

public List<Authority> getUserAuthorities(User user) {
return authorityRepository.findGrantedAuthorities(user.getUsername());
}

public List<User> findAllUsers() {
return userRepository.findAll();
}

public List<Organization> findUserOrganizations(String username) {
return findUserOrganizations(userRepository.findByUsername(username));
}

public List<Organization> findUserOrganizations(User user) {
if(isAdmin(user)) {
return organizationRepository.findAll();
}
return userOrganizationRepository.findByUserId(user.getId())
.stream()
.map(uo -> organizationRepository.findById(uo.getOrganizationId()))
.collect(Collectors.toList());
}

public boolean isAdmin(User user) {
return getUserAuthorities(user).stream().anyMatch(a -> a.getRole().equals(AuthorityRepository.ROLE_ADMIN));
}

public List<User> findMembers(Organization organization) {
return userOrganizationRepository.findByOrganizationId(organization.getId())
.stream()
.map(uo -> userRepository.findById(uo.getUserId()))
.collect(Collectors.toList());
}

}
10 changes: 8 additions & 2 deletions src/main/java/io/bagarino/model/user/Authority.java
Original file line number Diff line number Diff line change
Expand Up @@ -16,10 +16,16 @@
*/
package io.bagarino.model.user;

import lombok.Data;
import io.bagarino.datamapper.ConstructorAnnotationRowMapper.Column;
import lombok.Getter;

@Data
@Getter
public class Authority {
private final String username;
private final String role;

public Authority(@Column("username") String username, @Column("role") String role) {
this.username = username;
this.role = role;
}
}
8 changes: 6 additions & 2 deletions src/main/java/io/bagarino/model/user/Organization.java
Original file line number Diff line number Diff line change
Expand Up @@ -22,10 +22,14 @@
@Getter
public class Organization {
private final int id;
private final String name;
private final String description;

public Organization(@Column("id") int id, @Column("description") String description) {
public Organization(@Column("id") int id,
@Column("name") String name,
@Column("description") String description) {
this.id = id;
this.description = description;
this.name = name;
this.description = description;
}
}
16 changes: 16 additions & 0 deletions src/main/java/io/bagarino/model/user/join/UserOrganization.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
package io.bagarino.model.user.join;

import io.bagarino.datamapper.ConstructorAnnotationRowMapper.Column;
import lombok.Getter;

@Getter
public class UserOrganization {

private final int userId;
private final int organizationId;

public UserOrganization(@Column("user_id") int userId, @Column("org_id") int organizationId) {
this.userId = userId;
this.organizationId = organizationId;
}
}
Loading

0 comments on commit 0fcddc0

Please sign in to comment.