ApplicationServiceImpl.java 2.79 KB
package isa.qa.service.impl;

import isa.qa.dao.ApplicationDao;
import isa.qa.dto.request.AccessKeyRequestDTO;
import isa.qa.dto.request.ApplicationRequestDTO;
import isa.qa.dto.response.ApplicationResponseDTO;
import isa.qa.entity.Application;
import isa.qa.properties.FileProperties;
import isa.qa.properties.JwtProperties;
import isa.qa.service.ApplicationService;
import isa.qa.utils.FileUtils;
import isa.qa.utils.JwtTokenUtil;
import lombok.AllArgsConstructor;
import org.apache.commons.lang3.RandomStringUtils;
import org.springframework.stereotype.Service;
import org.springframework.transaction.TransactionException;
import org.springframework.transaction.annotation.Transactional;

import java.time.Instant;
import java.util.Date;
import java.util.Objects;
import java.util.Optional;

import static com.google.common.base.Preconditions.checkArgument;
import static isa.qa.utils.MD5Utils.encrypt32;

@Service
@AllArgsConstructor
public class ApplicationServiceImpl implements ApplicationService {

    private final ApplicationDao applicationDao;

    private final FileProperties fileProperties;

    private final JwtTokenUtil jwtTokenUtil;

    private final JwtProperties jwtProperties;

    @Override
    @Transactional(rollbackFor = TransactionException.class)
    public ApplicationResponseDTO registerApplication(ApplicationRequestDTO requestDTO) {
        Date now = Date.from(Instant.now());
        String appSecret = RandomStringUtils.random(32, true, true);

        Application application = new Application();

        application.setName(requestDTO.getName());
        application.setDomain(requestDTO.getDomain());
        application.setAppSecret(encrypt32(appSecret));
        application.setExpireTime(new Date(requestDTO.getExpireTimeStamp()));
        application.setCreateTime(now);
        application.setUpdateTime(now);

        applicationDao.save(application);

        //Make Application attachment storage directory
        String applicationDirPath = fileProperties.getBasePath() + application.getName();
        FileUtils.mkdir(applicationDirPath);

        return new ApplicationResponseDTO(application.getAppKey(), appSecret);
    }

    @Override
    public String getAccessKey(AccessKeyRequestDTO requestDTO) {
        Optional<Application> application = applicationDao.findById(requestDTO.getAppKey());
        checkArgument(application.isPresent(), "Invalid appKey");
        checkArgument(Objects.equals(application.get().getAppSecret(), encrypt32(requestDTO.getAppSecret())), "Incorrect appSecret");

        return jwtTokenUtil.generateToken(requestDTO.getAppKey(), requestDTO.getValidHours());
    }

    @Override
    public String refreshAccessKey(String oldAccessKey, Integer hours) {
        return jwtTokenUtil.refreshToken(oldAccessKey.substring(jwtProperties.getTokenHead().length()), hours);
    }
}