-
Notifications
You must be signed in to change notification settings - Fork 1
/
TagService.java
131 lines (111 loc) · 4.51 KB
/
TagService.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
package dev.isdn.demo.records_dto.app.domain.tag;
import dev.isdn.demo.records_dto.app.domain.common.Functions;
import dev.isdn.demo.records_dto.app.domain.common.Result;
import dev.isdn.demo.records_dto.app.domain.note.NoteDto;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.util.*;
import java.util.function.Predicate;
@Service
public class TagService {
final private TagRepository repository;
public TagService(TagRepository repository) {
this.repository = repository;
}
@Transactional
public Optional<TagDto> createTag(String name) {
return setTagName(new Tag(), name)
.map(repository::saveAndFlush)
.flatMap(tag -> repository.findById(tag.getId()));
}
@Transactional
public Optional<TagDto> createTag(String name, String color) {
return setTagName(new Tag(), name)
.flatMap(tag -> setTagColor(tag, color))
.map(repository::saveAndFlush)
.flatMap(tag -> repository.findById(tag.getId()));
}
@Transactional
public Optional<TagDto> createTag(TagContent content) {
return content.color() != null ? createTag(content.name(), content.color()) : createTag(content.name());
}
@Transactional
public Optional<TagDto> updateTagName(TagDto tag, String name) {
return Functions.checkTagDto.apply(tag)
.flatMap(t -> repository.getTagById(t.id()))
.flatMap(t -> setTagName(t, name))
.map(repository::saveAndFlush)
.flatMap(t -> repository.findById(t.getId()));
}
@Transactional
public Optional<TagDto> updateTagColor(TagDto tag, String color) {
return Functions.checkTagDto.apply(tag)
.flatMap(t -> repository.getTagById(t.id()))
.flatMap(t -> setTagColor(t, color))
.map(repository::saveAndFlush)
.flatMap(t -> repository.findById(t.getId()));
}
@Transactional
public Optional<TagDto> updateTagContent(TagDto tag, TagContent content) {
return Functions.checkTagDto.apply(tag)
.flatMap(t -> repository.getTagById(t.id()))
.flatMap(t -> setTagNameAndColor(t, content.name(), content.color()))
.map(repository::saveAndFlush)
.flatMap(t -> repository.findById(t.getId()));
}
public Optional<TagDto> getTagById(long tagId) {
return repository.findById(tagId);
}
@Transactional(readOnly = true)
public List<TagDto> getNoteTags(NoteDto note) {
return Functions.checkNoteDto.apply(note)
.map(n -> repository.findAllByNoteId(n.id()).toList())
.orElse(Collections.emptyList());
}
@Transactional(readOnly = true)
public long getNoteTagsCount(long noteId) {
return repository.countAllByNoteId(noteId);
}
@Transactional(readOnly = true)
public List<TagDto> getAllTags() {
return repository.fetchAllTags().toList();
}
@Transactional
public Result deleteTag(TagDto tag) {
return Functions.checkTagDto.apply(tag)
.map(t -> deleteTagById(t.id()))
.orElse(new Result.Error());
}
@Transactional
public Result deleteTagById(long tagId) {
if (repository.existsById(tagId)) {
repository.deleteById(tagId);
repository.flush();
return new Result.Ok();
}
return new Result.NoSuchElement(tagId);
}
private Optional<Tag> setTagName(Tag tag, String name) {
return Optional.ofNullable(tag)
.flatMap(t ->
Functions.checkTagName.apply(name)
.filter(Predicate.not(repository::existsByName))
.map(t::setName)
);
}
private Optional<Tag> setTagColor(Tag tag, String color) {
return Optional.ofNullable(tag)
.flatMap(t ->
Functions.checkTagColor.apply(color)
.map(t::setColor)
);
}
private Optional<Tag> setTagNameAndColor(Tag tag, String name, String color) {
return Optional.ofNullable(tag)
.flatMap(t ->
Functions.checkTagName.apply(name).isPresent() ?
Functions.checkTagColor.apply(color).map(c -> t.setName(name).setColor(c)) :
Optional.empty()
);
}
}