On 11/27/2017 12:19 PM, Jeff Ortel wrote:
> 
> 
> On 11/17/2017 08:55 AM, Patrick Creech wrote:
>> One of the things I like to think about in these types of situations is, 
>> "what is good rest api
>> design".  Nesting resources under other resources is a necessary part of 
>> good api design, and has
>> its place.  To borrow some terms from domain driven development:
>>
>> Collections of objects are called aggregates.  Think 'an order and its line 
>> items'.  Line items make
>> no sense without having the order context, so they are an aggregate that is 
>> accessed under an
>> Order.  This is called the aggregate root.  The rest api design for such an 
>> object, using order as
>> the aggregate root, would look like:
>>
>> '/orders/' -- all orders
>> '/orders/{order_key}/' -- a specific order with key.
>> '/orders/{order_key}/items/' -- All of the order's items.
>> '/orders/{order_key}/items/{item_key}/' -- a specific line item of the order
>>
>> When it comes to order items themselves, it isn't helpful to start with them 
>> as their own aggregate
>> root in one large collection:
>>
>> '/items/'   -- all order items in the system
> 
> The order/items is a good example of aggregation (or composition) and I agree 
> it makes a strong case for
> nesting.  In pulp, a repository is easily thought of as a collection or 
> aggregation of content.
> 
>>
>> Because you lose the order context. Based on api design, this endpoint will 
>> need to respond with all
>> order items across all orders and resort to parameter filtering to provide 
>> the context you need.
>>
>> A quote borrowed from Martin Fowler [0]
>>
>> "An aggregate will have one of its component objects be the aggregate root. 
>> Any references from
>> outside the aggregate should only go to the aggregate root. The root can 
>> thus ensure the integrity
>> of the aggregate as a whole."
>>
>> Publishers, importers, and publications are all aggregates that don't make 
>> much sense outside of
>> their aggregate root of Repository.  They are dependent on the Repository 
>> context, and from a domain
>> view, should be accessed starting with their specific Repository endpoint.
> 
> I don't think the aggregation relationship exists between repository and 
> importer/publisher.  There is a
> strong association between repository and importer/publisher which /could/ 
> even be characterized as
> "ownership".  However, I don't think there is an aggregation (or composition) 
> relationship.  The same for
> publisher & publication.  A publication is associated to its creating 
> publisher but the publisher isn't an
> aggregation of publications.  The relationship mainly provides linkage to the 
> repository.

This is not an argument to flatten the URLs but meant to clarify the 
relationships.

> 
>>
>> --------------------------------------------------------------
>> Specific items rebuttals:
>>     
>>     Yes, using the primary key uuid's as the immutable key adds some human 
>> readable challenges to
>> the API.  That sounds more like a point to discuss in the human readable vs. 
>> not human readable
>> immutable key debate.
> 
> Agreed.
> 
> Also, I don't think nesting impacts URL readability.
> 
>>     
>>     One of the challenges in software engineering is ensuring the tools you 
>> are using don't limit
>> your choices.  DRF limited the choices for pulp's rest API design, and 
>> drf-nested-routers was
>> introduced to help remove that limit.  If working around these limitations 
>> is complex, take
>> advantage of open source here and help improve the upstream dependencies for 
>> your workflow.
>>     
>>     As far as making things simpler for plugin writers, perhaps there are 
>> ways you can simplify it
>> for them by providing some encapsulation in pulp's core instead.  Abstract 
>> away the nasty bits
>> behind the scenes, and provide them with a simpler interface to do what they 
>> need.
>>     
>>     With respect to the invested time already in making this work, I agree 
>> with jeremy that it
>> should be considered part of the sunken cost fallacy.  What does need to be 
>> evaluated though is how
>> much time re-architecting at this point will cost you (discussion, planning, 
>> and development) vs the
>> amount of time it will save, and weigh that against any planned milestones 
>> for pulp to see if it
>> will push them out as well.
>>     
>>     I'm also in agreement that it is moot if pulp3 has a different api 
>> structure than pulp2.  Major
>> version boundaries are the perfect time for evaluating and moving such 
>> things around.
>>
>> [0] https://martinfowler.com/bliki/DDD_Aggregate.html
>>
>>
>>
>> _______________________________________________
>> Pulp-dev mailing list
>> Pulp-dev@redhat.com
>> https://www.redhat.com/mailman/listinfo/pulp-dev
>>
> 

Attachment: signature.asc
Description: OpenPGP digital signature

_______________________________________________
Pulp-dev mailing list
Pulp-dev@redhat.com
https://www.redhat.com/mailman/listinfo/pulp-dev

Reply via email to