package io.loli.box.controller;
import io.loli.box.dao.IdSeqRepository;
import io.loli.box.dao.ImgFileRepository;
import io.loli.box.entity.IdSeq;
import io.loli.box.entity.ImgFile;
import io.loli.box.entity.Role;
import io.loli.box.service.StorageService;
import io.loli.box.service.impl.UserService;
import io.loli.box.social.SocialUserDetails;
import io.loli.box.util.FileUtil;
import io.loli.box.util.StatusBean;
import org.apache.commons.lang3.StringUtils;
import org.hashids.Hashids;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.security.core.Authentication;
import org.springframework.security.core.GrantedAuthority;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;
import java.io.BufferedInputStream;
import java.io.InputStream;
import java.net.URLConnection;
import java.util.Date;
/**
* @author choco
*/
@RestController
@RequestMapping("/image")
public class ImageController {
@Autowired
private StorageService service;
@Autowired
private IdSeqRepository idSeqRepository;
@Autowired
private ImgFileRepository imgFileRepository;
@Autowired
private Hashids hashids;
@Autowired
private UserService userService;
@RequestMapping("/upload")
@PreAuthorize("@adminProperties.anonymous or hasRole('USER')")
public StatusBean upload(@RequestParam(value = "image", required = true) MultipartFile imageFile, Authentication authentication) {
String url;
String originName = imageFile.getOriginalFilename();
String suffix = FileUtil.getSuffix(originName);
try (InputStream is = new BufferedInputStream(imageFile.getInputStream())) {
Long id = idSeqRepository.save(new IdSeq()).getId();
String name = hashids.encode(id) + ".".concat(suffix);
String contentType = imageFile.getContentType();
if (StringUtils.isBlank(contentType)) {
contentType = URLConnection.guessContentTypeFromName(originName);
}
if (StringUtils.isBlank(contentType)) {
contentType = "image/png";
}
url = service.upload(is, name, contentType, imageFile.getSize());
ImgFile file = new ImgFile();
file.setCreateDate(new Date());
file.setId(id);
file.setOriginName(originName);
file.setShortName(url);
file.setSize(imageFile.getSize());
if (authentication != null && authentication.getAuthorities().stream().map(GrantedAuthority::getAuthority).anyMatch(Role.ROLE_USER.toString()::equals)) {
file.setUser(userService.findByEmailOrName(((SocialUserDetails) authentication.getPrincipal()).getEmail()));
}
imgFileRepository.save(file);
} catch (Exception e) {
e.printStackTrace();
return new StatusBean("error", "Error:" + e.getMessage());
}
if (url != null) {
return new StatusBean("success", "images/" + url);
} else {
return new StatusBean("error", "Failed to upload");
}
}
@RequestMapping("/oauthUpload")
public StatusBean oauthUpload(@RequestParam(value = "image", required = true) MultipartFile imageFile, Authentication authentication) {
return upload(imageFile, authentication);
}
}