Skip to content

Commit d35af0d

Browse files
author
Fatih Totrakanlı
committed
Initial commit.
0 parents  commit d35af0d

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

64 files changed

+12932
-0
lines changed

.gitignore

+25
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
target/
2+
!.mvn/wrapper/maven-wrapper.jar
3+
4+
### STS ###
5+
.apt_generated
6+
.classpath
7+
.factorypath
8+
.project
9+
.settings
10+
.springBeans
11+
12+
### IntelliJ IDEA ###
13+
.idea
14+
*.iws
15+
*.iml
16+
*.ipr
17+
18+
### NetBeans ###
19+
nbproject/private/
20+
build/
21+
nbbuild/
22+
dist/
23+
nbdist/
24+
.nb-gradle/
25+
.gitignore

README.md

+48
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
# SpringBoot - Spotify API - ReactJS
2+
###### This is a web application developed using Spotify API with React.
3+
###### There are two modules in the project.
4+
###### spotify-api-server is a Spring Boot application with using Spotify Search API.
5+
###### spotify-api-ui is a ReactJS application.
6+
7+
![alt tag](./example-min.png)
8+
9+
## spotify-api-server
10+
11+
For use Spotify API you need to take authorization token from Spotify.
12+
You can take authorization token from [Here](https://developer.spotify.com/web-api/console/get-search-item/)
13+
14+
In the ```
15+
application.yml
16+
```, you can set token here.
17+
18+
This token looks like this;
19+
```
20+
token: "BQDYNZJKRPp271pXIiMRrRbx77TSo5BuQKMZeBXFlD9FwwRP4VjbkKxTfwKOvZSS_kZCQYSGK9QA7dKFl63tXo4taPItG6ya0AL-7L2zvOlI8IDrRwoF4yEws8AJjXtf2-PKJqj3hmaz765w_A"
21+
```
22+
23+
The project is a Spring Boot project. For this reason, you can run the Application class by running it.
24+
25+
## spotify-api-ui
26+
27+
###### This module uses React and React-Bootstrap. Includes paging and limiting features about Spotify response.
28+
29+
In the project folder ```
30+
$ cd spotify-api-ui
31+
``` use the following command.
32+
```
33+
$ npm install
34+
```
35+
36+
then
37+
38+
```
39+
$ npm start
40+
```
41+
42+
and project will start at ```
43+
http://127.0.0.1:3000
44+
```
45+
46+
## License
47+
48+
The MIT License (MIT) Copyright (c) 2017 Fatih Totrakanlı

example-min.png

163 KB
Loading

pom.xml

+20
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
2+
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
3+
<modelVersion>4.0.0</modelVersion>
4+
5+
<groupId>com.spotify.api</groupId>
6+
<artifactId>com.spotify.api</artifactId>
7+
<version>1.0-SNAPSHOT</version>
8+
<modules>
9+
<module>spotify-api-server</module>
10+
</modules>
11+
<packaging>pom</packaging>
12+
13+
<name>com.spotify.api</name>
14+
<url>http://maven.apache.org</url>
15+
16+
<properties>
17+
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
18+
</properties>
19+
20+
</project>

spotify-api-server/pom.xml

+54
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
2+
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
3+
4+
<modelVersion>4.0.0</modelVersion>
5+
6+
<artifactId>com.spotify.api</artifactId>
7+
<packaging>jar</packaging>
8+
9+
<name>com.spotify.api</name>
10+
<url>http://maven.apache.org</url>
11+
12+
<properties>
13+
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
14+
</properties>
15+
16+
<parent>
17+
<groupId>org.springframework.boot</groupId>
18+
<artifactId>spring-boot-starter-parent</artifactId>
19+
<version>1.5.2.RELEASE</version>
20+
<relativePath/>
21+
</parent>
22+
23+
<dependencies>
24+
<dependency>
25+
<groupId>org.apache.httpcomponents</groupId>
26+
<artifactId>httpclient</artifactId>
27+
<version>4.5.2</version>
28+
</dependency>
29+
<dependency>
30+
<groupId>org.springframework.boot</groupId>
31+
<artifactId>spring-boot-starter</artifactId>
32+
</dependency>
33+
<dependency>
34+
<groupId>org.springframework.boot</groupId>
35+
<artifactId>spring-boot-starter-web</artifactId>
36+
</dependency>
37+
<dependency>
38+
<groupId>junit</groupId>
39+
<artifactId>junit</artifactId>
40+
<version>3.8.1</version>
41+
<scope>test</scope>
42+
</dependency>
43+
</dependencies>
44+
45+
46+
<build>
47+
<plugins>
48+
<plugin>
49+
<groupId>org.springframework.boot</groupId>
50+
<artifactId>spring-boot-maven-plugin</artifactId>
51+
</plugin>
52+
</plugins>
53+
</build>
54+
</project>
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
package com.spotify.api.controller;
2+
3+
import org.springframework.boot.CommandLineRunner;
4+
import org.springframework.boot.SpringApplication;
5+
import org.springframework.boot.autoconfigure.SpringBootApplication;
6+
7+
import java.io.IOException;
8+
9+
@SpringBootApplication
10+
public class Application implements CommandLineRunner {
11+
12+
public static void main(String[] args) throws IOException {
13+
SpringApplication.run(Application.class, args);
14+
}
15+
16+
@Override
17+
public void run(String... strings) throws Exception {
18+
19+
}
20+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,72 @@
1+
package com.spotify.api.controller.controller;
2+
3+
import com.spotify.api.controller.helper.SearchModel;
4+
import org.apache.http.HttpResponse;
5+
import org.apache.http.client.HttpClient;
6+
import org.apache.http.client.methods.HttpGet;
7+
import org.apache.http.impl.client.HttpClientBuilder;
8+
import org.slf4j.Logger;
9+
import org.slf4j.LoggerFactory;
10+
import org.springframework.beans.factory.annotation.Value;
11+
import org.springframework.web.bind.annotation.*;
12+
13+
import java.io.BufferedReader;
14+
import java.io.IOException;
15+
import java.io.InputStreamReader;
16+
17+
import static org.apache.http.HttpHeaders.USER_AGENT;
18+
19+
/**
20+
* Created by Fatih Totrakanli on 31/05/2017.
21+
*/
22+
23+
@RestController
24+
@RequestMapping(value = "search")
25+
public class SearchController {
26+
27+
private static Logger logger = LoggerFactory.getLogger(SearchController.class.getName());
28+
29+
@Value("${token}")
30+
private String token;
31+
32+
@PostMapping(value = "/api")
33+
public StringBuffer searchQ(@RequestBody SearchModel search) throws IOException {
34+
35+
String query = search.getQuery().equals("") ? "%2B" : search.getQuery().replaceAll("\\s+", "%2B");
36+
logger.info(query + " search started...");
37+
38+
String url = "https://api.spotify.com/v1/search?q=" + query + "&type=track&limit=" + search.getLimit() + "&offset=" + search.getOffset();
39+
40+
HttpClient client = HttpClientBuilder.create().build();
41+
HttpGet request = new HttpGet(url);
42+
43+
request.addHeader("User-Agent", USER_AGENT);
44+
request.addHeader("Authorization", "Bearer " + token);
45+
request.addHeader("Accept", "application/json");
46+
HttpResponse response = client.execute(request);
47+
48+
logger.info("Response Code : " + response.getStatusLine().getStatusCode());
49+
50+
if (response.getStatusLine().getStatusCode() == 401) {
51+
String error = "The server did not respond properly. Please check spotify authorization token from application.yml or get new token from (https://developer.spotify.com/web-api/console/get-search-item/).";
52+
logger.error(error);
53+
throw new RuntimeException(error);
54+
} else {
55+
if (response.getStatusLine().getStatusCode() != 200)
56+
throw new RuntimeException("Something went wrong.");
57+
}
58+
59+
BufferedReader rd = new BufferedReader(new InputStreamReader(response.getEntity().getContent()));
60+
61+
StringBuffer result = new StringBuffer();
62+
String line = "";
63+
logger.info("Reading response...");
64+
while ((line = rd.readLine()) != null) {
65+
result.append(line);
66+
}
67+
68+
logger.info("Reading response completed successfully.");
69+
70+
return result;
71+
}
72+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
package com.spotify.api.controller.helper;
2+
3+
import org.springframework.stereotype.Component;
4+
5+
import javax.servlet.*;
6+
import javax.servlet.http.HttpServletResponse;
7+
import java.io.IOException;
8+
9+
/**
10+
* Created by Fatih Totrakanli on 31/05/2017.
11+
*/
12+
13+
@Component
14+
public class CorsFilter implements Filter {
15+
16+
17+
public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException {
18+
HttpServletResponse response = (HttpServletResponse) res;
19+
response.setHeader("Access-Control-Allow-Origin", "*");
20+
response.setHeader("Access-Control-Allow-Methods", "POST, GET, PUT, OPTIONS, DELETE");
21+
response.setHeader("Access-Control-Max-Age", "3600");
22+
response.setHeader("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type");
23+
chain.doFilter(req, res);
24+
}
25+
26+
public void init(FilterConfig filterConfig) {
27+
}
28+
29+
public void destroy() {
30+
}
31+
32+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
package com.spotify.api.controller.helper;
2+
3+
/**
4+
* Created by Fatih Totrakanli on 31/05/2017.
5+
*/
6+
public class SearchModel {
7+
8+
private String query;
9+
10+
private int limit = 20;
11+
12+
private int offset = 0;
13+
14+
public String getQuery() {
15+
return query;
16+
}
17+
18+
public void setQuery(String query) {
19+
this.query = query;
20+
}
21+
22+
public int getOffset() {
23+
return offset;
24+
}
25+
26+
public void setOffset(int offset) {
27+
this.offset = offset;
28+
}
29+
30+
public int getLimit() {
31+
return limit;
32+
}
33+
34+
public void setLimit(int limit) {
35+
this.limit = limit;
36+
}
37+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
server:
2+
servlet-path: /rest/
3+
port: 8081
4+
5+
token: "BQC_DprHnxDYM3SwDFmL3rb63RuWdwmqmq3sEAXnpNYgf0OcWZcusYIC9eqaGk1t1iJJcyzx1j6LQx5usMrm0cK4NDjiF5_tvajqsbTxHDL6z03GPncnksjGMtp7tAaJbw3SBB1wr0vYurAFnQ"
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
package com.spotify.api;
2+
3+
import junit.framework.Test;
4+
import junit.framework.TestCase;
5+
import junit.framework.TestSuite;
6+
7+
/**
8+
* Unit test for simple App.
9+
*/
10+
public class AppTest
11+
extends TestCase
12+
{
13+
/**
14+
* Create the test case
15+
*
16+
* @param testName name of the test case
17+
*/
18+
public AppTest( String testName )
19+
{
20+
super( testName );
21+
}
22+
23+
/**
24+
* @return the suite of tests being tested
25+
*/
26+
public static Test suite()
27+
{
28+
return new TestSuite( AppTest.class );
29+
}
30+
31+
/**
32+
* Rigourous Test :-)
33+
*/
34+
public void testApp()
35+
{
36+
assertTrue( true );
37+
}
38+
}

spotify-api-ui/.gitignore

+21
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
# See https://help.github.com/ignore-files/ for more about ignoring files.
2+
3+
# dependencies
4+
/node_modules
5+
6+
# testing
7+
/coverage
8+
9+
# production
10+
/build
11+
12+
# misc
13+
.DS_Store
14+
.env.local
15+
.env.development.local
16+
.env.test.local
17+
.env.production.local
18+
19+
npm-debug.log*
20+
yarn-debug.log*
21+
yarn-error.log*

0 commit comments

Comments
 (0)