Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,10 @@
<java.version>17</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-mail</artifactId>
</dependency>
<!-- https://mvnrepository.com/artifact/org.springdoc/springdoc-openapi-starter-webmvc-ui -->
<dependency>
<groupId>org.springdoc</groupId>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -21,10 +21,11 @@ public class AWSS3BucketController {

@PostSetNewUserImageApiDoc
@PreAuthorize("hasRole('TALENT')")
@PostMapping("/image/upload")
@PostMapping("/talents/{talent-id}/image/upload")
public void setNewUserImage(@RequestParam("file") MultipartFile file,
Authentication authentication) {
fileService.setNewUserImage(file, authentication);
@PathVariable("talent-id") Long talentId,
Authentication authentication) {
fileService.setNewUserImage(file, talentId, authentication);
}

@GetAllAWSBucketFilesDevApiDoc
Expand Down
2 changes: 1 addition & 1 deletion src/main/java/com/provedcode/aws/service/FileService.java
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ public interface FileService {

List<String> listAllFiles();

void setNewUserImage(MultipartFile file, Authentication authentication);
void setNewUserImage(MultipartFile file, Long talentId, Authentication authentication);

URL generetePresingedUrlFor7Days(String fileFullPath);
}
8 changes: 7 additions & 1 deletion src/main/java/com/provedcode/aws/service/S3Service.java
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@
import com.amazonaws.services.s3.model.*;
import com.amazonaws.util.IOUtils;
import com.provedcode.config.AWSProperties;
import com.provedcode.talent.model.entity.Talent;
import com.provedcode.talent.repo.TalentRepository;
import com.provedcode.user.model.entity.UserInfo;
import com.provedcode.user.repo.UserInfoRepository;
Expand Down Expand Up @@ -75,7 +76,7 @@ public List<String> listAllFiles() {
}

@Override
public void setNewUserImage(MultipartFile file, Authentication authentication) {
public void setNewUserImage(MultipartFile file, Long talentId, Authentication authentication) {
if (file.isEmpty()) {
throw new ResponseStatusException(BAD_REQUEST, "file must be not empty, actual file-size: %s".formatted(file.getSize()));
}
Expand All @@ -84,6 +85,11 @@ public void setNewUserImage(MultipartFile file, Authentication authentication) {
}
UserInfo user = userInfoRepository.findByLogin(authentication.getName())
.orElseThrow(() -> new ResponseStatusException(NOT_FOUND, "user with login = {%s} not found".formatted(authentication.getName())));
Talent talent = talentRepository.findById(talentId)
.orElseThrow(() -> new ResponseStatusException(NOT_FOUND, "talent with id = {%s} not found".formatted(talentId)));
if (!user.getTalent().equals(talent)) {
throw new ResponseStatusException(FORBIDDEN, "You cannot change another talent");
}

try {
String fileType = getFileType(file);
Expand Down
15 changes: 15 additions & 0 deletions src/main/java/com/provedcode/config/EmailConfig.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
package com.provedcode.config;

import lombok.AllArgsConstructor;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.env.Environment;

@Configuration
@AllArgsConstructor
public class EmailConfig {
private Environment env;

public String getDefaultEmail() {
return env.getProperty("EMAIL_USER");
}
}
19 changes: 19 additions & 0 deletions src/main/java/com/provedcode/config/EmailDefaultProps.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
package com.provedcode.config;

import jakarta.annotation.PostConstruct;
import lombok.extern.slf4j.Slf4j;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.validation.annotation.Validated;

@Validated
@ConfigurationProperties(prefix = "default-email")
@Slf4j
public record EmailDefaultProps(
String userDeleted,
String userDeletedSubject
) {
@PostConstruct
void logging() {
log.info("email-default-props = {}", this);
}
}
2 changes: 2 additions & 0 deletions src/main/java/com/provedcode/config/SecurityConfig.java
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@
import lombok.extern.slf4j.Slf4j;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.HttpMethod;
import org.springframework.http.HttpStatus;
import org.springframework.security.config.Customizer;
import org.springframework.security.config.annotation.method.configuration.EnableMethodSecurity;
Expand Down Expand Up @@ -59,6 +60,7 @@ public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Excepti
.requestMatchers(antMatcher("/v3/api-docs/**")).permitAll() // for openAPI
.requestMatchers(antMatcher("/swagger-ui/**")).permitAll() // for openAPI
.requestMatchers(antMatcher("/swagger-ui.html")).permitAll() // for openAPI
.requestMatchers(antMatcher(HttpMethod.GET, "/api/v5/activate")).permitAll()// for email account recovery
.anyRequest().authenticated()
);

Expand Down
29 changes: 29 additions & 0 deletions src/main/java/com/provedcode/config/ServerInfoConfig.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
package com.provedcode.config;

import lombok.AllArgsConstructor;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.env.Environment;

import java.net.InetAddress;
import java.net.UnknownHostException;

@AllArgsConstructor
@Configuration
public class ServerInfoConfig {
private Environment env;

public String getServerPort() {
return env.getProperty("server.port");
}
public String getIpAddress() {
InetAddress ip = null;
try {
return ip.getLocalHost().getHostAddress();
} catch (UnknownHostException e) {
throw new RuntimeException(e);
}
}
public String getFullServerAddress() {
return getIpAddress() + ":" + getServerPort();
}
}
33 changes: 33 additions & 0 deletions src/main/java/com/provedcode/handlers/GlobalControllerAdvice.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
package com.provedcode.handlers;

import com.provedcode.user.model.entity.UserInfo;
import com.provedcode.user.repo.UserInfoRepository;
import lombok.AllArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.security.core.Authentication;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.server.ResponseStatusException;

import static org.springframework.http.HttpStatus.FORBIDDEN;
import static org.springframework.http.HttpStatus.NOT_FOUND;

@ControllerAdvice
@AllArgsConstructor
@Slf4j
public class GlobalControllerAdvice {
UserInfoRepository userInfoRepository;

@ModelAttribute
public void handleAuthentication(Authentication authentication) {
if (authentication != null) {
String login = authentication.getName();
UserInfo user = userInfoRepository.findByLogin(login)
.orElseThrow(() -> new ResponseStatusException(NOT_FOUND,
"User with login {%s} not found".formatted(login)));
if (Boolean.TRUE.equals(user.getIsLocked())) {
throw new ResponseStatusException(FORBIDDEN, "your account is blocked");
}
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,7 @@ KudosAmount getKudosForSponsor(@PathVariable("sponsor-id") long sponsorId, Authe
}

@GetAmountOfKudosApiDoc
@PreAuthorize("hasRole('TALENT')")
@PreAuthorize("hasAnyRole('TALENT', 'SPONSOR')")
@GetMapping("/proofs/{proof-id}/kudos")
KudosAmountWithSponsor getProofKudos(@PathVariable("proof-id") long proofId, Authentication authentication) {
return kudosService.getProofKudos(proofId, authentication);
Expand Down
Loading