Skip to content

Commit ada80b3

Browse files
authored
Merge pull request #8 from PhantoNull/develop
Release 1.4
2 parents 92555a6 + 47c4b94 commit ada80b3

38 files changed

+828
-618
lines changed

pom.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@
1212

1313
<groupId>eu.rationence</groupId>
1414
<artifactId>PAT</artifactId>
15-
<version>1.3</version>
15+
<version>1.4</version>
1616
<name>PAT</name>
1717
<packaging>jar</packaging>
1818
<description>Project Activity Tracker Rationence</description>

src/main/java/eu/rationence/pat/HttpsConfiguration.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,9 +12,9 @@
1212

1313
@Configuration
1414
public class HttpsConfiguration {
15-
@Value("${server.port.http}") //Defined in application.properties file
15+
@Value("${server.port.http}")
1616
int httpPort;
17-
@Value("${server.port}") //Defined in application.properties file
17+
@Value("${server.port}")
1818
int httpsPort;
1919

2020
@Bean
Lines changed: 7 additions & 54 deletions
Original file line numberDiff line numberDiff line change
@@ -1,68 +1,21 @@
11
package eu.rationence.pat;
22

3-
import eu.rationence.pat.model.MonthlyNote;
4-
import eu.rationence.pat.model.User;
5-
import eu.rationence.pat.service.EmailService;
6-
import eu.rationence.pat.service.MonthlyNoteService;
7-
import eu.rationence.pat.service.UserService;
83
import org.modelmapper.ModelMapper;
9-
import org.slf4j.Logger;
10-
import org.slf4j.LoggerFactory;
11-
import org.springframework.beans.factory.annotation.Autowired;
124
import org.springframework.boot.SpringApplication;
135
import org.springframework.boot.autoconfigure.SpringBootApplication;
146
import org.springframework.context.annotation.Bean;
157
import org.springframework.scheduling.annotation.EnableScheduling;
16-
import org.springframework.scheduling.annotation.Scheduled;
17-
18-
import java.text.ParseException;
19-
import java.text.SimpleDateFormat;
20-
import java.time.LocalDate;
21-
import java.util.List;
228

239
@SpringBootApplication
2410
@EnableScheduling
2511
public class PatApplication {
26-
private final EmailService emailService;
27-
private final UserService userService;
28-
private final MonthlyNoteService monthlyNoteService;
29-
Logger logger = LoggerFactory.getLogger(PatApplication.class);
30-
31-
@Autowired
32-
public PatApplication(EmailService emailService, UserService userService, MonthlyNoteService monthlyNoteService) {
33-
this.emailService = emailService;
34-
this.userService = userService;
35-
this.monthlyNoteService = monthlyNoteService;
36-
}
37-
38-
39-
public static void main(String[] args) {
40-
SpringApplication.run(PatApplication.class, args);
41-
}
4212

43-
@Bean
44-
public ModelMapper modelMapper() {
45-
return new ModelMapper();
46-
}
13+
public static void main(String[] args) {
14+
SpringApplication.run(PatApplication.class, args);
15+
}
4716

48-
@Scheduled(cron = "0 0 12 L * *")
49-
public void sendReminderTimeSheetEmail() throws ParseException {
50-
LocalDate currentDate = LocalDate.now();
51-
List<User> uncompiledTimeSheetUserList = userService.findAll();
52-
for (User user : uncompiledTimeSheetUserList) {
53-
MonthlyNote monthlyNote = monthlyNoteService.find(user.getUsername(), new SimpleDateFormat("dd-MM-yyyy").parse("1-" + currentDate.getMonthValue() + "-" + currentDate.getYear()));
54-
if (user.isEnabled() && monthlyNote != null && !monthlyNote.isLocked()) {
55-
try {
56-
emailService.sendSimpleMessage(user.getEmail(), "PAT - Reminder TimeSheet",
57-
"Gentile " + user.getName() + "<br><br>" +
58-
"Essendo l'ultimo giorno del mese e risultando al sistema che il tuo Time Sheet non " +
59-
"è stato ancora confermato viene inviato automaticamente questo promemoria " +
60-
"per ricordarti di compilarlo e confermarlo entro oggi.<br><br>" +
61-
"Grazie!");
62-
} catch (Exception e) {
63-
logger.error(e.getMessage());
64-
}
65-
}
66-
}
67-
}
17+
@Bean
18+
public ModelMapper modelMapper() {
19+
return new ModelMapper();
20+
}
6821
}

src/main/java/eu/rationence/pat/controller/ClientController.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,8 @@
1818

1919
import javax.validation.Valid;
2020
import java.security.Principal;
21+
import java.util.regex.Matcher;
22+
import java.util.regex.Pattern;
2123

2224
@Controller
2325
public class ClientController {
@@ -63,6 +65,10 @@ else if (client.getClientDesc().length() < 1)
6365
ClientType clientTypeRepo = clientTypeService.find(clientTypeKey);
6466
if (clientTypeRepo == null)
6567
return AdviceController.responseNotFound(clientTypeKey + " is not a valid client type");
68+
Pattern p = Pattern.compile("[^a-z0-9._-]", Pattern.CASE_INSENSITIVE);
69+
Matcher m = p.matcher(client.getClientKey());
70+
if(m.find())
71+
return AdviceController.responseBadRequest("Cannot create " + CLASS_DESC + ". Client key should contain only allowed characters: [a-zA-Z0-9._-]");
6672
clientService.save(client);
6773
return AdviceController.responseOk(CLASS_DESC + " '" + client.getClientKey() + "' saved");
6874
} catch (Exception e) {

src/main/java/eu/rationence/pat/controller/ProjectActivityController.java

Lines changed: 13 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -4,10 +4,7 @@
44
import eu.rationence.pat.model.ProjectActivity;
55
import eu.rationence.pat.model.User;
66
import eu.rationence.pat.model.dto.ProjectActivityDTO;
7-
import eu.rationence.pat.service.ActivityTypeService;
8-
import eu.rationence.pat.service.ProjectActivityService;
9-
import eu.rationence.pat.service.ProjectService;
10-
import eu.rationence.pat.service.UserService;
7+
import eu.rationence.pat.service.*;
118
import org.modelmapper.ModelMapper;
129
import org.springframework.beans.factory.annotation.Autowired;
1310
import org.springframework.dao.DataIntegrityViolationException;
@@ -28,14 +25,16 @@ public class ProjectActivityController {
2825
private final ProjectService projectService;
2926
private final ActivityTypeService activityTypeService;
3027
private final ProjectActivityService projectActivityService;
28+
private final CompiledProjectActivityService compiledProjectActivityService;
3129

3230
@Autowired
33-
public ProjectActivityController(ModelMapper modelMapper, UserService userService, ProjectService projectService, ActivityTypeService activityTypeService, ProjectActivityService projectActivityService) {
31+
public ProjectActivityController(ModelMapper modelMapper, UserService userService, ProjectService projectService, ActivityTypeService activityTypeService, ProjectActivityService projectActivityService, CompiledProjectActivityService compiledProjectActivityService) {
3432
this.modelMapper = modelMapper;
3533
this.userService = userService;
3634
this.projectService = projectService;
3735
this.activityTypeService = activityTypeService;
3836
this.projectActivityService = projectActivityService;
37+
this.compiledProjectActivityService = compiledProjectActivityService;
3938
}
4039

4140
@GetMapping("/projects/{projectKey}")
@@ -49,7 +48,14 @@ public String projectActivities(@PathVariable String projectKey, Model model, Pr
4948
}
5049
model.addAttribute("activityTypeList", activityTypeService.findAll());
5150
model.addAttribute("activityList", projectActivityService.findActivitiesByProject(projectRepo.getProjectKey()));
51+
model.addAttribute("activityListNum", projectActivityService.findActivitiesByProject(projectRepo.getProjectKey()).size());
5252
model.addAttribute("projectKey", projectKey);
53+
model.addAttribute("project", projectRepo);
54+
55+
for (ProjectActivity projectActivity : projectActivityService.findActivitiesByProject(projectRepo.getProjectKey())) {
56+
int totalHoursSpentOnActivity = compiledProjectActivityService.getTotHours(projectActivity.getActivityKey(), projectKey);
57+
model.addAttribute(projectActivity.getActivityKey() + "TotHoursCompiled", totalHoursSpentOnActivity);
58+
}
5359
String username = principal.getName();
5460
User userRepo = userService.find(username);
5561
model.addAttribute("userTeam", userRepo.getTeam().getTeamName());
@@ -68,6 +74,8 @@ public ResponseEntity<String> addActivity(@Valid ProjectActivityDTO projectActiv
6874
ResponseEntity<String> validityError = checkActivityValidity(projectKey, activityType, manDays);
6975
if (validityError != null)
7076
return validityError;
77+
else if (projectActivity.getActivityKey().length() < 1)
78+
return AdviceController.responseBadRequest(CLASS_DESC + " key can't be blank");
7179
ProjectActivity projectActivityRepo = projectActivityService.find(activityKey, projectKey);
7280
if (projectActivityRepo != null)
7381
return AdviceController.responseConflict(CLASS_DESC + " '" + projectActivity.getActivityKey() + "' has already been created");

src/main/java/eu/rationence/pat/controller/ProjectController.java

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,8 @@
1515

1616
import javax.validation.Valid;
1717
import java.security.Principal;
18+
import java.util.regex.Matcher;
19+
import java.util.regex.Pattern;
1820

1921

2022
@Controller
@@ -75,6 +77,12 @@ public ResponseEntity<String> addProject(@Valid ProjectDTO projectDTO,
7577
ResponseEntity<String> validityError = checkProjectValidity(teamKey, projectManagerKey, clientKey, projectTypeKey, value);
7678
if (validityError != null)
7779
return validityError;
80+
else if (project.getProjectKey().length() < 1)
81+
return AdviceController.responseBadRequest(CLASS_DESC + " key can't be blank");
82+
Pattern p = Pattern.compile("[^a-z0-9._-]", Pattern.CASE_INSENSITIVE);
83+
Matcher m = p.matcher(project.getProjectKey());
84+
if(m.find())
85+
return AdviceController.responseBadRequest("Cannot create " + CLASS_DESC + ". Project key should contain only allowed characters: [a-zA-Z0-9._-]");
7886
projectService.save(project);
7987
return AdviceController.responseOk(CLASS_DESC + " '" + project.getProjectKey() + "' saved");
8088
} catch (Exception e) {

src/main/java/eu/rationence/pat/controller/RoleController.java

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,8 @@
1818

1919
import javax.validation.Valid;
2020
import java.security.Principal;
21+
import java.util.regex.Matcher;
22+
import java.util.regex.Pattern;
2123

2224

2325
@Controller
@@ -54,6 +56,12 @@ public ResponseEntity<String> addRole(@Valid RoleDTO roleDTO,
5456
if (roleService.find(role.getRoleName()) != null) {
5557
return AdviceController.responseConflict(role.getRoleName() + "has already been created");
5658
}
59+
else if (role.getRoleName().length() < 1)
60+
return AdviceController.responseBadRequest(CLASS_DESC + " key can't be blank");
61+
Pattern p = Pattern.compile("[^a-z0-9._-]", Pattern.CASE_INSENSITIVE);
62+
Matcher m = p.matcher(role.getRoleName());
63+
if(m.find())
64+
return AdviceController.responseBadRequest("Cannot create " + CLASS_DESC + ". Role name should contain only allowed characters: [a-zA-Z0-9._-]");
5765
roleService.save(role);
5866
return AdviceController.responseOk(CLASS_DESC + " '" + role.getRoleName() + "' saved");
5967
} catch (Exception e) {

src/main/java/eu/rationence/pat/controller/StandardActivityController.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,8 @@
1919

2020
import javax.validation.Valid;
2121
import java.security.Principal;
22+
import java.util.regex.Matcher;
23+
import java.util.regex.Pattern;
2224

2325

2426
@Controller
@@ -56,6 +58,10 @@ public ResponseEntity<String> addActivity(@Valid StandardActivityDTO stdActDTO,
5658
return AdviceController.responseBadRequest(CLASS_DESC + " Key Name can't be blank");
5759
else if (standardActivityService.findStandardActivityByActivityKey(stdAct.getActivityKey()) != null)
5860
return AdviceController.responseConflict(stdAct.getActivityKey() + " has been already created");
61+
Pattern p = Pattern.compile("[^a-z0-9._-]", Pattern.CASE_INSENSITIVE);
62+
Matcher m = p.matcher(stdAct.getActivityKey());
63+
if(m.find())
64+
return AdviceController.responseBadRequest("Cannot create " + CLASS_DESC + ". Standard activity key should contain only allowed characters: [a-zA-Z0-9._-]");
5965
standardActivityService.save(stdAct);
6066
return AdviceController.responseOk(CLASS_DESC + " '" + stdAct.getActivityKey() + "' saved");
6167
} catch (Exception e) {

src/main/java/eu/rationence/pat/controller/TeamController.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,8 @@
1616

1717
import javax.validation.Valid;
1818
import java.security.Principal;
19+
import java.util.regex.Matcher;
20+
import java.util.regex.Pattern;
1921

2022

2123
@Controller
@@ -60,6 +62,10 @@ else if (teamService.find(team.getTeamName()) != null)
6062
User userRepo = userService.find(teamAdminKey);
6163
if (userRepo == null)
6264
return AdviceController.responseNotFound(teamAdminKey + " is not a valid user for" + CLASS_DESC + " Manager");
65+
Pattern p = Pattern.compile("[^a-z0-9._-]", Pattern.CASE_INSENSITIVE);
66+
Matcher m = p.matcher(team.getTeamName());
67+
if(m.find())
68+
return AdviceController.responseBadRequest("Cannot create " + CLASS_DESC + ". Team key should contain only allowed characters: [a-zA-Z0-9._-]");
6369
teamService.save(team);
6470
return AdviceController.responseOk(CLASS_DESC + " '" + team.getTeamName() + "' saved");
6571
} catch (Exception e) {

src/main/java/eu/rationence/pat/controller/TrackingController.java

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -493,25 +493,25 @@ public ResponseEntity<String> updateNoteMonthYear(@PathVariable int year,
493493
@RequestParam int hour,
494494
Principal principal) throws ParseException {
495495

496-
User userRepo = userService.find(principal.getName());
497-
if (!userRepo.getRole().getRoleName().equals(ADMIN_ROLE) && !principal.getName().equals(username))
498-
return AdviceController.responseForbidden("Forbidden action for user " + userRepo.getUsername());
496+
User userPrincipal = userService.find(principal.getName());
497+
if (!userPrincipal.getRole().getRoleName().equals(ADMIN_ROLE) && !principal.getName().equals(username))
498+
return AdviceController.responseForbidden("Forbidden action for user " + userPrincipal.getUsername());
499499

500500
Date date = new SimpleDateFormat(DATE_FORMAT_DDMMYYYY).parse("1-" + month + "-" + year);
501501
MonthlyNote monthlyNote = monthlyNoteService.find(username, date);
502502
if (monthlyNote != null && monthlyNote.isLocked())
503503
return AdviceController.responseForbidden(CANNOT_MODIFY_TIME_SHEET_LOCKED_STRING);
504504

505505
LocalDate passedDate = LocalDate.of(year, month, 1);
506-
userRepo = userService.find(username);
506+
User userRepo = userService.find(username);
507507
if (userRepo == null)
508508
return AdviceController.responseNotFound("Cannot update " + username + " time sheet. (Not found)");
509509

510510
Pattern actPattern = Pattern.compile("(..*):(..*)");
511511
Matcher matcher = actPattern.matcher(projectActivityKeys);
512512
boolean matchFound = matcher.find();
513513

514-
if (LocalDate.now().isAfter(passedDate.plusMonths(1).plusDays(9))) {
514+
if (LocalDate.now().isAfter(passedDate.plusMonths(1).plusDays(9)) && !userPrincipal.getRole().getRoleName().equals(ADMIN_ROLE)) {
515515
return AdviceController.responseBadRequest(CANNOT_MODIFY_TIME_SHEET_STRING + passedDate.plusMonths(1).plusDays(9));
516516
}
517517

0 commit comments

Comments
 (0)