Skip to content

Commit 01fbfc7

Browse files
committed
add api versioning and swagger2 docs
1 parent 74d7320 commit 01fbfc7

File tree

9 files changed

+51
-21
lines changed

9 files changed

+51
-21
lines changed

.gitignore

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,4 +23,6 @@
2323
/nbbuild/
2424
/dist/
2525
/nbdist/
26-
/.nb-gradle/
26+
/.nb-gradle/
27+
28+
/uploads/

build.gradle

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,9 @@ dependencies {
2929
compile('org.springframework.boot:spring-boot-starter-security')
3030
compile('org.springframework.boot:spring-boot-starter-web')
3131
compile("com.auth0:java-jwt:3.4.0")
32+
compile ("io.springfox:springfox-swagger2:2.9.2")
33+
compile ("io.springfox:springfox-swagger-ui:2.9.2")
34+
compile ("io.springfox:springfox-spring-web:2.9.2")
3235
runtime('mysql:mysql-connector-java')
3336
testCompile('org.springframework.boot:spring-boot-starter-test')
3437
}

src/main/java/com/streaming/Application.java

Lines changed: 32 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -6,19 +6,43 @@
66
import org.springframework.boot.context.properties.EnableConfigurationProperties;
77
import org.springframework.context.annotation.Bean;
88
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
9+
import springfox.documentation.builders.ApiInfoBuilder;
10+
import springfox.documentation.builders.PathSelectors;
11+
import springfox.documentation.builders.RequestHandlerSelectors;
12+
import springfox.documentation.spi.DocumentationType;
13+
import springfox.documentation.spring.web.plugins.Docket;
14+
import springfox.documentation.swagger2.annotations.EnableSwagger2;
15+
16+
import static springfox.documentation.builders.PathSelectors.regex;
917

1018
@SpringBootApplication
1119
@EnableConfigurationProperties({
12-
FileStorageProperties.class
20+
FileStorageProperties.class
1321
})
22+
@EnableSwagger2
1423
public class Application {
1524

16-
@Bean
17-
public BCryptPasswordEncoder bCryptPasswordEncoder() {
18-
return new BCryptPasswordEncoder();
19-
}
25+
@Bean
26+
public BCryptPasswordEncoder bCryptPasswordEncoder() {
27+
return new BCryptPasswordEncoder();
28+
}
29+
30+
@Bean
31+
public Docket apiV10() {
32+
return new Docket(DocumentationType.SWAGGER_2)
33+
.groupName("live-streaming-api-v1.0")
34+
.select()
35+
.apis(RequestHandlerSelectors.basePackage("com.streaming.controllers"))
36+
.paths(PathSelectors.any())
37+
.build()
38+
.apiInfo(new ApiInfoBuilder()
39+
.version("1.0")
40+
.title("Live Streaming API")
41+
.description("Documentation Live Streaming API v1.0")
42+
.build());
43+
}
2044

21-
public static void main(String[] args) {
22-
SpringApplication.run(Application.class, args);
23-
}
45+
public static void main(String[] args) {
46+
SpringApplication.run(Application.class, args);
47+
}
2448
}

src/main/java/com/streaming/controllers/UserController.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@
1111
import java.util.Date;
1212

1313
@RestController
14-
@RequestMapping("/users")
14+
@RequestMapping("/api/v1.0/users")
1515
public class UserController {
1616

1717
private UserRepository userRepository;

src/main/java/com/streaming/controllers/VideoController.java

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -17,13 +17,11 @@
1717

1818
import javax.servlet.http.HttpServletRequest;
1919
import java.io.IOException;
20-
import java.util.ArrayList;
21-
import java.util.Arrays;
2220
import java.util.List;
2321
import java.util.Optional;
2422

2523
@RestController
26-
@RequestMapping("/videos")
24+
@RequestMapping("/api/v1.0/videos")
2725
public class VideoController {
2826

2927
private static final Logger logger = LoggerFactory.getLogger(VideoController.class);
@@ -67,10 +65,11 @@ public Video getVideo(@PathVariable Long id) {
6765
return video.isPresent() ? video.get() : null;
6866
}
6967

70-
@GetMapping("/download/{fileName:.+}")
71-
public ResponseEntity<Resource> downloadFile(@PathVariable String fileName, HttpServletRequest request) {
68+
@GetMapping("/download/{id:.+}")
69+
public ResponseEntity<Resource> downloadFile(@PathVariable Long id, HttpServletRequest request) {
70+
Optional<Video> video = videoRepository.findById(id);
7271
// Load file as Resource
73-
Resource resource = fileStorageService.loadFileAsResource(fileName);
72+
Resource resource = fileStorageService.loadFileAsResource(video.get().getUrl());
7473

7574
// try to find file's content type
7675
String contentType = null;

src/main/java/com/streaming/domains/Video.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
package com.streaming.domains;
22

3+
import com.fasterxml.jackson.annotation.JsonIgnore;
4+
35
import javax.persistence.*;
46
import java.io.Serializable;
57
import java.util.Date;
@@ -13,6 +15,7 @@ public class Video implements Serializable {
1315
private Long id;
1416
@ManyToOne(fetch = FetchType.LAZY)
1517
@JoinColumn(name = "user_id")
18+
@JsonIgnore
1619
private User user;
1720
private String title;
1821
private double size;

src/main/java/com/streaming/security/JWTAuthenticationFilter.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -56,5 +56,6 @@ protected void successfulAuthentication(HttpServletRequest req,
5656
.withExpiresAt(new Date(System.currentTimeMillis() + EXPIRATION_TIME))
5757
.sign(HMAC512(SECRET.getBytes()));
5858
res.addHeader(HEADER_STRING, TOKEN_PREFIX + token);
59+
res.addHeader("Access-Control-Expose-Headers", HEADER_STRING);
5960
}
6061
}

src/main/java/com/streaming/security/SecurityConstants.java

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,5 +5,4 @@ public class SecurityConstants {
55
public static final long EXPIRATION_TIME = 10 * 24 * 60 * 60 * 1000; // 864000000 milliseconds / 10 days
66
public static final String TOKEN_PREFIX = "Bearer ";
77
public static final String HEADER_STRING = "Authorization";
8-
public static final String SIGN_UP_URL = "/users/sign-up";
98
}

src/main/java/com/streaming/security/WebSecurity.java

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -13,8 +13,6 @@
1313
import org.springframework.web.cors.UrlBasedCorsConfigurationSource;
1414
import org.springframework.context.annotation.Bean;
1515

16-
import static com.streaming.security.SecurityConstants.SIGN_UP_URL;
17-
1816
@EnableWebSecurity
1917
public class WebSecurity extends WebSecurityConfigurerAdapter {
2018
private UserDetailsServiceImpl userDetailsService;
@@ -28,8 +26,9 @@ public WebSecurity(UserDetailsServiceImpl userDetailsService, BCryptPasswordEnco
2826
@Override
2927
protected void configure(HttpSecurity http) throws Exception {
3028
http.cors().and().csrf().disable().authorizeRequests()
31-
.antMatchers(HttpMethod.POST, SIGN_UP_URL).permitAll()
32-
.anyRequest().authenticated()
29+
// .antMatchers(HttpMethod.POST, SIGN_UP_URL).permitAll()
30+
.antMatchers("/videos/**").authenticated()
31+
.anyRequest().permitAll()
3332
.and()
3433
.addFilter(new JWTAuthenticationFilter(authenticationManager()))
3534
.addFilter(new JWTAuthorizationFilter(authenticationManager()))

0 commit comments

Comments
 (0)