diff --git a/src/main/java/org/hbp/mip/MIPApplication.java b/src/main/java/org/hbp/mip/MIPApplication.java index 3de9d687036ae7e66c665d69dcdb1ef4dc9b2812..ecb36651d5909472485004d2e33df0ea39b0dc53 100644 --- a/src/main/java/org/hbp/mip/MIPApplication.java +++ b/src/main/java/org/hbp/mip/MIPApplication.java @@ -22,6 +22,7 @@ package org.hbp.mip; import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.ObjectMapper; +import io.swagger.annotations.*; import org.hbp.mip.model.*; import org.hibernate.Session; import org.springframework.beans.factory.annotation.Autowired; @@ -33,6 +34,7 @@ import org.springframework.boot.context.embedded.FilterRegistrationBean; import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.context.annotation.Bean; import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; import org.springframework.security.config.annotation.web.builders.HttpSecurity; import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter; import org.springframework.security.core.Authentication; @@ -71,6 +73,8 @@ import java.util.List; @SpringBootApplication @RestController @EnableOAuth2Client +@Api(value = "/", description = "MIP API") +@javax.annotation.Generated(value = "class io.swagger.codegen.languages.SpringMVCServerCodegen", date = "2016-01-06T09:32:22.266Z") public class MIPApplication extends WebSecurityConfigurerAdapter { @Autowired @@ -94,133 +98,294 @@ public class MIPApplication extends WebSecurityConfigurerAdapter { return principal; } + @Override + protected void configure(HttpSecurity http) throws Exception { + // @formatter:off + http.antMatcher("/**") + .authorizeRequests() + .antMatchers("/", "/frontend/**", "/webjars/**").permitAll() + .anyRequest().authenticated() + .and().exceptionHandling().authenticationEntryPoint(new LoginUrlAuthenticationEntryPoint("/")) + .and().logout().logoutSuccessUrl("/").permitAll() + .and().csrf().csrfTokenRepository(csrfTokenRepository()) + .and().addFilterAfter(csrfHeaderFilter(), CsrfFilter.class) + .addFilterBefore(ssoFilter(), BasicAuthenticationFilter.class); + // @formatter:on + } + + public static void main(String[] args) { + SpringApplication.run(MIPApplication.class, args); + } + + @Bean + public FilterRegistrationBean oauth2ClientFilterRegistration( + OAuth2ClientContextFilter filter) { + FilterRegistrationBean registration = new FilterRegistrationBean(); + registration.setFilter(filter); + registration.setOrder(-100); + return registration; + } + + private Filter ssoFilter() { + OAuth2ClientAuthenticationProcessingFilter hbpFilter = new OAuth2ClientAuthenticationProcessingFilter("/login/hbp"); + OAuth2RestTemplate hbpTemplate = new OAuth2RestTemplate(hbp(), oauth2ClientContext); + hbpFilter.setRestTemplate(hbpTemplate); + hbpFilter.setTokenServices(new UserInfoTokenServices(hbpResource().getUserInfoUri(), hbp().getClientId())); + return hbpFilter; + } + + @Bean + @ConfigurationProperties("hbp.client") + OAuth2ProtectedResourceDetails hbp() { + return new AuthorizationCodeResourceDetails(); + } + + @Bean + @ConfigurationProperties("hbp.resource") + ResourceServerProperties hbpResource() { + return new ResourceServerProperties(); + } + + private Filter csrfHeaderFilter() { + return new OncePerRequestFilter() { + @Override + protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, + FilterChain filterChain) throws ServletException, IOException { + CsrfToken csrf = (CsrfToken) request.getAttribute(CsrfToken.class.getName()); + if (csrf != null) { + Cookie cookie = WebUtils.getCookie(request, "XSRF-TOKEN"); + String token = csrf.getToken(); + if (cookie == null || token != null && !token.equals(cookie.getValue())) { + cookie = new Cookie("XSRF-TOKEN", token); + cookie.setPath("/"); + response.addCookie(cookie); + } + } + filterChain.doFilter(request, response); + } + }; + } + + private CsrfTokenRepository csrfTokenRepository() { + HttpSessionCsrfTokenRepository repository = new HttpSessionCsrfTokenRepository(); + repository.setHeaderName("X-XSRF-TOKEN"); + return repository; + } + + private String getUserInfos() { + OAuth2Authentication oAuth2Authentication = (OAuth2Authentication) SecurityContextHolder.getContext().getAuthentication(); + Authentication userAuthentication = oAuth2Authentication.getUserAuthentication(); + System.out.println(userAuthentication.getDetails().toString()); + return userAuthentication.getDetails().toString(); + } + + private User getUser(Principal principal) { + Session session = HibernateUtil.getSessionFactory().getCurrentSession(); + session.beginTransaction(); + org.hibernate.Query query = session.createQuery("from User where username= :username"); + query.setString("username", principal.getName()); + User user = (User) query.uniqueResult(); + session.getTransaction().commit(); + if(user == null) + { + session = HibernateUtil.getSessionFactory().getCurrentSession(); + session.beginTransaction(); + user = new User(getUserInfos()); + session.save(user); + session.getTransaction().commit(); + } + return user; + } + @RequestMapping(value = "/articles", method = RequestMethod.GET) @ResponseBody - public List<Article> getArticles(@RequestParam(name = "own", required = false) boolean own, @RequestParam(name = "team", required = false) int team, @RequestParam(name = "valid", required = false) boolean valid, @RequestParam(name = "status", required = false) String status) { + @ApiOperation(value = "Get articles", notes = "", response = Article.class, responseContainer = "List") + @ApiResponses(value = {@ApiResponse(code = 200, message = "Success") }) + public ResponseEntity<List<Article>> getArticles(@ApiParam(value = "Only ask own articles") @RequestParam(value = "own", required = false) Boolean own, + @ApiParam(value = "Only ask results matching status") @RequestParam(value = "status", required = false) String status, + @ApiParam(value = "Only ask articles from own team") @RequestParam(value = "team", required = false) Boolean team, + @ApiParam(value = "Only ask valid articles") @RequestParam(value = "valid", required = false) Boolean valid + ) throws NotFoundException { Session session = HibernateUtil.getSessionFactory().getCurrentSession(); session.beginTransaction(); List<Article> articles = session.createQuery("from Article").list(); session.getTransaction().commit(); - return articles; + return new ResponseEntity<List<Article>>(HttpStatus.OK).ok(articles); + } + + @RequestMapping(value = "/articles", method = RequestMethod.POST) + @ApiOperation(value = "Create an article", notes = "", response = Void.class) + @ApiResponses(value = { @ApiResponse(code = 200, message = "Article created") }) + public ResponseEntity<Void> addAnArticle( + @RequestBody @ApiParam(value = "Article to create" ,required=true ) Article article, Principal principal + ) + throws NotFoundException { + User user = getUser(principal); + Session session = HibernateUtil.getSessionFactory().getCurrentSession(); + session.beginTransaction(); + article.setCreatedAt(new Date()); + if(article.getStatus().equals("published")) { + article.setPublishedAt(new Date()); + } + article.setSlug(article.getTitle().toLowerCase()); + article.setCreatedBy(user); + session.save(article); + session.getTransaction().commit(); + return new ResponseEntity<Void>(HttpStatus.OK); } @RequestMapping(value = "/articles/{slug}", method = RequestMethod.GET) @ResponseBody - public Article getArticle(@PathVariable("slug") String slug) { + @ApiOperation(value = "Get an article", notes = "", response = Article.class) + @ApiResponses(value = { + @ApiResponse(code = 200, message = "Found"), + @ApiResponse(code = 404, message = "Not found") }) + public ResponseEntity<Article> getAnArticle( + @ApiParam(value = "slug",required=true ) @PathVariable("slug") String slug + ) + throws NotFoundException { Session session = HibernateUtil.getSessionFactory().getCurrentSession(); session.beginTransaction(); org.hibernate.Query query = session.createQuery("from Article where slug= :slug"); query.setString("slug", slug); Article article = (Article) query.uniqueResult(); session.getTransaction().commit(); - return article; + return new ResponseEntity<Article>(HttpStatus.OK).ok(article); + } + + @RequestMapping(value = "/articles/{slug}", method = RequestMethod.PUT) + @ApiOperation(value = "Update an article", notes = "", response = Void.class) + @ApiResponses(value = { @ApiResponse(code = 200, message = "Article updated") }) + public ResponseEntity<Void> updateAnArticle( + @ApiParam(value = "slug",required=true ) @PathVariable("slug") String slug, + @ApiParam(value = "Article to update" ,required=true ) Article article + ) + throws NotFoundException { + //TODO + // do some magic! + return new ResponseEntity<Void>(HttpStatus.OK); + } + + @RequestMapping(value = "/articles/{slug}", method = RequestMethod.DELETE) + @ApiOperation(value = "Delete an article", notes = "", response = Void.class) + @ApiResponses(value = { @ApiResponse(code = 200, message = "Article deleted") }) + public ResponseEntity<Void> deleteAnArticle( + @ApiParam(value = "slug",required=true ) @PathVariable("slug") String slug + + ) + throws NotFoundException { + //TODO + // do some magic! + return new ResponseEntity<Void>(HttpStatus.OK); } @RequestMapping(value = "/datasets/{code}", method = RequestMethod.GET) @ResponseBody - public Dataset getDatasets(@PathVariable("code") String code) { + @ApiOperation(value = "Get a dataset", notes = "", response = Dataset.class) + @ApiResponses(value = { @ApiResponse(code = 200, message = "Success") }) + public ResponseEntity<Dataset> getADataset( + @ApiParam(value = "code",required=true ) @PathVariable("code") String code + ) + throws NotFoundException { Session session = HibernateUtil.getSessionFactory().getCurrentSession(); session.beginTransaction(); org.hibernate.Query query = session.createQuery("from Dataset where code= :code"); query.setString("code", code); Dataset ds = (Dataset) query.uniqueResult(); session.getTransaction().commit(); - return ds; + return new ResponseEntity<Dataset>(HttpStatus.OK).ok(ds); } @RequestMapping(value = "/models", method = RequestMethod.GET) @ResponseBody - public List<Model> getModels() { + @ApiOperation(value = "Get models", notes = "", response = Model.class, responseContainer = "List") + @ApiResponses(value = { @ApiResponse(code = 200, message = "Success") }) + public ResponseEntity<List<Model>> getModels(@ApiParam(value = "Max number of results") @RequestParam(value = "limit", required = false) Integer limit, + @ApiParam(value = "Only ask own models") @RequestParam(value = "own", required = false) Boolean own, + @ApiParam(value = "Only ask models from own team") @RequestParam(value = "team", required = false) Boolean team, + @ApiParam(value = "Only ask valid models") @RequestParam(value = "valid", required = false) Boolean valid + ) + throws NotFoundException { Session session = HibernateUtil.getSessionFactory().getCurrentSession(); session.beginTransaction(); List<Model> models = session.createQuery("from Model").list(); session.getTransaction().commit(); - return models; - } - - @RequestMapping(value = "/models/{slug}", method = RequestMethod.GET) - @ResponseBody - public Model getModel(@PathVariable("slug") String slug) { - Session session = HibernateUtil.getSessionFactory().getCurrentSession(); - session.beginTransaction(); - org.hibernate.Query query = session.createQuery("from Model where slug= :slug"); - query.setString("slug", slug); - Model model = (Model) query.uniqueResult(); - session.getTransaction().commit(); - return model; - } - - @RequestMapping(value = "/articles", method = RequestMethod.POST) - @ResponseBody - public Article postArticle(@RequestBody Article article, Principal principal) { - User user = getUser(principal); - Session session = HibernateUtil.getSessionFactory().getCurrentSession(); - session.beginTransaction(); - article.setCreatedAt(new Date()); - if(article.getStatus().equals("published")) { - article.setPublishedAt(new Date()); - } - article.setSlug(article.getTitle().toLowerCase()); - article.setCreatedBy(user); - session.save(article); - session.getTransaction().commit(); - return article; + return new ResponseEntity<List<Model>>(HttpStatus.OK).ok(models); } @RequestMapping(value = "/models", method = RequestMethod.POST) @ResponseBody - public Model postModel(@RequestBody Model model) { + @ApiOperation(value = "Create a model", notes = "", response = Void.class) + @ApiResponses(value = { + @ApiResponse(code = 200, message = "Model created") }) + public ResponseEntity<Void> addAModel( + @RequestBody @ApiParam(value = "Model to create" ,required=true ) Model model + ) + throws NotFoundException { Session session = HibernateUtil.getSessionFactory().getCurrentSession(); session.beginTransaction(); model.setCreatedAt(new Date()); model.setSlug(model.getTitle().toLowerCase()); session.save(model); session.getTransaction().commit(); - return model; + return new ResponseEntity<Void>(HttpStatus.OK); } - @RequestMapping(value = "/models/{slug}/copies", method = RequestMethod.POST) + @RequestMapping(value = "/models/{slug}", method = RequestMethod.GET) @ResponseBody - public Model postModelCopies(@PathVariable("slug") String slug) { + @ApiOperation(value = "Get a model", notes = "", response = Model.class) + @ApiResponses(value = { + @ApiResponse(code = 200, message = "Found"), + @ApiResponse(code = 404, message = "Not found") }) + public ResponseEntity<Model> getAModel( + @ApiParam(value = "slug",required=true ) @PathVariable("slug") String slug + + ) + throws NotFoundException { Session session = HibernateUtil.getSessionFactory().getCurrentSession(); session.beginTransaction(); org.hibernate.Query query = session.createQuery("from Model where slug= :slug"); query.setString("slug", slug); Model model = (Model) query.uniqueResult(); session.getTransaction().commit(); - return model; - } - - @RequestMapping(value = "/queries/requests", method = RequestMethod.POST) - @ResponseBody - public Query postRequest(@RequestBody Query query) { - return null; - } - - @RequestMapping(value = "/articles/{slug}", method = RequestMethod.PUT) - @ResponseStatus(HttpStatus.NO_CONTENT) - public void putArticle(@PathVariable("slug") String slug) { + return new ResponseEntity<Model>(HttpStatus.OK).ok(model); } @RequestMapping(value = "/models/{slug}", method = RequestMethod.PUT) @ResponseBody - public Model putModel(@PathVariable("slug") String slug) { - return null; - } - - @RequestMapping(value = "/articles/{slug}", method = RequestMethod.DELETE) - @ResponseStatus(HttpStatus.NO_CONTENT) - public void deleteArticle(@PathVariable("slug") String slug) { + @ApiOperation(value = "Update a model", notes = "", response = Void.class) + @ApiResponses(value = { + @ApiResponse(code = 200, message = "Model updated") }) + public ResponseEntity<Void> updateAModel( + @ApiParam(value = "slug",required=true ) @PathVariable("slug") String slug, + @ApiParam(value = "Model to update" ,required=true ) Model model + ) + throws NotFoundException { + // TODO + // do some magic! + return new ResponseEntity<Void>(HttpStatus.OK); } @RequestMapping(value = "/models/{slug}", method = RequestMethod.DELETE) - @ResponseStatus(HttpStatus.NO_CONTENT) - public void deleteModel(@PathVariable("slug") String slug, @RequestBody Model model) { + @ApiOperation(value = "Delete a model", notes = "", response = Void.class) + @ApiResponses(value = { + @ApiResponse(code = 200, message = "Model deleted") }) + public ResponseEntity<Void> deleteAModel( + @ApiParam(value = "slug",required=true ) @PathVariable("slug") String slug + ) + throws NotFoundException { + // TODO + // do some magic! + return new ResponseEntity<Void>(HttpStatus.OK); } @RequestMapping(value = "/groups") @ResponseBody - public Group getGroups(){ + @ApiOperation(value = "Get the root group (containing all subgroups)", notes = "", response = Group.class) + @ApiResponses(value = { + @ApiResponse(code = 200, message = "Success") }) + public ResponseEntity<Group> getTheRootGroup() + throws NotFoundException { String rootCode = "root"; Session session = HibernateUtil.getSessionFactory().getCurrentSession(); session.beginTransaction(); @@ -228,138 +393,82 @@ public class MIPApplication extends WebSecurityConfigurerAdapter { query.setString("code", rootCode); Group group = (Group) query.uniqueResult(); session.getTransaction().commit(); - return group; + return new ResponseEntity<Group>(HttpStatus.OK).ok(group); } @RequestMapping(value = "/variables") @ResponseBody - public List<Variable> getVariables(){ + @ApiOperation(value = "Get variables", notes = "", response = Variable.class, responseContainer = "List") + @ApiResponses(value = { + @ApiResponse(code = 200, message = "Success") }) + public ResponseEntity<List<Variable>> getVariables(@ApiParam(value = "List of groups formatted like : (\"val1\", \"val2\", ...)") @RequestParam(value = "group", required = false) String group, + @ApiParam(value = "List of subgroups formatted like : (\"val1\", \"val2\", ...)") @RequestParam(value = "subgroup", required = false) String subgroup, + @ApiParam(value = "Boolean value formatted like : (\"0\") or (\"1\") or (\"false\") or (\"true\")") @RequestParam(value = "isVariable", required = false) String isVariable, + @ApiParam(value = "Boolean value formatted like : (\"0\") or (\"1\") or (\"false\") or (\"true\")") @RequestParam(value = "isGrouping", required = false) String isGrouping, + @ApiParam(value = "Boolean value formatted like : (\"0\") or (\"1\") or (\"false\") or (\"true\")") @RequestParam(value = "isCovariable", required = false) String isCovariable, + @ApiParam(value = "Boolean value formatted like : (\"0\") or (\"1\") or (\"false\") or (\"true\")") @RequestParam(value = "isFilter", required = false) String isFilter + ) + throws NotFoundException { Session session = HibernateUtil.getSessionFactory().getCurrentSession(); session.beginTransaction(); List<Variable> variables = session.createQuery("from Variable").list(); session.getTransaction().commit(); - return variables; + return new ResponseEntity<List<Variable>>(HttpStatus.OK).ok(variables); } @RequestMapping(value = "/variables/{code}") @ResponseBody - public Variable getVariable(@PathVariable("code") String code){ + @ApiOperation(value = "Get a variable", notes = "", response = Variable.class) + @ApiResponses(value = { + @ApiResponse(code = 200, message = "Found"), + @ApiResponse(code = 404, message = "Not found") }) + public ResponseEntity<Variable> getAVariable( + @ApiParam(value = "code ( multiple codes are allowed, separeted by \",\" )",required=true ) @PathVariable("code") String code + ) + throws NotFoundException { Session session = HibernateUtil.getSessionFactory().getCurrentSession(); session.beginTransaction(); org.hibernate.Query query = session.createQuery("from Variable where code= :code"); query.setString("code", code); Variable variable = (Variable) query.uniqueResult(); session.getTransaction().commit(); - return variable; + return new ResponseEntity<Variable>(HttpStatus.OK).ok(variable); } @RequestMapping(value = "/variables/{code}/values") @ResponseBody - public List<Value> getValues(@PathVariable("code") String code){ + @ApiOperation(value = "Get values from a variable", notes = "", response = Value.class, responseContainer = "List") + @ApiResponses(value = { + @ApiResponse(code = 200, message = "Found"), + @ApiResponse(code = 404, message = "Not found") }) + public ResponseEntity<List<Value>> getValuesFromAVariable( + @ApiParam(value = "code",required=true ) @PathVariable("code") String code, + @ApiParam(value = "Pattern to match") @RequestParam(value = "q", required = false) String q + ) + throws NotFoundException { Session session = HibernateUtil.getSessionFactory().getCurrentSession(); session.beginTransaction(); List<Value> values = session.createQuery("select values from Variable where code= :code").setString("code", code).list(); session.getTransaction().commit(); - return values; + return new ResponseEntity<List<Value>>(HttpStatus.OK).ok(values); } - @Override - protected void configure(HttpSecurity http) throws Exception { - // @formatter:off - http.antMatcher("/**") - .authorizeRequests() - .antMatchers("/", "/frontend/**", "/webjars/**").permitAll() - .anyRequest().authenticated() - .and().exceptionHandling().authenticationEntryPoint(new LoginUrlAuthenticationEntryPoint("/")) - .and().logout().logoutSuccessUrl("/").permitAll() - .and().csrf().csrfTokenRepository(csrfTokenRepository()) - .and().addFilterAfter(csrfHeaderFilter(), CsrfFilter.class) - .addFilterBefore(ssoFilter(), BasicAuthenticationFilter.class); - // @formatter:on - } - - public static void main(String[] args) { - SpringApplication.run(MIPApplication.class, args); - } - - @Bean - public FilterRegistrationBean oauth2ClientFilterRegistration( - OAuth2ClientContextFilter filter) { - FilterRegistrationBean registration = new FilterRegistrationBean(); - registration.setFilter(filter); - registration.setOrder(-100); - return registration; - } - - private Filter ssoFilter() { - OAuth2ClientAuthenticationProcessingFilter hbpFilter = new OAuth2ClientAuthenticationProcessingFilter("/login/hbp"); - OAuth2RestTemplate hbpTemplate = new OAuth2RestTemplate(hbp(), oauth2ClientContext); - hbpFilter.setRestTemplate(hbpTemplate); - hbpFilter.setTokenServices(new UserInfoTokenServices(hbpResource().getUserInfoUri(), hbp().getClientId())); - return hbpFilter; - } - - @Bean - @ConfigurationProperties("hbp.client") - OAuth2ProtectedResourceDetails hbp() { - return new AuthorizationCodeResourceDetails(); - } - - @Bean - @ConfigurationProperties("hbp.resource") - ResourceServerProperties hbpResource() { - return new ResourceServerProperties(); - } - - private Filter csrfHeaderFilter() { - return new OncePerRequestFilter() { - @Override - protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, - FilterChain filterChain) throws ServletException, IOException { - CsrfToken csrf = (CsrfToken) request.getAttribute(CsrfToken.class.getName()); - if (csrf != null) { - Cookie cookie = WebUtils.getCookie(request, "XSRF-TOKEN"); - String token = csrf.getToken(); - if (cookie == null || token != null && !token.equals(cookie.getValue())) { - cookie = new Cookie("XSRF-TOKEN", token); - cookie.setPath("/"); - response.addCookie(cookie); - } - } - filterChain.doFilter(request, response); - } - }; - } +} - private CsrfTokenRepository csrfTokenRepository() { - HttpSessionCsrfTokenRepository repository = new HttpSessionCsrfTokenRepository(); - repository.setHeaderName("X-XSRF-TOKEN"); - return repository; +@javax.annotation.Generated(value = "class io.swagger.codegen.languages.SpringMVCServerCodegen", date = "2016-01-06T09:32:22.266Z") +class NotFoundException extends ApiException { + private int code; + public NotFoundException (int code, String msg) { + super(code, msg); + this.code = code; } +} - private String getUserInfos() { - OAuth2Authentication oAuth2Authentication = (OAuth2Authentication) SecurityContextHolder.getContext().getAuthentication(); - Authentication userAuthentication = oAuth2Authentication.getUserAuthentication(); - System.out.println(userAuthentication.getDetails().toString()); - return userAuthentication.getDetails().toString(); +@javax.annotation.Generated(value = "class io.swagger.codegen.languages.SpringMVCServerCodegen", date = "2016-01-06T09:32:22.266Z") +class ApiException extends Exception{ + private int code; + public ApiException (int code, String msg) { + super(msg); + this.code = code; } - - private User getUser(Principal principal) { - Session session = HibernateUtil.getSessionFactory().getCurrentSession(); - session.beginTransaction(); - org.hibernate.Query query = session.createQuery("from User where username= :username"); - query.setString("username", principal.getName()); - User user = (User) query.uniqueResult(); - session.getTransaction().commit(); - if(user == null) - { - session = HibernateUtil.getSessionFactory().getCurrentSession(); - session.beginTransaction(); - user = new User(getUserInfos()); - session.save(user); - session.getTransaction().commit(); - } - return user; - } - }