Treinamento
Backend Java
Frontend Angular
@RestController
@RequestMapping("/api/especification")
public class EspecificationAPI extends GumgaAPI<Especification, Long> {
@RequestMapping(value="/{id}",method=RequestMethod.GET)
public T load(@PathVariable Long id) {
return service.view(id);
}
...
}
define(['app/apiLocations'], function (APILocation) {
IPEspecificationService.$inject = ['GumgaRest'];
function IPEspecificationService(GumgaRest) {
var Service = new GumgaRest(APILocation.apiLocation
+ '/api/ipespecification');
return Service;
}
return IPEspecificationService;
});
SEGURANÇA - CONCEITOS
SoftwareHouse
ERP
Contábil
Folha
PCP
Empresa A
Empresa B
Empresa C
Instância 1
Instância 2
Instância 3
SEGURANÇA ARQUITETURA
BackEnd
FrontEnd
Security
1
2
3
4
1 Frontend faz uma requisição a api do backend com token;
2 Backend pede autorização ao segurança;
3 Segurança autoriza e "bileta" a requisição;
4 Backend envia resposta (dados) ao frontend.
Multitenancy
Multitenancy
+----+----------------+-----------------------------+
| id | hierarchy_code | name |
+----+----------------+-----------------------------+
| 1 | 1. | GUMGA |
| 8 | 8. | Grands |
| 21 | 8.21. | Grands Maringá |
| 69 | 69. | GUMGA Apresentação |
| 70 | 70. | Organização para Testes |
| 71 | 70.71. | SubOrganização para Teste |
| 72 | 72. | DB1 |
| 73 | 72.73. | ANY |
| 74 | 72.73.74. | SUPORTE ANY |
| 75 | 72.73.74.75. | FABRICA ANY |
| 76 | 72.76. | GE |
| 77 | 72.76.77. | IMPLANTACAO |
| 78 | 72.76.78. | SUPORTE |
| 79 | 79. | Magus |
| 80 | 80. | Standard |
| 81 | 81. | Advanced |
| 82 | 82. | Enterprise |
+----+----------------+-----------------------------+
+----+------+---------------------+----------------------------------------+
| id | oi | expiration | name |
+----+------+---------------------+----------------------------------------+
| 1 | 1. | 2026-07-02 16:45:00 | Security for Gumga |
| 2 | 1. | 2019-08-04 17:10:00 | Security Grands |
| 3 | 8. | 2019-08-04 17:14:00 | Fashion Manager |
| 5 | 1. | 2019-08-04 17:34:00 | GUMGA Softwares |
| 6 | 1. | 2017-12-16 09:56:11 | Software da Gumga para Apresentação |
| 7 | 1. | 2017-02-25 08:31:24 | Instância de Teste |
| 8 | 69. | 2019-11-01 13:22:19 | Instancia de estudo |
| 9 | 69. | 2016-09-02 13:09:17 | br.com.gumga.thingcollection |
| 10 | 69. | 2019-01-05 14:07:52 | Cobrança |
| 11 | 69. | 2019-03-28 00:00:00 | br.com.gumga.apresentacao.apresentacao |
+----+------+---------------------+----------------------------------------+
Multitenancy
+----+----------------+-----------------------------+
| id | oi | cor |
+----+----------------+-----------------------------+
| 1 | 1. | AZUL |
| 2 | 8. | VERDE |
| 3 | 8.21. | AMARELO |
| 4 | 70. | VERMELHO |
| 5 | NULL | BRANCO |
+----+----------------+-----------------------------+
Transparente para o desenvolvedor
TOKEN | findAll() |
---|---|
1L1E1475609580127O1.I | AZUL, BRANCO |
1L1E1475609580127O8.I | VERDE, AMARELO, BRANCO |
1L1E1475609580127O8.21.I | AMARELO, BRANCO |
1L1E1475609580127O70.I | VERMELHO,BRANCO |
GUMGA ARCHETYPE
GUMGA ARCHETYPE
Módulos
Módulo INFRASTRUCTURE
package br.com.empresa.infrastructure.config;
@Configuration
@ComponentScan(basePackages = {"br.com.empresa", "gumga.framework"})
@EnableJpaRepositories(repositoryFactoryBeanClass = GumgaRepositoryFactoryBean.class, basePackages = {"br.com.empresa", "gumga.framework"})
@EnableTransactionManagement(proxyTargetClass = true)
public class Application {
@Bean
public static PropertyPlaceholderConfigurer dataConfigPropertyConfigurer() {
PropertyPlaceholderConfigurer configurer = new PropertyPlaceholderConfigurer();
configurer.setSearchSystemEnvironment(true);
return configurer;
}
@Bean
public static DataSource dataSource() {
GumgaQueryParserProvider.defaultMap = GumgaQueryParserProvider.getOracleLikeMap();
HikariConfig config = new HikariConfig();
config.setDataSourceClassName("com.mysql.jdbc.jdbc2.optional.MysqlDataSource");
config.addDataSourceProperty("url", "jdbc:mysql://localhost:3306/piloto?zeroDateTimeBehavior=convertToNull");
config.addDataSourceProperty("user", "root");
config.addDataSourceProperty("password", "senha");
// config.setDataSourceClassName("org.h2.jdbcx.JdbcDataSource");
// config.addDataSourceProperty("url", "jdbc:h2:mem:test;MVCC=true");
// config.addDataSourceProperty("user", "sa");
// config.addDataSourceProperty("password", "sa");
config.setMaximumPoolSize(20);
config.setIdleTimeout(30000L);
config.setInitializationFailFast(true);
return new HikariDataSource(config);
}
@Bean
@Autowired
public LocalContainerEntityManagerFactoryBean entityManagerFactory(DataSource dataSource) {
HibernateJpaVendorAdapter vendorAdapter = new HibernateJpaVendorAdapter();
Properties properties = new Properties();
properties.put("eclipselink.weaving", "false");
// properties.put("hibernate.hbm2ddl.auto", "update");
// properties.put("hibernate.dialect", "org.hibernate.dialect.H2Dialect");
properties.put("hibernate.hbm2ddl.auto", "update");
properties.put("hibernate.dialect", "org.hibernate.dialect.MySQL5Dialect");
properties.put("hibernate.ejb.naming_strategy", "org.hibernate.cfg.EJB3NamingStrategy");
//properties.put("hibernate.show_sql", "true");
//properties.put("hibernate.format_sql", "true");
properties.put("hibernate.connection.charSet", "UTF-8");
properties.put("hibernate.connection.characterEncoding", "UTF-8");
properties.put("hibernate.connection.useUnicode", "true");
properties.put("hibernate.jdbc.batch_size", "50");
LocalContainerEntityManagerFactoryBean factory = new LocalContainerEntityManagerFactoryBean();
factory.setJpaVendorAdapter(vendorAdapter);
factory.setPackagesToScan("gumga.framework.domain","br.com.empresa");
factory.setDataSource(dataSource);
factory.setJpaProperties(properties);
factory.afterPropertiesSet();
return factory;
}
@Bean
@Autowired
public PlatformTransactionManager transactionManager(EntityManagerFactory emf) {
return new JpaTransactionManager(emf);
}
}
Módulo INFRASTRUCTURE
package br.com.empresa.infrastructure.config;
@Configuration
@EnableWebMvc
@ComponentScan(basePackages = {"br.com.empresa.presentation.web", "gumga.framework"})
@Import(Application.class)
public class WebConfig extends WebMvcConfigurerAdapter implements WebApplicationInitializer {
@Override
public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) {
configurer.enable();
}
private MappingJackson2HttpMessageConverter jacksonConverter() {
ObjectMapper mapper = new ObjectMapper();
mapper.registerModule(new Hibernate4Module());
mapper.registerModule(new JodaModule());
mapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false);
mapper.setDateFormat(new ISO8601DateFormat());
mapper.setVisibility(PropertyAccessor.ALL, Visibility.NONE);
mapper.setVisibility(PropertyAccessor.FIELD, Visibility.ANY);
MappingJackson2HttpMessageConverter jacksonConverter = new MappingJackson2HttpMessageConverter();
mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
jacksonConverter.setObjectMapper(mapper);
return jacksonConverter;
}
@Override
public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
converters.add(jacksonConverter());
super.configureMessageConverters(converters);
}
@Override
public void onStartup(ServletContext servletContext) throws ServletException {
servletContext.setInitParameter("javax.servlet.jsp.jstl.fmt.localizationContext", "messages");
EnumSet<DispatcherType> dispatcherTypes = EnumSet.of(DispatcherType.REQUEST, DispatcherType.FORWARD);
CharacterEncodingFilter characterEncodingFilter = new CharacterEncodingFilter();
characterEncodingFilter.setEncoding("UTF-8");
characterEncodingFilter.setForceEncoding(true);
FilterRegistration.Dynamic characterEncoding = servletContext.addFilter("characterEncoding", characterEncodingFilter);
characterEncoding.addMappingForUrlPatterns(dispatcherTypes, true, "/*");
}
@Bean
public static MethodValidationPostProcessor methodValidationPostProcessor(LocalValidatorFactoryBean validator) {
final MethodValidationPostProcessor methodValidationPostProcessor = new MethodValidationPostProcessor();
methodValidationPostProcessor.setValidator(validator);
return methodValidationPostProcessor;
}
@Bean
public static LocalValidatorFactoryBean validator() {
return new LocalValidatorFactoryBean();
}
@Bean
public static CommonsMultipartResolver multipartResolver() {
CommonsMultipartResolver resolver = new CommonsMultipartResolver();
resolver.setMaxUploadSize(1024 * 1024 * 1024);
return resolver;
}
@Bean
public GumgaRequestFilter gumgaRequestFilter() {
return new GumgaRequestFilter("br.com.empresa.piloto");
}
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(gumgaRequestFilter());
}
}
Módulo INFRASTRUCTURE
package br.com.empresa.infrastructure.config;
import gumga.framework.core.GumgaValues;
import org.springframework.stereotype.Component;
@Component
public class ApplicationConstants implements GumgaValues {
@Override
public String getGumgaSecurityUrl() {
return "http://www.gumga.com.br/security-api/publicoperations";
}
@Override
public boolean isLogActive() {
return true;
}
}
Módulo DOMAIN
/*
* Gerado automaticamente por GUMGAGenerator em 09/05/2015 10:39:00
*/
package br.com.gumga.security.domain.model.institutional;
import gumga.framework.domain.GumgaModel;
import gumga.framework.domain.domains.*;
import java.io.Serializable;
import java.util.*;
import javax.persistence.*;
import org.hibernate.annotations.Columns;
import org.hibernate.envers.Audited;
//@GumgaMultitenancy // Os usuários são compartilhados
@SequenceGenerator(name = GumgaModel.SEQ_NAME, sequenceName = "SEQ_USER")
//@Indexed
@Audited
@Entity
@Table(name = "gum_use")
public class User extends GumgaModel<Long> implements Serializable {
//@Field //Descomente para ser utilizado na busca multientidades
private String name;
@Column(unique = true)
private String login;
private String password;
private GumgaBoolean status;
@Columns(columns = {
@Column(name = "picture_name"),
@Column(name = "picture_size"),
@Column(name = "picture_type"),
@Column(name = "picture_bytes", length = 50 * 1024 * 1024)
})
private GumgaImage picture;
@ManyToMany
private Set<Organization> organizations;
public User() {
this.status = new GumgaBoolean(true);
}
public User(String name, String login, String password, Set<Organization> organizations) {
this.name = name;
this.login = login;
this.password = password;
this.organizations = organizations;
this.status = new GumgaBoolean(true);
}
public GumgaImage getPicture() {
return picture;
}
public void setPicture(GumgaImage picture) {
this.picture = picture;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getLogin() {
return login;
}
public void setLogin(String login) {
this.login = login;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public Set<Organization> getOrganizations() {
return organizations == null ? new HashSet<>() : organizations;
}
public void removeOrganization(Organization organization) {
if(this.organizations == null) {
this.organizations = new HashSet<>();
}
this.organizations.remove(organization);
}
public void setOrganizations(Set<Organization> organizations) {
this.organizations = organizations;
}
public GumgaBoolean getStatus() {
return status;
}
public void setStatus(GumgaBoolean status) {
this.status = status;
}
public void addOrganization(Organization organization) {
if(this.organizations == null) {
this.organizations = new HashSet<>();
}
this.organizations.add(organization);
}
}
Módulo DOMAIN
package gumga.framework.domain;
@MappedSuperclass
public abstract class GumgaModel<ID extends Serializable> implements GumgaIdable<ID>, Serializable {
public static final String SEQ_NAME = "SEQ";
@Id
@GeneratedValue(strategy = GenerationType.AUTO, generator = SEQ_NAME)
protected ID id;
@org.hibernate.annotations.Index(name = "oi_index")
protected GumgaOi oi;
public GumgaModel() {
Class classe = this.getClass();
if (classe.isAnnotationPresent(GumgaMultitenancy.class)) {
String oc = GumgaThreadScope.organizationCode.get();
if (oc == null) {
GumgaMultitenancy tenancy = this.getClass().getAnnotation(GumgaMultitenancy.class);
oc = tenancy.publicMarking().getMark();
}
oi = new GumgaOi(oc);
}
}
public GumgaModel(GumgaOi oi) {
this.oi = oi;
}
public ID getId() {
return id;
}
public GumgaOi getOi() {
return oi;
}
@Override
public String toString() {
return ToStringBuilder.reflectionToString(this);
}
@Override
public int hashCode() {
int hash = 7;
if (id == null) {
return super.hashCode();
}
hash = 29 * hash + Objects.hashCode(this.id);
return hash;
}
@Override
public boolean equals(Object obj) {
if (obj == null) {
return false;
}
if (getClass() != obj.getClass()) {
return false;
}
final GumgaModel<?> other = (GumgaModel<?>) obj;
if (!Objects.equals(this.id, other.id)) {
return false;
}
return true;
}
}
Módulo APPLICATION
package br.com.gumga.security.application.repository;
import br.com.gumga.security.domain.model.institutional.Organization;
import br.com.gumga.security.domain.model.institutional.User;
import gumga.framework.domain.repository.GumgaCrudRepository;
import java.util.List;
import java.util.Optional;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.query.Param;
public interface OrganizationRepository extends GumgaCrudRepository<Organization, Long> {
public Organization findByHierarchyCode(String hierarchyCode);
public Organization findByName(String name);
List<Organization> findByHierarchyCodeStartingWith(String hierarchyCode);
}
Módulo APPLICATION
public interface GumgaCrudRepository<T, ID extends Serializable> extends JpaRepository<T, ID>, GumgaRepository<T, ID> {
SearchResult<T> search(QueryObject query);
Pesquisa<T> search();
SearchResult<T> search(String hql, Map<String, Object> params);
SearchResult<T> search(String hql, Map<String, Object> params, int max, int first);
List<GumgaObjectAndRevision> listOldVersions(ID id);
<A> SearchResult<A> advancedSearch(String selectQueryWithoutWhere, String countObjt, String ordenationId, QueryObject whereQuery);
Object genericFindOne(Class clazz, Object id);
SearchResult<T> findAllWithTenancy();
}
Módulo APPLICATION
package br.com.gumga.security.application.service;
import br.com.gumga.security.application.repository.OrganizationRepository;
import br.com.gumga.security.application.service.utils.QueryObjectLikeDecorator;
import br.com.gumga.security.domain.model.institutional.Organization;
import gumga.framework.application.GumgaService;
import gumga.framework.core.QueryObject;
import gumga.framework.core.SearchResult;
import gumga.framework.domain.domains.GumgaBoolean;
import java.util.List;
import java.util.Set;
import javax.transaction.Transactional;
import org.hibernate.Hibernate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@Service
public class OrganizationService extends GumgaService<Organization, Long> {
private OrganizationRepository repository;
@Autowired
public OrganizationService(OrganizationRepository repository) {
super(repository);
this.repository = repository;
}
@Transactional
public Organization loadOrganizationFat(Long id) {
Organization obj = repository.findOne(id);
Hibernate.initialize(obj.getSubOrganizations());
loadRecursively(obj.getSubOrganizations());
return obj;
}
private void loadRecursively(Set<Organization> subOrganizations) {
for (Organization subOrganization : subOrganizations) {
Hibernate.initialize(subOrganization.getSubOrganizations());
loadRecursively(subOrganization.getSubOrganizations());
}
}
@Override
public void beforeSave(Organization organization) {
organization.setMainOrganization(new GumgaBoolean(true));
}
@Override
public void afterSave(Organization organization) {
setHierarchyCodeRecursively(organization, "");
}
@Override
public void afterUpdate(Organization organization) {
setHierarchyCodeRecursively(organization, "");
}
private void setHierarchyCodeRecursively(Organization organization, String parentCode) {
organization.setHierarchyCode(parentCode + organization.getId() + ".");
for (Organization o : organization.getSubOrganizations()) {
setHierarchyCodeRecursively(o, organization.getHierarchyCode());
}
}
public Organization findParent(Organization organization) {
if (organization==null){
return null;
}
int lastIndexOf = organization.getHierarchyCode().substring(0, organization.getHierarchyCode().lastIndexOf('.')).lastIndexOf('.');
if (lastIndexOf == -1) {
return null;
}
String parentHierarchyCode = organization.getHierarchyCode().substring(0, lastIndexOf + 1);
Organization parent = repository.findByHierarchyCode(parentHierarchyCode);
return parent;
}
public Organization findByName(String name) {
return repository.findByName(name);
}
public Organization findByOi(String oi) {
return repository.findByHierarchyCode(oi);
}
@Override
public SearchResult<Organization> pesquisa(QueryObject query) {
//A busca simples nao utiliza operador like.
//Temos entao que forcar a geracao do AQ
return repository.search(new QueryObjectLikeDecorator(query).build());
}
@Transactional
public List<Organization> suborganizations(Long id) {
Organization obj = repository.findOne(id);
List<Organization> result = repository.findByHierarchyCodeStartingWith(obj.getHierarchyCode());
return result;
}
public Organization getOperationByID(Long id) {
return this.repository.findOne(id);
}
}
Módulo APPLICATION
package gumga.framework.application;
import gumga.framework.application.service.AbstractGumgaService;
import gumga.framework.core.GumgaIdable;
import gumga.framework.core.QueryObject;
import gumga.framework.core.SearchResult;
import gumga.framework.domain.GumgaObjectAndRevision;
import gumga.framework.domain.GumgaServiceable;
import gumga.framework.domain.repository.GumgaCrudRepository;
import java.io.Serializable;
import java.util.List;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
@Service
@Scope("prototype")
public abstract class GumgaService<T extends GumgaIdable<ID>, ID extends Serializable> extends AbstractGumgaService<T, ID> implements GumgaServiceable<T> {
public GumgaService(GumgaCrudRepository<T, ID> repository) {
super(repository);
}
public void beforePesquisa(QueryObject query) {
}
public void afterPesquisa(SearchResult<T> result) {
}
@Transactional(readOnly = true)
public SearchResult<T> pesquisa(QueryObject query) {
beforePesquisa(query);
SearchResult<T> result = repository.search(query);
afterPesquisa(result);
return result;
}
public void beforeView(ID id) {
}
public void afterView(T entity) {
}
@Transactional(readOnly = true)
public T view(ID id) {
beforeView(id);
T entity = repository.findOne(id);
loadGumgaCustomFields(entity);
afterView(entity);
return entity;
}
@Transactional(readOnly = true)
public Object genercView(Class clazz, ID id) {
Object entity = repository.genericFindOne(clazz, id);
return entity;
}
public void beforeDelete(T entity) {
}
public void afterDelete() {
}
@Transactional
public void delete(T resource) {
beforeDelete(resource);
repository.delete(resource);
if (gces != null) {
gces.deleteCustomFields(resource);
}
afterDelete();
}
private void beforeSaveOrUpdate(T entity, boolean isNew) {
if (isNew) {
beforeSave(entity);
} else {
beforeUpdate(entity);
}
}
private void afterSaveOrUpdate(T entity, boolean isNew) {
if (isNew) {
afterSave(entity);
} else {
afterUpdate(entity);
}
}
public void beforeSave(T entity) {
}
public void beforeUpdate(T entity) {
}
public void afterSave(T entity) {
}
public void afterUpdate(T entity) {
}
@Transactional
public T save(T resource) {
boolean isNew = (resource.getId() == null);
beforeSaveOrUpdate(resource, isNew);
T entity = repository.save(resource);
if (gces != null) {
gces.saveCustomFields(resource);
}
afterSaveOrUpdate(entity, isNew);
return entity;
}
public void forceFlush() {
repository.flush();
}
@Transactional(readOnly = true)
public List<GumgaObjectAndRevision> listOldVersions(ID id) {
List<GumgaObjectAndRevision> oldVersions = repository.listOldVersions(id);
return oldVersions;
}
}
Módulo API
package br.com.gumga.security.api;
import br.com.gumga.security.application.repository.UserRepository;
import br.com.gumga.security.application.service.OrganizationService;
import br.com.gumga.security.domain.model.institutional.Organization;
import br.com.gumga.security.domain.model.institutional.User;
import com.wordnik.swagger.annotations.ApiOperation;
import gumga.framework.application.GumgaService;
import gumga.framework.application.GumgaTempFileService;
import gumga.framework.core.SearchResult;
import gumga.framework.domain.domains.GumgaImage;
import gumga.framework.presentation.GumgaAPI;
import gumga.framework.presentation.RestResponse;
import java.io.IOException;
import java.util.List;
import javax.validation.Valid;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.validation.BindingResult;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;
@RestController
@RequestMapping("/api/organization")
public class OrganizationAPI extends GumgaAPI<Organization, Long> {
@Autowired
private GumgaTempFileService gumgaTempFileService;
@Autowired
private UserRepository userRepository;
@Autowired
public OrganizationAPI(GumgaService<Organization, Long> service) {
super(service);
}
@ApiOperation(value = "loadOrganizationFat", notes = "Carrega a organização e suas sub-organizações.")
@Override
public Organization load(@PathVariable Long id) {
return ((OrganizationService) service).loadOrganizationFat(id);
}
@ApiOperation(value = "logoUpload", notes = "Faz o upload da logo da organização.")
@RequestMapping(method = RequestMethod.POST, value = "/logo")
public String logoUpload(@RequestParam MultipartFile logo) throws IOException {
GumgaImage gi = new GumgaImage();
gi.setBytes(logo.getBytes());
gi.setMimeType(logo.getContentType());
gi.setName(logo.getName());
gi.setSize(logo.getSize());
String fileName = gumgaTempFileService.create(gi);
return fileName;
}
@ApiOperation(value = "logoDelete", notes = "Deleta a logo da organização.")
@RequestMapping(method = RequestMethod.DELETE, value = "/logo/{fileName}")
public String logoDelete(@PathVariable String fileName) {
return gumgaTempFileService.delete(fileName);
}
@ApiOperation(value = "logoGet", notes = "Retorna os bytes da logo.")
@RequestMapping(method = RequestMethod.GET, value = "/logo/{fileName}")
public byte[] logoGet(@PathVariable(value = "fileName") String fileName) {
return gumgaTempFileService.find(fileName).getBytes();
}
@Transactional
@ApiOperation(value = "save", notes = "Salva a organização associando sua logo.")
@RequestMapping(method = RequestMethod.POST)
public RestResponse<Organization> save(@RequestBody @Valid Organization organization, BindingResult result) {
System.out.println("novo "+organization.getMainUser().getLogin());
if (organization.getLogo() != null) {
organization.setLogo((GumgaImage) gumgaTempFileService.find(organization.getLogo().getName()));
}
return super.save(organization, result);
}
@Transactional
@ApiOperation(value = "update", notes = "Atualiza a organização e sua logo.")
@RequestMapping(value = "/{id}", method = RequestMethod.PUT, consumes = "application/json")
public RestResponse<Organization> update(@PathVariable("id") Long id,
@Valid @RequestBody Organization obj, BindingResult result) {
if (obj.getMainUser()!=null){
User mainUser=userRepository.findOne(obj.getMainUser().getId());
if (mainUser==null){
mainUser=obj.getMainUser();
userRepository.save(mainUser);
}
if (!mainUser.getOrganizations().contains(obj)){
mainUser.getOrganizations().add(obj);
}
}
else{
throw new RuntimeException("É obrigatório selecionar um usuário principal");
}
if (obj.getLogo() != null) {
if ("null".equals(obj.getLogo().getName())) {
obj.setLogo(null);
} else if (obj.getLogo().getSize() == 0) {
obj.setLogo((GumgaImage) gumgaTempFileService.find(obj.getLogo().getName()));
}
}
RestResponse<Organization> toReturn = super.update(id, obj, result);
toReturn.setData(null);
return toReturn;
}
@ApiOperation(value = "suborganizations", notes = "Retorna as suborganizações da organização informada")
@RequestMapping(method = RequestMethod.GET, value = "/suborganizations/{id}")
public SearchResult<Organization> suborganizations(@PathVariable(value = "id") Long id) {
List<Organization> suborganizations = ((OrganizationService) service).suborganizations(id);
return new SearchResult<Organization>(0, suborganizations.size(), suborganizations.size(), suborganizations);
}
}
Módulo API
package br.com.gumga.security.api;
import br.com.gumga.security.application.repository.UserRepository;
import br.com.gumga.security.application.service.OrganizationService;
import br.com.gumga.security.domain.model.institutional.Organization;
import br.com.gumga.security.domain.model.institutional.User;
import com.wordnik.swagger.annotations.ApiOperation;
import gumga.framework.application.GumgaService;
import gumga.framework.application.GumgaTempFileService;
import gumga.framework.core.SearchResult;
import gumga.framework.domain.domains.GumgaImage;
import gumga.framework.presentation.GumgaAPI;
import gumga.framework.presentation.RestResponse;
import java.io.IOException;
import java.util.List;
import javax.validation.Valid;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.validation.BindingResult;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;
@RestController
@RequestMapping("/api/organization")
public class OrganizationAPI extends GumgaAPI<Organization, Long> {
@Autowired
private GumgaTempFileService gumgaTempFileService;
@Autowired
private UserRepository userRepository;
@Autowired
public OrganizationAPI(GumgaService<Organization, Long> service) {
super(service);
}
@ApiOperation(value = "loadOrganizationFat", notes = "Carrega a organização e suas sub-organizações.")
@Override
public Organization load(@PathVariable Long id) {
return ((OrganizationService) service).loadOrganizationFat(id);
}
@ApiOperation(value = "logoUpload", notes = "Faz o upload da logo da organização.")
@RequestMapping(method = RequestMethod.POST, value = "/logo")
public String logoUpload(@RequestParam MultipartFile logo) throws IOException {
GumgaImage gi = new GumgaImage();
gi.setBytes(logo.getBytes());
gi.setMimeType(logo.getContentType());
gi.setName(logo.getName());
gi.setSize(logo.getSize());
String fileName = gumgaTempFileService.create(gi);
return fileName;
}
@ApiOperation(value = "logoDelete", notes = "Deleta a logo da organização.")
@RequestMapping(method = RequestMethod.DELETE, value = "/logo/{fileName}")
public String logoDelete(@PathVariable String fileName) {
return gumgaTempFileService.delete(fileName);
}
@ApiOperation(value = "logoGet", notes = "Retorna os bytes da logo.")
@RequestMapping(method = RequestMethod.GET, value = "/logo/{fileName}")
public byte[] logoGet(@PathVariable(value = "fileName") String fileName) {
return gumgaTempFileService.find(fileName).getBytes();
}
@Transactional
@ApiOperation(value = "save", notes = "Salva a organização associando sua logo.")
@RequestMapping(method = RequestMethod.POST)
public RestResponse<Organization> save(@RequestBody @Valid Organization organization, BindingResult result) {
System.out.println("novo "+organization.getMainUser().getLogin());
if (organization.getLogo() != null) {
organization.setLogo((GumgaImage) gumgaTempFileService.find(organization.getLogo().getName()));
}
return super.save(organization, result);
}
@Transactional
@ApiOperation(value = "update", notes = "Atualiza a organização e sua logo.")
@RequestMapping(value = "/{id}", method = RequestMethod.PUT, consumes = "application/json")
public RestResponse<Organization> update(@PathVariable("id") Long id,
@Valid @RequestBody Organization obj, BindingResult result) {
if (obj.getMainUser()!=null){
User mainUser=userRepository.findOne(obj.getMainUser().getId());
if (mainUser==null){
mainUser=obj.getMainUser();
userRepository.save(mainUser);
}
if (!mainUser.getOrganizations().contains(obj)){
mainUser.getOrganizations().add(obj);
}
}
else{
throw new RuntimeException("É obrigatório selecionar um usuário principal");
}
if (obj.getLogo() != null) {
if ("null".equals(obj.getLogo().getName())) {
obj.setLogo(null);
} else if (obj.getLogo().getSize() == 0) {
obj.setLogo((GumgaImage) gumgaTempFileService.find(obj.getLogo().getName()));
}
}
RestResponse<Organization> toReturn = super.update(id, obj, result);
toReturn.setData(null);
return toReturn;
}
@ApiOperation(value = "suborganizations", notes = "Retorna as suborganizações da organização informada")
@RequestMapping(method = RequestMethod.GET, value = "/suborganizations/{id}")
public SearchResult<Organization> suborganizations(@PathVariable(value = "id") Long id) {
List<Organization> suborganizations = ((OrganizationService) service).suborganizations(id);
return new SearchResult<Organization>(0, suborganizations.size(), suborganizations.size(), suborganizations);
}
}
Módulo API
@RestController
public abstract class GumgaAPI<T extends GumgaIdable<ID>, ID extends Serializable> extends AbstractGumgaAPI<T> {
public GumgaAPI(GumgaService<T, ID> service) {
super(service);
}
}
@RestController
public abstract class AbstractGumgaAPI<T> extends AbstractNoDeleteGumgaAPI<T> {
protected GumgaServiceable<T> service;
public AbstractGumgaAPI(GumgaServiceable<T> service) {
super(service);
this.service = service;
}
@GumgaSwagger
@Transactional
@ResponseStatus(value = HttpStatus.OK)
@ApiOperation(value = "delete", notes = "Deleta objeto com o id correspondente.")
@RequestMapping(value = "/{id}", method = RequestMethod.DELETE)
public RestResponse<T> delete(@PathVariable Long id) {
T entity = service.view(id);
service.delete(entity);
return new RestResponse<>(getEntityDeletedMessage(entity));
}
public void setService(GumgaServiceable<T> service) {
this.service = service;
super.setService(service);
}
}
@RestController
public abstract class AbstractNoDeleteGumgaAPI<T> extends
AbstractReadOnlyGumgaAPI<T> {
protected GumgaWritableServiceable<T> service;
public AbstractNoDeleteGumgaAPI(GumgaWritableServiceable<T> service) {
super(service);
this.service = service;
}
@GumgaSwagger
@Transactional
@ApiOperation(value = "save", notes = "Salva o objeto correspodente.")
@RequestMapping(method = RequestMethod.POST)
public RestResponse<T> save(@RequestBody @Valid T model, BindingResult result) {
beforeSave(model);
T entity = saveOrCry(model, result);
return new RestResponse<>(entity, getEntitySavedMessage(entity));
}
@GumgaSwagger
@Transactional
@ApiOperation(value = "update", notes = "Atualiza o objeto pelo id correspondente.")
@RequestMapping(value = "/{id}", method = RequestMethod.PUT, consumes = "application/json")
public RestResponse<T> update(@PathVariable("id") Long id,
@Valid @RequestBody T model, BindingResult result) {
beforeUpdate(id, model);
T entity = saveOrCry(model, result);
return new RestResponse<>(entity, getEntityUpdateMessage(entity));
}
private T saveOrCry(T model, BindingResult result) {
if (result.hasErrors()) {
throw new InvalidEntityException(result);
}
return service.save(model);
}
@Override
public void setService(GumgaServiceable<T> service) {
this.service = service;
super.setService(service);
}
protected void beforeSave(T model) {
}
protected void beforeUpdate(Long id, T model) {
}
@Transactional
@RequestMapping(value = "tags", method = RequestMethod.POST)
public void saveAll(@RequestBody TagsTo tags) {
for (GumgaTag tag : tags.tags) {
tag.setObjectType(clazz().getCanonicalName());
}
tags.tags.stream().forEach(t -> gts.save(t));
}
}
class TagsTo {
public List<GumgaTag> tags;
public List<GumgaTag> getTags() {
return tags;
}
public void setTags(List<GumgaTag> tags) {
this.tags = tags;
}
}
@RestController
public abstract class AbstractReadOnlyGumgaAPI<T> extends AbstractProtoGumgaAPI<T> {
protected GumgaReadableServiceable<T> service;
@Autowired
protected GumgaUserDataService guds;
@Autowired
protected GumgaTagDefinitionService gtds;
@Autowired
protected GumgaTagService gts;
public AbstractReadOnlyGumgaAPI(GumgaReadableServiceable<T> service) {
this.service = service;
}
@GumgaSwagger
@Transactional
@ApiOperation(value = "search", notes = "Faz uma pesquisa pela query informada através do objeto QueryObjet, os atributos são aq, q, start, pageSize, sortField, sortDir e searchFields.")
@RequestMapping(method = RequestMethod.GET)
public SearchResult<T> pesquisa(QueryObject query) {
SearchResult<T> pesquisa = service.pesquisa(query);
return new SearchResult<>(query, pesquisa.getCount(), pesquisa.getValues());
}
@Transactional
@ApiOperation(value = "saveQuery", notes = "Salva a consulta avançada.")
@RequestMapping(value = "saq", method = RequestMethod.POST)
public String save(@RequestBody @Valid QueryToSave qts,
BindingResult result) {
String key = "aq;" + qts.getPage() + ";" + qts.getName();
String userLogin = GumgaThreadScope.login.get();
GumgaUserData gud = guds.findByUserLoginAndKey(userLogin, key);
if (gud == null) {
gud = new GumgaUserData();
gud.setUserLogin(userLogin);
gud.setKey(key);
gud.setDescription(qts.getName());
}
gud.setValue(qts.getData());
guds.save(gud);
return "OK";
}
@GumgaSwagger
@Transactional
@ApiOperation(value = "load", notes = "Carrega entidade pelo id informado.")
@RequestMapping(value = "/{id}", method = RequestMethod.GET)
public T load(@PathVariable Long id) {
return service.view(id);
}
@Transactional
@ApiOperation(value = "listOldVersions", notes = "Mostra versões anteriores do objeto.")
@RequestMapping(value = "listoldversions/{id}", method = RequestMethod.GET)
public List<GumgaObjectAndRevision> listOldVersions(@PathVariable Long id) {
return service.listOldVersions(id);
}
public void setService(GumgaServiceable<T> service) {
this.service = service;
}
@ApiOperation(value = "queryByKeyPrefix", notes = "Retorna os associados do usuário a uma chave.")
@RequestMapping(value = "gumgauserdata/{prefix}", method = RequestMethod.GET)
public SearchResult<GumgaUserData> queryByKeyPrefix(@PathVariable String prefix) {
return ((GumgaUserDataService) guds).searchByKeyPrefix(prefix);
}
@Transactional
@RequestMapping(method = RequestMethod.GET, value = "tags")
public SearchResult<GumgaTagDefinition> listAllTags(QueryObject query) {
SearchResult<GumgaTagDefinition> pesquisa = gtds.pesquisa(query);
return new SearchResult<>(query, pesquisa.getCount(), pesquisa.getValues());
}
@Transactional
@RequestMapping(method = RequestMethod.GET, value = "tags/{objectId}")
public List<GumgaTag> listTagsOfEspecificObject(@PathVariable("objectId") Long objectId) {
List<GumgaTag> tags = gts.findByObjectTypeAndObjectId(clazz().getCanonicalName(), objectId);
for (GumgaTag tag : tags) {
Hibernate.initialize(tag.getValues());
}
return tags;
}
}
Módulo API - SEED 1/2
package br.com.gumga.security.seed;
import gumga.framework.application.GumgaLoggerService;
import gumga.framework.domain.seed.AppSeed;
import java.io.IOException;
import java.util.LinkedList;
import java.util.List;
import java.util.concurrent.atomic.AtomicBoolean;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationListener;
import org.springframework.context.event.ContextRefreshedEvent;
import org.springframework.stereotype.Component;
@Component
public class Seed implements ApplicationListener<ContextRefreshedEvent> {
@Autowired
private MinimumSeed securitySeed;
@Autowired
private GumgaLoggerService gumgaLoggerService;
private AtomicBoolean started = new AtomicBoolean(false);
public void onApplicationEvent(ContextRefreshedEvent event) {
if (started.get()) {
return;
}
started.set(true);
gumgaLoggerService.logToFile("Start ", 1);
for (AppSeed seed : seeds()) {
try {
seed.loadSeed();
} catch (IOException e) {
throw new RuntimeException(e);
}
}
gumgaLoggerService.logToFile("End ", 2);
}
private List<AppSeed> seeds() {
List<AppSeed> list = new LinkedList<>();
list.add(securitySeed);
return list;
}
}
Módulo API - SEED 2/2
/*
* To change this license header, choose License Headers in Project Properties.
* To change this template file, choose Tools | Templates
* and open the template in the editor.
*/
package br.com.gumga.security.seed;
import br.com.gumga.security.application.service.GumgaTokenService;
import br.com.gumga.security.application.service.InstanceService;
import br.com.gumga.security.application.service.OrganizationService;
import br.com.gumga.security.application.service.RoleService;
import br.com.gumga.security.application.service.SoftwareService;
import br.com.gumga.security.application.service.UserService;
import br.com.gumga.security.domain.model.instance.AddRemove;
import br.com.gumga.security.domain.model.instance.Instance;
import br.com.gumga.security.domain.model.instance.OperationEspecification;
import br.com.gumga.security.domain.model.instance.Role;
import br.com.gumga.security.domain.model.institutional.GumgaToken;
import br.com.gumga.security.domain.model.institutional.Organization;
import br.com.gumga.security.domain.model.institutional.User;
import br.com.gumga.security.domain.model.softwarehouse.Operation;
import br.com.gumga.security.domain.model.softwarehouse.Software;
import gumga.framework.core.GumgaThreadScope;
import gumga.framework.domain.domains.GumgaBoolean;
import gumga.framework.domain.domains.GumgaURL;
import gumga.framework.domain.seed.AppSeed;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Date;
import java.util.HashSet;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.transaction.annotation.Transactional;
/**
*
* @author munif
*/
@Component
public class MinimumSeed implements AppSeed {
@Autowired
private OrganizationService organizationService;
@Autowired
private UserService userService;
@Autowired
private GumgaTokenService gumgaTokenService;
@Autowired
private SoftwareService softwareService;
@Autowired
private InstanceService instanceService;
@Autowired
private RoleService roleService;
@Override
public void loadSeed() throws IOException {
if (semGumga()) {
System.out.println("SEGURANCA SEM NADA - RODANDO SEED");
createGumga();
createGumgaUser();
createSecurity();
createSecurityForGumga();
} else {
System.out.println("SEGURANCA COM DADOS");
}
}
@Transactional
public void createGumga() {
Organization gumga = new Organization("GUMGA", new HashSet<>(), true);
organizationService.save(gumga);
}
@Transactional
public void createGumgaUser() {
Organization gumga = organizationService.findByName("GUMGA");
GumgaThreadScope.organizationCode.set(gumga.getHierarchyCode()); // MELHORAR O SEED PARA QUE pegue o ID DA GUMGA
GumgaThreadScope.organization.set(gumga.getName());
User gumgaUser = new User("GumgaAdmin", "gumga@gumga.com.br", "qwe123", new HashSet<>(Arrays.asList(gumga)));
gumgaUser.setStatus(new GumgaBoolean(true));
userService.save(gumgaUser);
gumga.setMainUser(gumgaUser);
organizationService.save(gumga);
}
@Transactional
public void createSecurity() {
Organization gumga = organizationService.findByName("GUMGA");
GumgaThreadScope.organizationCode.set(gumga.getHierarchyCode()); // MELHORAR O SEED PARA QUE pegue o ID DA GUMGA
GumgaThreadScope.organization.set(gumga.getName());
Software security = new Software();
Operation all = new Operation("Todas as operações", "Permite executar todas as operações", "ALL_OPERATIONS");
Operation manager = new Operation("Manager Operations", "Permite executar todas as operações", "MANAGER_OPERATIONS");
Operation softwarehouse = new Operation("Softwarehouse Operations", "Permite executar todas as operações", "SOFTWAREHOUSE_OPERATIONS");
security.setDefaultTokenDuration(3600l);
security.setName("br.com.gumga.security");
security.setUrl(new GumgaURL("http://www.gumga.com.br/security"));
security.setOperations(new HashSet<>());
security.getOperations().add(all);
security.getOperations().add(manager);
security.getOperations().add(softwarehouse);
security.setRoot(Boolean.TRUE);
softwareService.save(security);
}
@Transactional
public void createSecurityForGumga() {
Organization gumga = organizationService.findByName("GUMGA");
GumgaThreadScope.organizationCode.set(gumga.getHierarchyCode());
GumgaThreadScope.organization.set(gumga.getName());
System.out.println("-------->" + GumgaThreadScope.organization.get() + " " + GumgaThreadScope.organizationCode.get());
Software security = softwareService.findByName("br.com.gumga.security");
System.out.println("---------->" + security.getName());
User gumgaUser = userService.searchForLogin("gumga@gumga.com.br");
System.out.println("----->" + gumgaUser.getLogin());
GumgaToken eterno = new GumgaToken("Token Eterno Gumga", System.currentTimeMillis(), Long.MAX_VALUE, "eterno", gumgaUser);
eterno.setLongo(Boolean.TRUE);
eterno.setOrganization(gumga);
gumgaTokenService.save(eterno);
Instance securityParaGumga = new Instance("Security for Gumga", new HashSet<>(),
gumga, new Date(System.currentTimeMillis() + 1000l * 60 * 60 * 24 * 3650));
securityParaGumga.getSoftwares().add(security);
instanceService.save(securityParaGumga);
Role saRole = new Role("SecurityAdministrator", new HashSet<>(Arrays.asList(new User[]{gumgaUser})), securityParaGumga);
saRole.setEspecifications(new ArrayList<>());
System.out.println("------->" + security.getOperations());
for (Operation operation : security.getOperations()) {
OperationEspecification operationEspecification = new OperationEspecification(AddRemove.ADD, operation, "Permição para " + operation.getDescription(), saRole);
//operationEspecification.setRole(saRole);
saRole.getEspecifications().add(operationEspecification);
}
roleService.save(saRole);
}
private boolean semGumga() {
Organization gumga = organizationService.findByName("GUMGA");
return gumga == null;
}
}
API - Chamada
GET http://40.78.60.84/security-api/api/user?pageSize=10&start=0
Host: 40.78.60.84
User-Agent: Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:44.0) Gecko/20100101 Firefox/44.0
Accept: application/json, text/plain, */*
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate
gumgaToken: 1L1E1475609580127O1.I
Referer: http://40.78.60.84/security/
Connection: keep-alive
Pragma: no-cache
Cache-Control: no-cache
API - Resposta
{
"pageSize": 10,
"count": 27,
"start": 0,
"values": [
{
"id": 1,
"oi": null,
"name": "GumgaAdmin",
"login": "gumga@gumga.com.br",
"password": "iOpp/mkwiKTSJ6JYM9LgHwCWpjDiZpDkZMmjpQ==",
"status": {
"value": true
},
"internalCode": null,
"picture": null,
"organizations": null
},
{
"id": 2,
"oi": null,
"name": "Cesar GRANDS",
"login": "cesar@grands.com.br",
"password": "zCnz0fZ9XcRvQ8Rb7Fl7cgbPZ+Ra2rWtUMuSvA==",
"status": {
"value": true
},
"internalCode": null,
"picture": null,
"organizations": null
},
{
"id": 3,
"oi": null,
"name": "Cesar GUMGA",
"login": "cesar@gumga.com.br",
"password": "hoWQIf/Jh8yRK24L7kztShnzLNvfRcXl1ljQAw==",
"status": {
"value": true
},
"internalCode": null,
"picture": null,
"organizations": null
},
{
"id": 4,
"oi": null,
"name": "Parceiro GRANDS",
"login": "parceiro@grands.co",
"password": "5wizeqybi28iztBKbKG93AoAjc4Whf8EYYhIKA==",
"status": {
"value": true
},
"internalCode": null,
"picture": null,
"organizations": null
},
{
"id": 5,
"oi": null,
"name": "Marcelo Brenzan GRANDS",
"login": "marcelobrenzan@gmail.com",
"password": "5LblLpN7i3WivTeDJ2U7qHS4PtvElC+vh1kExQ==",
"status": {
"value": true
},
"internalCode": null,
"picture": null,
"organizations": null
},
{
"id": 6,
"oi": null,
"name": "Rafael Mangolin GRANDS",
"login": "rbmangolin@gmail.com",
"password": "bDxx3UBNxVBKPqUxPs1M/JXCiUmVMS5dUvTwPQ==",
"status": {
"value": true
},
"internalCode": null,
"picture": null,
"organizations": null
},
{
"id": 7,
"oi": null,
"name": "Felipe S GUMGA",
"login": "felipe@gumga.com.br",
"password": "hPcS/tjMTPrKD9cequNZR6lAW/2GwmIHQoFo5w==",
"status": {
"value": true
},
"internalCode": "11301",
"picture": {
"name": "picture",
"size": 5242,
"mimeType": "image/jpeg",
"bytes": "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"
},
"organizations": null
},
{
"id": 8,
"oi": null,
"name": "Augusto GUMGA",
"login": "augusto@gumga.com.br",
"password": "/Z0qMjZdb6txTtjNPrF8XAI+7JD7ITpgUNJ+Aw==",
"status": {
"value": true
},
"internalCode": null,
"picture": null,
"organizations": null
},
{
"id": 9,
"oi": null,
"name": "Munif GUMGA",
"login": "munif@gumga.com.br",
"password": "pCufxtZ06Qwntb6/A70DjvTwDh5t4eky2M3aTw==",
"status": {
"value": true
},
"internalCode": "10500",
"picture": {
"name": "picture",
"size": 8648,
"mimeType": "image/jpeg",
"bytes": "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"
},
"organizations": null
},
{
"id": 10,
"oi": null,
"name": "Guilherme GUMGA",
"login": "guilherme@gumga.com.br",
"password": "AJZB0Sz5xUvDPZC3lqKjZW/cfZJPl7MmV5xRCg==",
"status": {
"value": true
},
"internalCode": "11101",
"picture": {
"name": "picture",
"size": 5773,
"mimeType": "image/jpeg",
"bytes": "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"
},
"organizations": null
}
]
}
API - Swagger