Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
15 commits
Select commit Hold shift + click to select a range
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
14 changes: 8 additions & 6 deletions build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ buildscript {
plugins {
id 'java'
id 'idea'
id 'org.springframework.boot' version "3.4.4"
id 'org.springframework.boot' version "3.5.10"
}

apply plugin: 'io.spring.dependency-management'
Expand All @@ -27,15 +27,14 @@ ext {
mapstructVersion = "1.6.3"
}

sourceCompatibility = 1.17
targetCompatibility = 1.17
sourceCompatibility = 21
targetCompatibility = 21

dependencies {
implementation 'org.springframework.boot:spring-boot-starter-web'
implementation 'org.springframework.boot:spring-boot-starter-security'
implementation 'org.springframework.boot:spring-boot-starter-validation'
// JPA Data (We are going to use Repositories, Entities, Hibernate, etc...)
implementation 'org.springframework.boot:spring-boot-starter-data-rest'
implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
implementation 'org.springframework.boot:spring-boot-starter-data-jdbc'
implementation 'org.springframework.boot:spring-boot-starter-actuator'
Expand All @@ -53,7 +52,10 @@ dependencies {

implementation "org.mapstruct:mapstruct:${mapstructVersion}"
annotationProcessor "org.mapstruct:mapstruct-processor:${mapstructVersion}"
implementation 'org.mapstruct.extensions.spring:mapstruct-spring-extensions:1.1.3'
implementation 'org.mapstruct.extensions.spring:mapstruct-spring-annotations:1.1.3'
implementation 'org.mapstruct.extensions.spring:mapstruct-spring-extensions:2.0.0'
implementation 'org.mapstruct.extensions.spring:mapstruct-spring-annotations:2.0.0'

// Swagger/OpenAPI documentation
implementation 'org.springdoc:springdoc-openapi-starter-webmvc-ui:2.8.4'
}

2 changes: 1 addition & 1 deletion gradle/wrapper/gradle-wrapper.properties
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-8.9-bin.zip
distributionUrl=https\://services.gradle.org/distributions/gradle-8.12.1-bin.zip
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
6 changes: 2 additions & 4 deletions src/main/java/org/udg/pds/springtodo/Global.java
Original file line number Diff line number Diff line change
Expand Up @@ -6,9 +6,7 @@
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.core.env.Environment;
import org.springframework.stereotype.Service;
import org.udg.pds.springtodo.entity.IdObject;
import org.udg.pds.springtodo.entity.Tag;
import org.udg.pds.springtodo.entity.User;
import org.udg.pds.springtodo.service.TagService;
Expand Down Expand Up @@ -88,9 +86,9 @@ private void initData() {
logger.info("Starting populating database ...");

User user = userService.register("usuari", "usuari@hotmail.com", "123456");
IdObject taskId = taskService.addTask("Una tasca", user.getId(), ZonedDateTime.now(), ZonedDateTime.now());
Long taskId = taskService.addTask("Una tasca", user.getId(), ZonedDateTime.now(), ZonedDateTime.now());
Tag tag = tagService.addTag("ATag", "Just a tag");
taskService.addTagsToTask(user.getId(), taskId.id, new ArrayList<Long>() {{
taskService.addTagsToTask(user.getId(), taskId, new ArrayList<Long>() {{
add(tag.getId());
}});
userService.register("user", "user@hotmail.com", "0000");
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
package org.udg.pds.springtodo.configuration;

import io.swagger.v3.oas.models.OpenAPI;
import io.swagger.v3.oas.models.info.Contact;
import io.swagger.v3.oas.models.info.Info;
import io.swagger.v3.oas.models.info.License;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class OpenApiConfig {

@Bean
public OpenAPI customOpenAPI() {
return new OpenAPI()
.info(new Info()
.title("TODO Spring API")
.version("1.0")
.description("REST API documentation for the TODO Spring application")
.contact(new Contact()
.name("UdG PDS")
.email("pds@udg.edu"))
.license(new License()
.name("MIT License")
.url("https://opensource.org/licenses/MIT")));
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,16 +2,18 @@

import jakarta.servlet.http.HttpSession;
import jakarta.validation.Valid;
import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.NotNull;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.format.annotation.DateTimeFormat;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;
import org.udg.pds.springtodo.dto.Tag.TagDto;
import org.udg.pds.springtodo.dto.Tag.TagMapper;
import org.udg.pds.springtodo.dto.Task.TaskDto;
import org.udg.pds.springtodo.dto.Task.TaskFullDto;
import org.udg.pds.springtodo.dto.Task.TaskMapper;
import org.udg.pds.springtodo.entity.IdObject;
import org.udg.pds.springtodo.dto.common.IdDto;
import org.udg.pds.springtodo.service.TaskService;

import java.time.ZonedDateTime;
Expand Down Expand Up @@ -48,11 +50,12 @@ public Collection<TaskDto> listAllTasks(HttpSession session,
}

@PostMapping(consumes = "application/json")
public IdObject addTask(HttpSession session, @Valid @RequestBody R_Task task) {
public IdDto addTask(HttpSession session, @Valid @RequestBody R_Task task) {

Long userId = getLoggedUser(session);

return taskService.addTask(task.text, userId, task.dateCreated, task.dateLimit);
Long taskId = taskService.addTask(task.text, userId, task.dateCreated, task.dateLimit);
return new IdDto(taskId);
}

@DeleteMapping(path = "/{id}")
Expand Down Expand Up @@ -83,12 +86,15 @@ public Collection<TagDto> getTaskTags(HttpSession session,
static class R_Task {

@NotNull
@NotBlank
public String text;

@NotNull
@DateTimeFormat
public ZonedDateTime dateCreated;

@NotNull
@DateTimeFormat
public ZonedDateTime dateLimit;
}

Expand Down
14 changes: 14 additions & 0 deletions src/main/java/org/udg/pds/springtodo/dto/common/IdDto.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
package org.udg.pds.springtodo.dto.common;

import com.fasterxml.jackson.annotation.JsonProperty;
import jakarta.validation.constraints.NotNull;

/**
* DTO for returning resource IDs
*/
public record IdDto(
@JsonProperty("id")
@NotNull
Long id
) {
}
9 changes: 4 additions & 5 deletions src/main/java/org/udg/pds/springtodo/entity/BaseEntity.java
Original file line number Diff line number Diff line change
Expand Up @@ -5,16 +5,15 @@
import jakarta.persistence.GenerationType;
import jakarta.persistence.Id;
import jakarta.persistence.MappedSuperclass;
import lombok.AccessLevel;
import lombok.Data;
import lombok.Setter;

@MappedSuperclass
@Data
public class BaseEntity {

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Setter(AccessLevel.NONE)
protected Long id;

public Long getId() {
return id;
}
}
13 changes: 0 additions & 13 deletions src/main/java/org/udg/pds/springtodo/entity/IdObject.java

This file was deleted.

17 changes: 11 additions & 6 deletions src/main/java/org/udg/pds/springtodo/entity/Tag.java
Original file line number Diff line number Diff line change
Expand Up @@ -2,16 +2,10 @@

import jakarta.persistence.Entity;
import jakarta.validation.constraints.NotNull;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.NoArgsConstructor;

import java.io.Serializable;

@Entity
@Data
@NoArgsConstructor
@EqualsAndHashCode(callSuper = true)
public class Tag extends BaseEntity implements Serializable {

@NotNull
Expand All @@ -20,9 +14,20 @@ public class Tag extends BaseEntity implements Serializable {
@NotNull
private String description;

public Tag() {
}

public Tag(String name, String description) {
this.name = name;
this.description = description;
}

public String getName() {
return name;
}

public String getDescription() {
return description;
}

}
39 changes: 31 additions & 8 deletions src/main/java/org/udg/pds/springtodo/entity/Task.java
Original file line number Diff line number Diff line change
@@ -1,20 +1,12 @@
package org.udg.pds.springtodo.entity;

import jakarta.persistence.*;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.NoArgsConstructor;

import java.io.Serializable;
import java.time.ZonedDateTime;
import java.util.ArrayList;
import java.util.Collection;

@Entity
// This tells JAXB that it has to ignore getters and setters and only use fields for JSON marshaling/unmarshaling
@Data
@NoArgsConstructor
@EqualsAndHashCode(callSuper = true)
public class Task extends BaseEntity implements Serializable {

@ManyToMany
Expand All @@ -34,14 +26,45 @@ public class Task extends BaseEntity implements Serializable {
@JoinColumn(name = "user_owner")
private User user;

public Task() {
}

public Task(ZonedDateTime dateCreated, ZonedDateTime dateLimit, Boolean completed, String text) {
this.dateCreated = dateCreated;
this.dateLimit = dateLimit;
this.completed = completed;
this.text = text;
}

public ZonedDateTime getDateCreated() {
return dateCreated;
}

public ZonedDateTime getDateLimit() {
return dateLimit;
}

public Boolean getCompleted() {
return completed;
}

public String getText() {
return text;
}

public User getUser() {
return user;
}

public void setUser(User user) {
this.user = user;
}

public void addTag(Tag tag) {
tags.add(tag);
}

public Collection<Tag> getTags() {
return tags;
}
}
37 changes: 31 additions & 6 deletions src/main/java/org/udg/pds/springtodo/entity/User.java
Original file line number Diff line number Diff line change
Expand Up @@ -5,18 +5,12 @@
import jakarta.persistence.Entity;
import jakarta.persistence.OneToMany;
import jakarta.validation.constraints.NotNull;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.NoArgsConstructor;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.Collection;

@Entity(name = "users")
@Data
@NoArgsConstructor
@EqualsAndHashCode(callSuper = true)
public class User extends BaseEntity implements Serializable {

@NotNull
Expand All @@ -33,12 +27,43 @@ public class User extends BaseEntity implements Serializable {
@OneToMany(cascade = CascadeType.ALL, mappedBy = "user")
private Collection<Task> tasks = new ArrayList<>();

public User() {
}

public User(String username, String email, String password) {
this.username = username;
this.email = email;
this.password = password;
}

public String getUsername() {
return username;
}

public void setUsername(String username) {
this.username = username;
}

public String getEmail() {
return email;
}

public void setEmail(String email) {
this.email = email;
}

public String getPassword() {
return password;
}

public void setPassword(String password) {
this.password = password;
}

public Collection<Task> getTasks() {
return tasks;
}

public void addTask(Task task) {
tasks.add(task);
}
Expand Down
3 changes: 0 additions & 3 deletions src/main/java/org/udg/pds/springtodo/service/TagService.java
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,6 @@
import org.udg.pds.springtodo.entity.Tag;
import org.udg.pds.springtodo.repository.TagRepository;

import java.util.ArrayList;
import java.util.Collection;
import java.util.Optional;
import java.util.stream.Collectors;
Expand Down Expand Up @@ -41,8 +40,6 @@ public Tag addTag(String name, String description) {
}

public Collection<Tag> getTags() {
Collection<Tag> r = new ArrayList<>();

return StreamSupport.stream(tagRepository.findAll().spliterator(), false)
.collect(Collectors.toList());
}
Expand Down
Loading
Loading