2016-03-08 4 views
0

У меня есть коллекция под названием Entity, и каждый объект имеет свойство, называемое группами.RESTful design design

{ 
    _id: xxx, 
    groups: [g1, g2, g3], 
    others... 
} 

Предприятие имеет не более нескольких групп. Группы не сильно меняются, и я не храню их в отдельных коллекциях. Объект групповой массив выглядит следующим образом:

g1 = { 
    group_id: xxx, 
    name: xxx 
} 

Также у меня есть User коллекции. Каждый пользователь принадлежит ровно 1 сущности и 1 группе. Таким образом, в основном у нас есть свойство, называемое user.entity и user.group, которое ссылается только на 1 документ сущности выше.

Когда пользователь хочет получить информацию о сущности, он может сделать GET /entity/123. Это легко. Что относительно групп лиц? Возможные варианты:

GET /entity/123/group или GET /group.

Способ 1 является прямым. Вы уже говорите людям, что хотите получить группы в организации 123. Таким образом, вы можете настроить middlewares, чтобы превратить 123 в req.entity и сразу вернуть entity.groups. Но для администраторов он может запросить все группы во всех сущностях, и этот API кажется неправильным?

Причина, по которой метод 2 также хорошо, потому что после получения req.user я могу проверить req.user.entity, объект запроса 123 и вернуть группы. Но я чувствую, что мне нужно выполнить дополнительные проверки условий, чтобы получить группы. Также, если администратор хочет запросить все группы, мы просто должны запросить с другим условием, и условия запроса могут быть беспорядочными/

Так какой лучший дизайн здесь? Есть ли что-то более RESTful, чем другое? (Кстати, один пользователь будет иметь ровно 1 группу и 1 юридическое лицо и user.entity никогда не изменится.)

ответ

1

Я работаю над аналогичным проектом, и мое решение представляет собой смесь обоих ваших возможных вариантов:

GET /group?entity_id=123 

С этим, я могу напрямую обращаться к группам через entity_id и может возвращать все groups, когда entity_id отсутствует (например, в случае администраторов).

Этот метод зависит ли ваш groups вкладываются entities, или они являются независимыми (т.е. может 2 разные entities имеют 2 разных groups с одинаковым идентификатором?).

Если они независимы, вы также можете сделать что-то вроде:

GET /group/456 

доступ к группе непосредственно через его идентификатор. Однако это не сработает, если у вас есть две группы с одинаковыми идентификаторами. В этом случае лучше вставить ваш url через entity/:id/group

+0

ya 2 варианта использования. мое мышление в один прекрасный день, когда кто-то переключает сущность или каждый человек принадлежит к двум сущностям, было бы сложно просто GET/groups. если я не должен принимать во внимание это. –