For simplicity I have abbreviated $BUCKET
. For instance a Repository
get's published a lot of times so it has many $BUCKET
s (called Status::RepositoryPublished
currently). Checks for a certain Package
commit would need the same pattern. On the other hand a BsRequest
only get's created once, so it is the $BUCKET
.
This is how we are currently would do it. We have some special $BUCKET
called _status.
Repository
- GET
/build/:project_name/:repository_name/_status
->Status::Check
s for latest$BUCKET
forRepository
- GET
/build/:project_name/:repository_name/_status/:bucket_id
-> ListStatus::Check
s for$BUCKET
- PUT
/build/:project_name/:repository_name/_status/:bucket_id
-> CreateStatus::Check
s for$BUCKET
- GET/PUT/DELETE
/build/:project_name/:repository_name/_status/:bucket_id/:check_id
-> Read/Update/DestroyStatus::Check
inside$BUCKET
Package
- GET
/build/:project/:package/_status/
-> ListStatus::Check
s for latest$BUCKET
forPackage
- GET
/build/:project_name/:package_name/_status/:bucket_id
-> ListStatus::Check
s for$BUCKET
- PUT
/build/:project_name/:package_name/_status/:bucket_id
-> CreateStatus::Check
s for$BUCKET
- GET/PUT/DELETE
/build/:project_name/:package_name/_status/:bucket_id/:check_id
-> Read/Update/DestroyStatus::Check
inside$BUCKET
Request
- GET
/request/:request_id/_status
->Status::Checks
s for thisBsRequest
- PUT
/request/:request_id/_status
-> CreateStatus::Check
s forBsRequest
- GET/PUT/DELETE
/request/:request_id/_status/:check_id
-> Read/Update/DestroyStatus::Check
insideBsRequest
Package Commit
- GET
/source/:project_name/:package_name/_status
->Status::Check
s for latest$BUCKET
forPackage
- GET
/source/:project_name/:package_name/_status/:bucket_id
-> ListStatus::Check
s for$BUCKET
- PUT
/source/:project_name/:package_name/_status/:bucket_id
-> CreateStatus::Check
s for$BUCKET
- GET/PUT/DELETE
/source/:project_name/:package_name/_status/:bucket_id/:check_id
-> Read/Update/DestroyStatus::Check
inside$BUCKET
Project Commits(???)
- GET
/source/:project_name/_status
-> ListStatus::Check
s forProject
- PUT
/source/:project_name/_status
-> CreateStatus::Check
s forProject
- GET/PUT/DELETE
/source/:project_name/_status/:check_id
-> Read/Update/DestroyStatus::Check
insideProject
No new prefixes
As soon as you have 2 things below a prefix you have clashes like:
- Can't have an
Architecture
called _status because the route/build/:project/:repository/:arch
exists - Can't have an
Package
called _status because the route/source/:project/:package
exists (a leading _ is already forbidden in package names) - Can't have a file in a
Package
called _status because The route/build/:project/:package/:filename
exists - Can't have a
Package.where(name: 'hans')
and aRepository.where(name: 'hans')
. Because both/build/:project/:package/_status/
and/build/:project/:repository/_status/
exist
Repository
- GET
/projects/:project_name/repositories/:repository_name/$BUCKET
-> List all$BUCKET
s forRepository
- GET
/projects/:project_name/repositories/:repository_name/$BUCKET?latest=true
-> Latest$BUCKET
forRepository
- GET
/projects/:project_name/repositories/:repository_name/$BUCKET/:bucket_id
-> ListStatus::Check
s for$BUCKET
- PUT
/projects/:project_name/repositories/:repository_name/$BUCKET/:bucket_id
-> CreateStatus::Check
s for$BUCKET
- GET/PUT/DELETE
/projects/:project_name/repositories/:repository_name/$BUCKET/:bucket_id/:check_id
-> Read/Update/DestroyStatus::Check
inside$BUCKET
Project
- GET
/projects/:project_name/$BUCKET
-> List all$BUCKET
s forProject
- GET
/projects/:project_name/$BUCKET?latest=true
-> Latest$BUCKET
forProject
- GET
/projects/:project_name/$BUCKET/:bucket_id
-> ListStatus::Check
s for$BUCKET
- PUT
/projects/:project_name/$BUCKET/:bucket_id
-> CreateStatus::Check
s for$BUCKET
- GET/PUT/DELETE
/projects/:project_name/$BUCKET/:bucket_id/:check_id
-> Read/Update/DestroyStatus::Check
inside$BUCKET
Package
- GET
/projects/:project_name/packages/:package_name/$BUCKET
-> List all$BUCKET
s forRepository
- GET
/projects/:project_name/packages/:package_name/$BUCKET?latest=true
-> Latest$BUCKET
forRepository
- GET
/projects/:project_name/packages/:package_name/$BUCKET/:bucket_id
-> ListStatus::Check
s for$BUCKET
- PUT
/projects/:project_name/packages/:package_name/$BUCKET/:bucket_id
-> CreateStatus::Check
s for$BUCKET
- GET/PUT/DELETE
/projects/:project_name/packages/:package_name/$BUCKET/:bucket_id/:check_id
-> Read/Update/DestroyStatus::Check
inside$BUCKET
Request
- GET
/requests/:request_number/$BUCKET
-> ListStatus::Check
s forBsRequest
- PUT
/requests/:request_number/$BUCKET
-> CreateStatus::Check
s for$BUCKET
- GET/PUT/DELETE
/requests/:request_number/$BUCKET/:check_id
-> Read/Update/DestroyStatus::Check
insideBsRequest
PROS:
- Simple, built in, resourceful routing CONS:
- Longer routes
- A new prefix to remember (
/projects
) - Can't have a
$BUCKET
with the same id for the same object (e.g.Package
build and commit with id 12345) which we could easily avoid by splitting$BUCKET
into two things ($SOURCE_BUCKET
and$BINARY_BUCKET
) or with a$BUCKET.type
or something.