Skip to content

Commit

Permalink
wip
Browse files Browse the repository at this point in the history
  • Loading branch information
MDeLuise committed Jul 18, 2023
1 parent c61c571 commit a8f4175
Show file tree
Hide file tree
Showing 36 changed files with 533 additions and 416 deletions.
Original file line number Diff line number Diff line change
@@ -1,9 +1,8 @@
package com.github.mdeluise.plantit.botanicalinfo;

import com.github.mdeluise.plantit.image.AbstractBotanicalInfoImage;
import com.github.mdeluise.plantit.image.BotanicalInfoImage;
import com.github.mdeluise.plantit.image.ImageTarget;
import com.github.mdeluise.plantit.tracked.plant.Plant;
import jakarta.annotation.Nullable;
import jakarta.persistence.CascadeType;
import jakarta.persistence.DiscriminatorColumn;
import jakarta.persistence.DiscriminatorType;
import jakarta.persistence.Entity;
Expand All @@ -12,7 +11,6 @@
import jakarta.persistence.Id;
import jakarta.persistence.Inheritance;
import jakarta.persistence.InheritanceType;
import jakarta.persistence.JoinColumn;
import jakarta.persistence.OneToMany;
import jakarta.persistence.OneToOne;
import jakarta.validation.constraints.NotBlank;
Expand All @@ -28,7 +26,7 @@
@DiscriminatorColumn(
name = "botanical_info_type", discriminatorType = DiscriminatorType.INTEGER, columnDefinition = "TINYINT(1)"
)
public class BotanicalInfo implements Serializable {
public class BotanicalInfo implements Serializable, ImageTarget {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
Expand All @@ -40,10 +38,9 @@ public class BotanicalInfo implements Serializable {
@NotNull
@OneToMany(mappedBy = "botanicalInfo")
private Set<Plant> plants = new HashSet<>();
@Nullable
@OneToOne(cascade = CascadeType.ALL)
@JoinColumn(name = "image_id", referencedColumnName = "id")
private AbstractBotanicalInfoImage image;
@NotNull
@OneToOne(mappedBy = "botanicalInfoImageTarget")
private BotanicalInfoImage image;


public Long getId() {
Expand Down Expand Up @@ -106,12 +103,12 @@ public void setPlants(Set<Plant> plants) {
}


public AbstractBotanicalInfoImage getImage() {
public BotanicalInfoImage getImage() {
return image;
}


public void setImage(AbstractBotanicalInfoImage image) {
public void setImage(BotanicalInfoImage image) {
this.image = image;
}

Expand Down
Original file line number Diff line number Diff line change
@@ -1,8 +1,6 @@
package com.github.mdeluise.plantit.botanicalinfo;

import com.github.mdeluise.plantit.common.AbstractDTOConverter;
import com.github.mdeluise.plantit.image.LocalBotanicalInfoImage;
import com.github.mdeluise.plantit.image.WebBotanicalInfoImage;
import org.modelmapper.ModelMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
Expand All @@ -27,11 +25,6 @@ public BotanicalInfo convertFromDTO(BotanicalInfoDTO dto) {
public BotanicalInfoDTO convertToDTO(BotanicalInfo data) {
final BotanicalInfoDTO result = modelMapper.map(data, BotanicalInfoDTO.class);
result.setSystemWide(!(data instanceof UserCreatedBotanicalInfo));
if (data.getImage() instanceof WebBotanicalInfoImage w) {
result.setImageUrl(w.getUrl());
} else if (data.getImage() instanceof LocalBotanicalInfoImage l) {
result.setImageId(l.getId());
}
return result;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@ public ResponseEntity<ErrorMessage> entityNotFoundException(
new Date(),
ex.getMessage(),
request.getDescription(false),
ex.getCause() != null ? ex.getCause().getMessage() : ""
ex.getCause() != null ? ex.getCause().getMessage() : null
);
return new ResponseEntity<>(message, HttpStatus.NOT_FOUND);
}
Expand All @@ -35,7 +35,7 @@ public ResponseEntity<ErrorMessage> globalExceptionHandler(Exception ex, WebRequ
new Date(),
ex.getMessage(),
request.getDescription(false),
ex.getCause() != null ? ex.getCause().getMessage() : ""
ex.getCause() != null ? ex.getCause().getMessage() : null
);
return new ResponseEntity<>(message, HttpStatus.INTERNAL_SERVER_ERROR);
}
Expand Down

This file was deleted.

Original file line number Diff line number Diff line change
Expand Up @@ -8,25 +8,30 @@
import jakarta.persistence.Id;
import jakarta.persistence.Inheritance;
import jakarta.persistence.InheritanceType;
import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.NotNull;
import org.hibernate.validator.constraints.Length;

import java.io.Serializable;
import java.util.Date;

@Entity(name = "abstract_images")
@Entity(name = "entity_images")
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(
name = "image_type", discriminatorType = DiscriminatorType.INTEGER, columnDefinition = "TINYINT(1)"
)
public abstract class AbstractImage implements Serializable {
public abstract class AbstractEntityImage implements Serializable {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
@Length(max = 100)
private String description;
@NotNull
private Date savedAt = new Date();
@NotBlank
@Length(max = 255)
private String url;
private String path;


public Long getId() {
Expand Down Expand Up @@ -57,4 +62,24 @@ public Date getSavedAt() {
public void setSavedAt(Date savedAt) {
this.savedAt = savedAt;
}


public String getPath() {
return path;
}


public void setPath(String path) {
this.path = path;
}


public String getUrl() {
return url;
}


public void setUrl(String url) {
this.url = url;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
package com.github.mdeluise.plantit.image;

import com.github.mdeluise.plantit.botanicalinfo.BotanicalInfo;
import jakarta.persistence.DiscriminatorValue;
import jakarta.persistence.Entity;
import jakarta.persistence.JoinColumn;
import jakarta.persistence.OneToOne;
import jakarta.validation.constraints.NotNull;

@Entity
@DiscriminatorValue("1")
public class BotanicalInfoImage extends AbstractEntityImage {
@NotNull
@OneToOne
@JoinColumn(name = "entity_id", nullable = false)
private BotanicalInfo botanicalInfoImageTarget;


public BotanicalInfo getBotanicalInfoImageTarget() {
return botanicalInfoImageTarget;
}


public void setBotanicalInfoImageTarget(BotanicalInfo botanicalInfoImageTarget) {
this.botanicalInfoImageTarget = botanicalInfoImageTarget;
}
}
Original file line number Diff line number Diff line change
@@ -1,6 +1,14 @@
package com.github.mdeluise.plantit.image;

import com.github.mdeluise.plantit.botanicalinfo.BotanicalInfo;
import com.github.mdeluise.plantit.botanicalinfo.BotanicalInfoService;
import com.github.mdeluise.plantit.image.storage.StorageService;
import com.github.mdeluise.plantit.tracked.TrackedEntityService;
import com.github.mdeluise.plantit.tracked.plant.Plant;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpStatus;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.GetMapping;
Expand All @@ -11,55 +19,73 @@
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;

import java.io.IOException;
import java.util.Base64;
import java.util.Collection;

@RestController
@RequestMapping("/image")
public class ImageController {
private final ImageService imageService;
private final StorageService storageService;
private final BotanicalInfoService botanicalInfoService;
private final TrackedEntityService trackedEntityService;
private final ImageDTOConverter imageDtoConverter;


@Autowired
public ImageController(ImageService imageService, ImageDTOConverter imageDtoConverter) {
this.imageService = imageService;
public ImageController(StorageService storageService, BotanicalInfoService botanicalInfoService,
TrackedEntityService trackedEntityService, ImageDTOConverter imageDtoConverter) {
this.storageService = storageService;
this.botanicalInfoService = botanicalInfoService;
this.trackedEntityService = trackedEntityService;
this.imageDtoConverter = imageDtoConverter;
}


@PostMapping("/botanical-info")
public ResponseEntity<Long> saveBotanicalInfoImage(@RequestParam("image") MultipartFile file) throws IOException {
final AbstractImage saved = imageService.saveBotanicalInfoImage(file);
return ResponseEntity.ok(saved.getId());
@PostMapping("/botanical-info/{id}")
public ResponseEntity<String> saveBotanicalInfoImage(@RequestParam("image") MultipartFile file,
@PathVariable("id") Long id) {
final BotanicalInfo linkedEntity = botanicalInfoService.get(id);
storageService.save(file, linkedEntity);
return ResponseEntity.ok("Successfully uploaded");
}


@GetMapping("/{id}")
public ResponseEntity<ImageDTO> get(@PathVariable("id") Long id) {
final AbstractImage result = imageService.get(id);
final AbstractEntityImage result = storageService.get(id);
return ResponseEntity.ok(imageDtoConverter.convertToDTO(result));
}


@DeleteMapping("/botanical-info/{id}")
@GetMapping("/content/{id}")
public ResponseEntity<byte[]> getContent(@PathVariable("id") Long id) {
final byte[] result = Base64.getEncoder().encode(storageService.getContent(id));
HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.IMAGE_JPEG);
return new ResponseEntity<>(result, headers, HttpStatus.OK);
}


@DeleteMapping("/{id}")
public ResponseEntity<String> delete(@PathVariable("id") Long id) {
imageService.delete(id);
storageService.remove(id);
return ResponseEntity.ok("Success");
}


@PostMapping("/entity/{id}")
public ResponseEntity<Long> saveEntityImage(@RequestParam("image") MultipartFile file,
@PathVariable("id") Long entityId) throws IOException {
final AbstractImage saved = imageService.saveEntityImage(file, entityId);
@PathVariable("id") Long entityId) {
final Plant linkedEntity = (Plant) trackedEntityService.get(entityId);
final AbstractEntityImage saved = storageService.save(file, linkedEntity);
return ResponseEntity.ok(saved.getId());
}


@GetMapping("/all/{id}")
@GetMapping("/entity/all/{id}")
public ResponseEntity<Collection<Long>> getAllImageIdsFromEntity(@PathVariable("id") Long id) {
final Collection<Long> result = imageService.getAllIds(id);
final Plant linkedEntity = (Plant) trackedEntityService.get(id);
final Collection<Long> result = storageService.getAllIds(linkedEntity);
return ResponseEntity.ok(result);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ public class ImageDTO {
private Long id;
private Date savedAt;
private String url;
private byte[] content;
private String description;


public Long getId() {
Expand Down Expand Up @@ -39,12 +39,12 @@ public void setUrl(String url) {
}


public byte[] getContent() {
return content;
public String getDescription() {
return description;
}


public void setContent(byte[] content) {
this.content = content;
public void setDescription(String description) {
this.description = description;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -6,21 +6,21 @@
import org.springframework.stereotype.Component;

@Component
public class ImageDTOConverter extends AbstractDTOConverter<AbstractImage, ImageDTO> {
public class ImageDTOConverter extends AbstractDTOConverter<AbstractEntityImage, ImageDTO> {
@Autowired
public ImageDTOConverter(ModelMapper modelMapper) {
super(modelMapper);
}


@Override
public AbstractImage convertFromDTO(ImageDTO dto) {
return modelMapper.map(dto, AbstractImage.class);
public AbstractEntityImage convertFromDTO(ImageDTO dto) {
return modelMapper.map(dto, AbstractEntityImage.class);
}


@Override
public ImageDTO convertToDTO(AbstractImage data) {
public ImageDTO convertToDTO(AbstractEntityImage data) {
return modelMapper.map(data, ImageDTO.class);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,5 +2,5 @@

import org.springframework.data.jpa.repository.JpaRepository;

public interface ImageRepository extends JpaRepository<AbstractImage, Long> {
public interface ImageRepository extends JpaRepository<AbstractEntityImage, Long> {
}
Loading

0 comments on commit a8f4175

Please sign in to comment.