diff --git a/src/main/java/ac/cnu/realcoding/controller/UrlShortenerController.java b/src/main/java/ac/cnu/realcoding/controller/UrlShortenerController.java index 35ecf3b..02379fe 100644 --- a/src/main/java/ac/cnu/realcoding/controller/UrlShortenerController.java +++ b/src/main/java/ac/cnu/realcoding/controller/UrlShortenerController.java @@ -24,10 +24,27 @@ public UrlShortenerController(UrlShortenerService urlShortenerService) { this.urlShortenerService = urlShortenerService; } - @GetMapping("health") - public Mono healthCheck() { + @GetMapping("health/{n}") //{} 변수로 처리하겠다. + public Mono healthCheck(@PathVariable int n) { // For basic tutorial - return Mono.just("Hello World"); + return fib(n).map(element -> { + return String.valueOf(element); + }); + } + + private Mono fib(int n) { + if(n==0) { + return Mono.just(0); + } + if(n==1 || n==2) { + return Mono.just(1); + } + + Mono f0 = fib(n-1); + Mono f1 = fib(n-2); + return Mono.zip(f0, f1, (n0, n1) -> { + return n0+n1; + }); } @GetMapping("{encoded}") diff --git a/src/main/java/ac/cnu/realcoding/encoding/Base62Processor.java b/src/main/java/ac/cnu/realcoding/encoding/Base62Processor.java index e35c1ad..1d42de7 100644 --- a/src/main/java/ac/cnu/realcoding/encoding/Base62Processor.java +++ b/src/main/java/ac/cnu/realcoding/encoding/Base62Processor.java @@ -6,11 +6,22 @@ public class Base62Processor { public static String encode(long number) { // TODO: Implement Base62 Encoding Algorithm. - return ""; + + StringBuilder sb = new StringBuilder(); + do { + sb.append(CODEC.charAt((int)(number%BASE))); + number /= BASE; + } while (number > 0); + return sb.reverse().toString(); } public static long decode(String encoded) { // TODO: Implement Base62 Decoding Algorithm. - return 0; + long sum = 0; + for(Character ch : encoded.toCharArray()) { + sum *= BASE; + sum += CODEC.indexOf(ch); + } + return sum; } } diff --git a/src/main/java/ac/cnu/realcoding/repository/URLInformation.java b/src/main/java/ac/cnu/realcoding/repository/URLInformation.java index 6003786..d9f3490 100644 --- a/src/main/java/ac/cnu/realcoding/repository/URLInformation.java +++ b/src/main/java/ac/cnu/realcoding/repository/URLInformation.java @@ -9,6 +9,9 @@ public class URLInformation { @Id private Long id; + private String url; + public URLInformation(String url) { + this.url=url; } } diff --git a/src/main/java/ac/cnu/realcoding/service/UrlShortenerService.java b/src/main/java/ac/cnu/realcoding/service/UrlShortenerService.java index 8bb4c5c..70b970a 100644 --- a/src/main/java/ac/cnu/realcoding/service/UrlShortenerService.java +++ b/src/main/java/ac/cnu/realcoding/service/UrlShortenerService.java @@ -2,6 +2,8 @@ import java.net.URI; +import ac.cnu.realcoding.encoding.Base62Processor; +import ac.cnu.realcoding.repository.URLInformation; import org.springframework.stereotype.Service; import ac.cnu.realcoding.configurations.ApplicationConfiguration; @@ -9,6 +11,7 @@ import ac.cnu.realcoding.models.UrlShortenerResponse; import ac.cnu.realcoding.repository.URLRepository; import lombok.RequiredArgsConstructor; +import org.springframework.web.util.UriComponentsBuilder; import reactor.core.publisher.Mono; @Service @@ -22,7 +25,10 @@ public Mono unshortenUrl(String encoded) { // Problem A: Decode encoded String // Problem B: Get full url by querying decoded PK. // Problem C: if encoded string is invalid or not found return Bad Request - return Mono.error(new UnsupportedOperationException("not implemented")); + return Mono.just(Base62Processor.decode(encoded)) + .flatMap(decoded -> urlRepository.findById(decoded)) + .map(URLInformation::getUrl) + .map(URI::create); } public Mono shortenUrl(UrlShortenerRequest urlShortenerRequest) { @@ -30,6 +36,16 @@ public Mono shortenUrl(UrlShortenerRequest urlShortenerReq // Problem B: Insert to database and get PK from database, PK should be auto-generated integer. // Problem C: Encode PK by using Base 63. // Problem D: Build UrlShortenerResponse with server host and port. - return Mono.error(new UnsupportedOperationException("not implemented")); + String url = urlShortenerRequest.getUrl(); + return urlRepository.save(new URLInformation(url)) + .map(URLInformation::getId) + .map(Base62Processor::encode) + .map(encoded -> UriComponentsBuilder.newInstance() + .scheme("http") + .host(applicationConfig.getHost()) + .port(applicationConfig.getPort()) + .path(encoded) + .toUriString()) + .map(UrlShortenerResponse::of); } }