Скажем, пример, в котором мы хотим создать статью с некоторыми тегами . Ниже мой псевдокод, а вопросы внизу. Большое спасибо за любые идеи !!
Пример дела
Запрос:
@Data
public class CreateArticleRequest {
@NotEmpty
String content;
@NotEmpty
List<Integer> tagIds;
}
Контроллер:
@RestfulController
public class ArticleController {
// ... some autowire ...
public void create(@Valid CreateArticleRequest request) {
// (i) shall I do this?
if(!repository.doesAllTagIdsExists(request.getTagIds())) {
throw new RuntimeException("bad tagIds");
}
service.create(request); // or shall I put something here?
}
}
Сервис:
@Service
public class ArticleService {
// ... some autowire ...
public void create(CreateArticleRequest request) {
Article article = new Article();
article.setContent(request.getContent());
Article createdArticle = repository.createArticle(article);
// (ii)
repository.createArticleTagRelation(createdArticle.getId(), request.getTagIds());
}
}
Модель:
@Data class Article { int id; String content; }
@Data class Tag { int id; ...sth else... }
База данных:
Table "article" columns: id, content
Table "tag" columns: id, sth_else
Table "article_has_tag" columns: article_id, tag_id
Вопросы
- Конечно, нам нужно проверить, является ли
tagId
существует и виден этому пользователю, вместо того, чтобы доверять ему и напрямую помещать в базу данных. Где мне это сделать? Должен ли я сделать это в (я)? (Я знаю, что мы можем проверять такие вещи, как «не пустой» и т. Д. c, используя @NotEmpty
, но как я могу проверить те tagIds, которым нужна база данных?) - На (ii) в Сервисе,
createArticle
+ createArticleTagRelation
здесь можно обработать или объединить их в одну функцию хранилища repository.createArticleAndWithTagRelation
? - Хорошо ли иметь такие
XXXRequest
и YYYResponse
объекты? Что-то не так с моей общей архитектурой?
Большое спасибо за любые идеи! Извините, я новичок в этой области ...