Skip to content

Commit

Permalink
Merge pull request #83 from MrSebastian/extends-graphql-task-with-ass…
Browse files Browse the repository at this point in the history
…ignee

Extends graphql task with assignee
  • Loading branch information
MrSebastian authored Mar 16, 2024
2 parents 41a7b90 + 10b7c75 commit 1b178ae
Show file tree
Hide file tree
Showing 9 changed files with 113 additions and 10 deletions.
Original file line number Diff line number Diff line change
@@ -1,29 +1,48 @@
package de.mrsebastian.todoappdemo.backend.graphql;

import de.mrsebastian.todoappdemo.backend.person.rest.PersonDTO;
import de.mrsebastian.todoappdemo.backend.graphql.types.Person;
import de.mrsebastian.todoappdemo.backend.graphql.types.Task;
import de.mrsebastian.todoappdemo.backend.graphql.types.TaskOfPerson;
import de.mrsebastian.todoappdemo.backend.graphql.types.TypeMapper;
import de.mrsebastian.todoappdemo.backend.person.service.PersonService;
import de.mrsebastian.todoappdemo.backend.task.rest.TaskDTO;
import de.mrsebastian.todoappdemo.backend.task.service.TaskService;
import java.util.Collections;
import java.util.List;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.graphql.data.method.annotation.QueryMapping;
import org.springframework.graphql.data.method.annotation.SchemaMapping;
import org.springframework.stereotype.Controller;

@Controller
@RequiredArgsConstructor
@Slf4j
public class PostController {

private final TaskService taskService;

private final PersonService personService;

private final TypeMapper typeMapper;

@QueryMapping
public List<TaskDTO> getTasks() {
return taskService.getTasks();
public List<Task> getTasks() {
return taskService.getTasks().stream().map(taskDTO -> typeMapper.taskDtoToTaskType(taskDTO, null)).toList();
}

@QueryMapping
public List<PersonDTO> getPersons() {
return personService.getPersonen();
public List<Person> getPersons() {
return personService.getPersonen().stream().map(typeMapper::personDtoToPersonType).toList();
}

@SchemaMapping
public List<TaskOfPerson> tasks(Person person) {
log.atDebug().log("collection tasks of person with id > {}", person.id());

if (person.id() == null) {
return Collections.emptyList();
}

return taskService.getTaskWithAssignee(person.id()).stream().map(typeMapper::taskDtoToTaskOfPersonType).toList();
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
package de.mrsebastian.todoappdemo.backend.graphql.types;

import jakarta.validation.constraints.NotNull;
import java.util.UUID;

public record Person(@NotNull UUID id, String firstname, String lastname, @NotNull String email) {
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
package de.mrsebastian.todoappdemo.backend.graphql.types;

import de.mrsebastian.todoappdemo.backend.person.dataaccess.entity.Person;
import jakarta.validation.constraints.NotNull;
import java.util.UUID;

public record Task(@NotNull UUID id, @NotNull String title, @NotNull String description, String dueDate,
Person creator, UUID assigneeId, Person assignee) {
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
package de.mrsebastian.todoappdemo.backend.graphql.types;

import jakarta.validation.constraints.NotNull;
import java.util.UUID;

public record TaskOfPerson(@NotNull UUID id, @NotNull String title, @NotNull String description, String dueDate,
UUID creatorId, UUID assigneeId) {
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
package de.mrsebastian.todoappdemo.backend.graphql.types;

import de.mrsebastian.todoappdemo.backend.person.rest.PersonDTO;
import de.mrsebastian.todoappdemo.backend.task.rest.TaskDTO;
import org.mapstruct.Mapper;
import org.mapstruct.Mapping;

@Mapper
public interface TypeMapper {

Person personDtoToPersonType(PersonDTO personDTO);

@Mapping(target = "id", source = "taskDTO.id")
Task taskDtoToTaskType(TaskDTO taskDTO, PersonDTO assignee);

@Mapping(target = "creatorId", source = "creator.id")
TaskOfPerson taskDtoToTaskOfPersonType(TaskDTO taskDTO);
}
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,13 @@ public List<TaskDTO> getTasks() {
return taskDAService.getTasks().stream().map(taskMapper::toDTO).toList();
}

@PreAuthorize(
"hasAnyRole(T(de.mrsebastian.todoappdemo.backend.security.AuthoritiesEnum).TASK_ADMIN.name(), T(de.mrsebastian.todoappdemo.backend.security.AuthoritiesEnum).TASK_READER.name())"
)
public List<TaskDTO> getTaskWithAssignee(final UUID assigneeId) {
return getTasks().stream().filter(task -> assigneeId.equals(task.assigneeId())).toList();
}

@PreAuthorize("hasAnyRole(T(de.mrsebastian.todoappdemo.backend.security.AuthoritiesEnum).TASK_ADMIN.name())")
public void deleteTask(final UUID taskId) {
checkIfExistsOrThrow(taskId);
Expand Down
12 changes: 12 additions & 0 deletions backend/src/main/resources/graphql/tasks.graphqls
Original file line number Diff line number Diff line change
Expand Up @@ -4,13 +4,25 @@ type Task {
description: String!,
dueDate: String
creator: Person
assigneeId: ID
assignee: Person
}

type Person {
id: ID!
firstname: String
lastname: String,
email: String!
tasks: [TaskOfPerson]
}

type TaskOfPerson {
id: ID!
title: String!,
description: String!,
dueDate: String
creatorId: ID
assigneeId: ID
}

type Query {
Expand Down
6 changes: 6 additions & 0 deletions backend/src/main/resources/logback-spring.xml
Original file line number Diff line number Diff line change
Expand Up @@ -44,6 +44,12 @@
<appender-ref ref="STDOUT" />
</logger>

<logger name="de.mrsebastian.todoappdemo.backend.graphql"
level="debug"
additivity="false">
<appender-ref ref="STDOUT"/>
</logger>

<!-- Logger usage -->
<root level="info">
<appender-ref ref="STDOUT" />
Expand Down
25 changes: 21 additions & 4 deletions backend/src/test/resources/persons.graphql.http
Original file line number Diff line number Diff line change
Expand Up @@ -5,9 +5,26 @@ GRAPHQL http://localhost:39146/graphql

query {
getPersons {
id
firstname
lastname
email
id
firstname
lastname
email
}
}

### GraphQL Persons with Tasks
GRAPHQL http://localhost:39146/graphql

query {
getPersons {
id
firstname
lastname
email
tasks {
id
title
description
}
}
}

0 comments on commit 1b178ae

Please sign in to comment.