Skip to content
This repository was archived by the owner on Jun 11, 2022. It is now read-only.

Commit 219a995

Browse files
committed
Add posibility to send requests with multiple values in one parameter
1 parent 82b1a7a commit 219a995

File tree

8 files changed

+126
-75
lines changed

8 files changed

+126
-75
lines changed

server/src/main/java/com/balinski/api_project/database/DatabaseProxy.java

+18-7
Original file line numberDiff line numberDiff line change
@@ -25,14 +25,13 @@ public class DatabaseProxy {
2525
private DatabaseProxy(){};
2626

2727
public static List<Map<String, Object>> querySelect(String sql) throws DatabaseException {
28-
List<Map<String, Object>> data;
28+
List<Map<String, Object>> data = new LinkedList<>();
2929

3030
try(Connection connection = getConnection()) {
3131
try(Statement statement = connection.createStatement()) {
3232
try(ResultSet rs = statement.executeQuery(sql)) {
3333
ResultSetMetaData md = rs.getMetaData();
3434
int columns = md.getColumnCount();
35-
data = new LinkedList<>();
3635

3736
while(rs.next()) {
3837
Map<String, Object> row = new HashMap<>(columns);
@@ -53,15 +52,27 @@ public static List<Map<String, Object>> querySelect(String sql) throws DatabaseE
5352
return data;
5453
}
5554

56-
public static int queryUpdate(String sql, boolean transaction) throws DatabaseException {
57-
int rowsAffected = 0;
55+
public static List<Map<String, Object>> queryUpdate(String sql, boolean transaction) throws DatabaseException {
56+
List<Map<String, Object>> data = new LinkedList<>();
5857

5958
try(Connection connection = getConnection()) {
6059
if(transaction)
6160
connection.setAutoCommit(false);
6261

63-
try(Statement statement = connection.createStatement()) {
64-
rowsAffected = statement.executeUpdate(sql);
62+
try(PreparedStatement statement = connection.prepareStatement(sql, Statement.RETURN_GENERATED_KEYS)) {
63+
statement.executeUpdate();
64+
ResultSet rs = statement.getGeneratedKeys();
65+
ResultSetMetaData md = rs.getMetaData();
66+
int columns = md.getColumnCount();
67+
68+
while(rs.next()) {
69+
Map<String, Object> row = new HashMap<>(columns);
70+
71+
for (int i = 1; i <= columns; i++)
72+
row.put(md.getColumnName(i), rs.getObject(i));
73+
74+
data.add(row);
75+
}
6576
}
6677

6778
if(transaction) {
@@ -75,7 +86,7 @@ public static int queryUpdate(String sql, boolean transaction) throws DatabaseEx
7586
closeConnection();
7687
}
7788

78-
return rowsAffected;
89+
return data;
7990
}
8091

8192
protected static Connection getConnection() throws DatabaseException {

server/src/main/java/com/balinski/api_project/database/dao/Dao.java

+10-15
Original file line numberDiff line numberDiff line change
@@ -52,18 +52,9 @@ public List<T> getIdBetween(int start, int stop) throws DaoException {
5252
return toListOfObjects(result);
5353
}
5454

55-
public int add(T obj) throws DaoException {
56-
if(obj == null)
57-
return 0;
58-
59-
String sql = String.format("INSERT INTO %s VALUES (%s);", type.toString(), obj.asCsv());
60-
61-
return DaoManager.modifyData(sql, false);
62-
}
63-
64-
public int addAll(List<T> list, boolean transaction) throws DaoException {
55+
public List<T> add(List<T> list, boolean transaction) throws DaoException {
6556
if(list == null || list.size() == 0)
66-
return 0;
57+
return Collections.emptyList();
6758

6859
StringBuilder sql = new StringBuilder(String.format("INSERT INTO %s VALUES ", type.toString()));
6960

@@ -75,13 +66,17 @@ public int addAll(List<T> list, boolean transaction) throws DaoException {
7566

7667
sql.replace(sql.lastIndexOf(", "), sql.length(), ";");
7768

78-
return DaoManager.modifyData(sql.toString(), transaction);
69+
List<Map<String, Object>> result = DaoManager.modifyData(sql.toString(), transaction);
70+
71+
return toListOfObjects(result);
7972
}
8073

81-
public boolean delete(int id) throws DaoException {
82-
return DaoManager.modifyData(
74+
public List<T> delete(int id) throws DaoException {
75+
List<Map<String, Object>> result = DaoManager.modifyData(
8376
String.format("DELETE FROM %s WHERE %s_ID=%d;", type.toString(), type.toString(), id),
84-
false) > 0;
77+
false);
78+
79+
return toListOfObjects(result);
8580
}
8681

8782
protected List<T> toListOfObjects(List<Map<String, Object>> listOfMaps) throws DaoException {

server/src/main/java/com/balinski/api_project/database/dao/DaoManager.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ static List<Map<String, Object>> getData(String sql) throws DaoException {
3333
}
3434
}
3535

36-
static int modifyData(String sql, boolean transaction) throws DaoException {
36+
static List<Map<String, Object>> modifyData(String sql, boolean transaction) throws DaoException {
3737
try {
3838
return DatabaseProxy.queryUpdate(sql, transaction);
3939
} catch (DatabaseException e) {

server/src/main/java/com/balinski/api_project/database/dao/UserDao.java

+10-6
Original file line numberDiff line numberDiff line change
@@ -37,19 +37,23 @@ public List<User> getByToken(String token) throws DaoException {
3737
return toListOfObjects(result);
3838
}
3939

40-
public boolean renewAccess(int id, int newLimit) throws DaoException {
41-
return DaoManager.modifyData(
40+
public List<User> renewAccess(int id, int newLimit) throws DaoException {
41+
List<Map<String, Object>> result = DaoManager.modifyData(
4242
String.format("UPDATE USER SET REQUESTS_SENT=0, USE_LIMIT=%d, LAST_UPDATE='%s' WHERE USER_ID=%d;",
4343
newLimit, LocalDateTime.now().format(toDateTime), id),
44-
false) > 0;
44+
false);
45+
46+
return toListOfObjects(result);
4547
}
4648

47-
public boolean incrementUses(int id) throws DaoException {
48-
return DaoManager.modifyData(
49+
public List<User> incrementUses(int id) throws DaoException {
50+
List<Map<String, Object>> result = DaoManager.modifyData(
4951
String.format("UPDATE USER SET REQUESTS_SENT=" +
5052
"((SELECT U.REQUESTS_SENT FROM USER U WHERE U.USER_ID=%d)+1), " +
5153
"LAST_UPDATE='%s' " +
5254
"WHERE USER_ID=%d;", id, LocalDateTime.now().format(toDateTime), id),
53-
false) > 0;
55+
false);
56+
57+
return toListOfObjects(result);
5458
}
5559
}

server/src/main/java/com/balinski/api_project/servlet/ActorServlet.java

+13-7
Original file line numberDiff line numberDiff line change
@@ -35,15 +35,21 @@ public void doGet(HttpServletRequest req, HttpServletResponse resp) throws IOExc
3535
User user = UserAuthenticator.authenticateAndGet(param.get("user"), param.get("token"));
3636
UserAuthenticator.incrementUses(user);
3737

38-
List<Actor> actors;
38+
List<Actor> actors = new LinkedList<>();
3939
var dao = DaoManager.getActorDao();
4040

41-
if(param.get("id") != null)
42-
actors = dao.getById(Integer.parseInt(param.get("id")));
43-
else if(param.get("firstName") != null)
44-
actors = dao.getByFirstName(param.get("firstName"));
45-
else if(param.get("lastName") != null)
46-
actors = dao.getByLastName(param.get("lastName"));
41+
if(param.get("id") != null) {
42+
for(var id : param.get("id").split(","))
43+
actors.addAll(dao.getById(Integer.parseInt(id)));
44+
}
45+
else if(param.get("firstName") != null) {
46+
for(var firstName : param.get("firstName").split(","))
47+
actors.addAll(dao.getByFirstName(firstName));
48+
}
49+
else if(param.get("lastName") != null) {
50+
for(var lastName : param.get("lastName").split(","))
51+
actors.addAll(dao.getByFirstName(lastName));
52+
}
4753
else
4854
actors = dao.getAll();
4955

server/src/main/java/com/balinski/api_project/servlet/AdminServlet.java

+59-23
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
import com.balinski.api_project.database.dao.DaoException;
44
import com.balinski.api_project.database.dao.DaoManager;
5+
import com.balinski.api_project.database.dao.UserDao;
56
import com.balinski.api_project.database.model.User;
67
import com.balinski.api_project.servlet.util.JsonResponseBuilder;
78
import com.balinski.api_project.servlet.util.UserAuthenticator;
@@ -15,6 +16,7 @@
1516
import java.security.MessageDigest;
1617
import java.security.NoSuchAlgorithmException;
1718
import java.time.LocalDateTime;
19+
import java.util.ArrayList;
1820
import java.util.List;
1921

2022

@@ -35,16 +37,46 @@ private String sha256(String name) throws NoSuchAlgorithmException {
3537
return hexString.toString();
3638
}
3739

38-
private User addUser(String name, int limit) throws DaoException, NoSuchAlgorithmException {
39-
if(limit < 0)
40-
throw new DaoException("Limit can not be a negative number.");
40+
private List<User> addUsers(String[] names, String[] limits) throws DaoException, NoSuchAlgorithmException {
41+
if(names.length != limits.length)
42+
throw new DaoException("Quantity of names and limits do not match.");
4143

42-
int newId = DaoManager.getUserDao().getMaxId()+1;
43-
User user = new User(newId, "user", name, sha256(name), 0,
44-
limit, LocalDateTime.now(), LocalDateTime.now());
45-
DaoManager.getUserDao().add(user);
44+
UserDao dao = DaoManager.getUserDao();
45+
int id = dao.getMaxId()+1;
46+
List<User> users = new ArrayList<>(names.length);
4647

47-
return user;
48+
for(int i = 0; i < names.length; i++) {
49+
if(Integer.parseInt(limits[i]) < 0)
50+
limits[i] = "0";
51+
52+
users.add(new User(id, "user", names[i], sha256(names[i]), 0,
53+
Integer.parseInt(limits[i]), LocalDateTime.now(), LocalDateTime.now()));
54+
55+
id++;
56+
}
57+
58+
return DaoManager.getUserDao().add(users, true);
59+
}
60+
61+
private List<User> renewAccess(String[] ids, String[] limits) throws DaoException {
62+
List<User> users = new ArrayList<>(ids.length);
63+
64+
for(int i = 0; i < ids.length; i++) {
65+
if(Integer.parseInt(limits[i]) < 0)
66+
limits[i] = "0";
67+
68+
users.addAll(DaoManager.getUserDao().renewAccess(Integer.parseInt(ids[i]), Integer.parseInt(limits[i])));
69+
}
70+
71+
return users;
72+
}
73+
74+
private List<User> deleteUsers(String[] ids) throws DaoException {
75+
List<User> users = new ArrayList<>(ids.length);
76+
for (String id : ids)
77+
users.addAll(DaoManager.getUserDao().delete(Integer.parseInt(id)));
78+
79+
return users;
4880
}
4981

5082
@Override
@@ -64,42 +96,46 @@ public void doGet(HttpServletRequest req, HttpServletResponse resp) throws IOExc
6496

6597
String action = req.getParameter("action").toLowerCase();
6698
String response;
67-
User user;
68-
boolean success;
99+
List<User> users;
100+
String[] userIds, userNames, userLimits;
69101

70102
switch(action) {
71103
case "add":
72104
if(req.getParameter("name") == null || req.getParameter("limit") == null)
73105
throw new DaoException("You have to provide name and limit to add new user.");
74106

75-
user = addUser(req.getParameter("name"), Integer.parseInt(req.getParameter("limit")));
76-
response = JsonResponseBuilder.mergeFromList(List.of(user));
107+
userNames = req.getParameter("name").split(",");
108+
userLimits = req.getParameter("limit").split(",");
109+
110+
users = addUsers(userNames, userLimits);
111+
112+
response = JsonResponseBuilder.mergeFromList(users);
77113
break;
78114

79115
case "renew":
80116
if(req.getParameter("id") == null || req.getParameter("limit") == null)
81117
throw new DaoException("You have to provide id and new limit to renew user's access.");
82118

83-
success = DaoManager.getUserDao()
84-
.renewAccess(Integer.parseInt(req.getParameter("id")),
85-
Integer.parseInt(req.getParameter("limit")));
86-
if(!success)
87-
throw new DaoException("Could not update the user. Check if provided parameters are valid.");
119+
userIds = req.getParameter("id").split(",");
120+
userLimits = req.getParameter("limit").split(",");
121+
122+
if(userIds.length != userLimits.length)
123+
throw new DaoException("Quantity of IDs and limits do not match.");
124+
125+
users = renewAccess(userIds, userLimits);
88126

89-
response = "User's access has been successfully renewed.";
127+
response = JsonResponseBuilder.mergeFromList(users);
90128
break;
91129

92130
case "delete":
93131
if(req.getParameter("id") == null)
94132
throw new DaoException("You have to provide id of user that you want to be deleted.");
95133

96-
success = DaoManager.getUserDao()
97-
.delete(Integer.parseInt(req.getParameter("id")));
134+
userIds = req.getParameter("id").split(",");
98135

99-
if(!success)
100-
throw new DaoException("Could not delete the user. Check if provided id is valid.");
136+
users = deleteUsers(userIds);
101137

102-
response = "The user has been successfully removed.";
138+
response = JsonResponseBuilder.mergeFromList(users);
103139
break;
104140

105141
default:

server/src/main/java/com/balinski/api_project/servlet/FilmServlet.java

+14-11
Original file line numberDiff line numberDiff line change
@@ -12,10 +12,7 @@
1212
import javax.servlet.http.HttpServletResponse;
1313
import java.io.IOException;
1414
import java.io.PrintWriter;
15-
import java.util.Collections;
16-
import java.util.Comparator;
17-
import java.util.List;
18-
import java.util.Set;
15+
import java.util.*;
1916
import java.util.stream.Collectors;
2017

2118
public class FilmServlet extends HttpServlet {
@@ -36,15 +33,21 @@ public void doGet(HttpServletRequest req, HttpServletResponse resp) throws IOExc
3633
User user = UserAuthenticator.authenticateAndGet(param.get("user"), param.get("token"));
3734
UserAuthenticator.incrementUses(user);
3835

39-
List<Film> films;
36+
List<Film> films = new LinkedList<>();
4037
var dao = DaoManager.getFilmDao();
4138

42-
if(param.get("id") != null)
43-
films = dao.getById(Integer.parseInt(param.get("id")));
44-
else if(param.get("title") != null)
45-
films = dao.getByTitle(param.get("title"));
46-
else if(param.get("language") != null)
47-
films = dao.getAvailableInLanguage(param.get("language"));
39+
if(param.get("id") != null){
40+
for(var id : param.get("id").split(","))
41+
films.addAll(dao.getById(Integer.parseInt(id)));
42+
}
43+
else if(param.get("title") != null){
44+
for(var title : param.get("title").split(","))
45+
films.addAll(dao.getByTitle(title));
46+
}
47+
else if(param.get("language") != null){
48+
for(var language : param.get("language").split(","))
49+
films.addAll(dao.getByTitle(language));
50+
}
4851
else if(param.get("minLength") != null) {
4952
films = dao.getLongerThan(Integer.parseInt(param.get("minLength")));
5053
films.sort(Comparator.comparing(Film::getLength).thenComparing(Film::getTitle));

server/src/main/java/com/balinski/api_project/servlet/util/UserAuthenticator.java

+1-5
Original file line numberDiff line numberDiff line change
@@ -30,10 +30,6 @@ public static User authenticateAndGet(String username, String token) throws DaoE
3030
}
3131

3232
public static void incrementUses(User user) throws DaoException {
33-
boolean success = DaoManager.getUserDao().incrementUses(user.getId());
34-
35-
if(!success)
36-
throw new DaoException("There was an error with authentication. " +
37-
"Please try again later or contact us if problem still occurs.");
33+
DaoManager.getUserDao().incrementUses(user.getId());
3834
}
3935
}

0 commit comments

Comments
 (0)