feat: Implement Collection model with translations and partner relationships (#211)
Commit: 8113c6479e8214229f9891f26c4464c45a0b7ffa
Date: 2025-07-09 17:44:08 +0200
Author: PascalHavelange
Commit Message
feat: Implement Collection model with translations and partner relationships (#211)
* Publishing "@metanull/inventory-app-api-client" version "1.1.3-dev.0709.1520"
* Fix issue of duplicated github action
* # feat: Implement Collection model with full CRUD API and translation support
## Summary
Implement the Collection model as the first type of collection for organizing museum items, with comprehensive translation support, partner relationships, and full REST API endpoints.
## Features Added
- **Collection Model**: Core model with UUID primary key and relationships
- **Translation Support**: CollectionTranslation model following existing pattern
- **Partner Integration**: Many-to-many relationships with PartnerLevel enum
- **Item Relationships**: Added collection_id foreign key to items table
- **REST API**: Full CRUD endpoints with proper validation and resources
- **Database Schema**: 4 new migrations for collections, translations, and relationships
## Models & Database
- `Collection` model with HasUuids trait and relationships
- `CollectionTranslation` model for internationalization
- `CollectionPartner` pivot model with PartnerLevel enum
- `PartnerLevel` enum (PARTNER, ASSOCIATED_PARTNER, MINOR_CONTRIBUTOR)
- Migrations for collections, collection_translations, collection_partner tables
- Added collection_id column to items table
## API Endpoints
- `GET /api/collection` - List all collections with relationships
- `GET /api/collection/{id}` - Show specific collection
- `POST /api/collection` - Create new collection
- `PUT /api/collection/{id}` - Update existing collection
- `DELETE /api/collection/{id}` - Delete collection
- Proper validation, eager loading, and resource responses
## Testing & Quality
- Comprehensive unit tests for factories
- Full feature test suite (Anonymous, Index, Show, Store, Update, Destroy)
- All tests passing (1098 tests, 4544 assertions)
- PSR-12 compliant code (Pint linting passed)
- Laravel 12 best practices followed
## Technical Details
- Follows existing translation pattern without HasTranslations trait
- Consistent with app's hard delete approach (no soft deletes)
- UUID support with proper relationships
- Enum-based partner contribution levels
- Factory and seeder integration
Closes #[issue-number] if applicable
* # docs: Update documentation for Collection API and fix client link issues
## Documentation Updates
- **README.md**: Added Collection model documentation with features and API endpoints
- **API Client Documentation**: Updated to @metanull/inventory-app-api-client@1.1.5-dev.709.1730
- **Client Link Fix**: Removed trailing slashes from API client documentation URLs
- **Test Statistics**: Updated test count to 1098+ tests with 4544+ assertions
## Collection Documentation Added
- Collection model in Core Business Models section
- Collection API endpoints in Custom Endpoints section
- Translation support and partner relationship features
- UUID primary key and relationship documentation
## Bug Fixes
- **Fixed broken links**: Removed trailing "/" from client documentation URLs
- Before: `/api-client/availableimageresource/` (404 error)
- After: `/api-client/availableimageresource` (working)
- Updated Jekyll URL generation in `docs/generate-client-docs.py`
## Technical Changes
- Generated 166 Jekyll pages for API client documentation
- Included Collection API documentation (CollectionApi, CollectionResource, etc.)
- Updated package version references
---------
Co-authored-by: Pascal HAVELANGE <havelangep@hotmail.com>
Files Changed
- ❌ Deleted:
.github/workflows/generate-client-docs.yml
- 📝 Modified:
.github/workflows/github-pages.yml
- 📝 Modified:
README.md
- 📝 Modified:
api-client/.openapi-generator/FILES
- 📝 Modified:
api-client/api.ts
- ✅ Added:
api-client/docs/CollectionApi.md
- ✅ Added:
api-client/docs/CollectionIndex200Response.md
- ✅ Added:
api-client/docs/CollectionResource.md
- ✅ Added:
api-client/docs/CollectionStore200Response.md
- ✅ Added:
api-client/docs/CollectionStoreRequest.md
- ✅ Added:
api-client/docs/CollectionTranslationResource.md
- ✅ Added:
api-client/docs/CollectionUpdateRequest.md
- 📝 Modified:
api-client/package.json
- ✅ Added:
app/Enums/PartnerLevel.php
- ✅ Added:
app/Http/Controllers/CollectionController.php
- ✅ Added:
app/Http/Resources/CollectionResource.php
- ✅ Added:
app/Http/Resources/CollectionTranslationResource.php
- ✅ Added:
app/Models/Collection.php
- ✅ Added:
app/Models/CollectionPartner.php
- ✅ Added:
app/Models/CollectionTranslation.php
- 📝 Modified:
app/Models/Item.php
- ✅ Added:
database/factories/CollectionFactory.php
- ✅ Added:
database/factories/CollectionTranslationFactory.php
- ✅ Added:
database/migrations/2025_07_09_141604_create_collections_table.php
- ✅ Added:
database/migrations/2025_07_09_141633_create_collection_translations_table.php
- ✅ Added:
database/migrations/2025_07_09_141711_create_collection_partner_table.php
- ✅ Added:
database/migrations/2025_07_09_141754_add_collection_id_to_items_table.php
- ✅ Added:
database/seeders/CollectionSeeder.php
- 📝 Modified:
database/seeders/DatabaseSeeder.php
- 📝 Modified:
docs/_openapi/api.json
- 📝 Modified:
docs/api-client/addressapi.md
- 📝 Modified:
docs/api-client/addressindex200response.md
- 📝 Modified:
docs/api-client/addressresource.md
- 📝 Modified:
docs/api-client/addressstore201response.md
- 📝 Modified:
docs/api-client/addressstore422response.md
- 📝 Modified:
docs/api-client/addressstorerequest.md
- 📝 Modified:
docs/api-client/addressstorerequesttranslationsinner.md
- 📝 Modified:
docs/api-client/addresstranslationapi.md
- 📝 Modified:
docs/api-client/addresstranslationindex200response.md
- 📝 Modified:
docs/api-client/addresstranslationresource.md
- 📝 Modified:
docs/api-client/addresstranslationstore200response.md
- 📝 Modified:
docs/api-client/addresstranslationstorerequest.md
- 📝 Modified:
docs/api-client/addresstranslationupdaterequest.md
- 📝 Modified:
docs/api-client/addressupdaterequest.md
- 📝 Modified:
docs/api-client/addressupdaterequesttranslationsinner.md
- 📝 Modified:
docs/api-client/artistresource.md
- 📝 Modified:
docs/api-client/authorresource.md
- 📝 Modified:
docs/api-client/availableimageapi.md
- 📝 Modified:
docs/api-client/availableimageindex200response.md
- 📝 Modified:
docs/api-client/availableimageresource.md
- 📝 Modified:
docs/api-client/availableimageshow200response.md
- 📝 Modified:
docs/api-client/availableimageupdaterequest.md
- ✅ Added:
docs/api-client/collectionapi.md
- ✅ Added:
docs/api-client/collectionindex200response.md
- ✅ Added:
docs/api-client/collectionresource.md
- ✅ Added:
docs/api-client/collectionstore200response.md
- ✅ Added:
docs/api-client/collectionstorerequest.md
- ✅ Added:
docs/api-client/collectiontranslationresource.md
- ✅ Added:
docs/api-client/collectionupdaterequest.md
- 📝 Modified:
docs/api-client/contactapi.md
- 📝 Modified:
docs/api-client/contactindex200response.md
- 📝 Modified:
docs/api-client/contactresource.md
- 📝 Modified:
docs/api-client/contactstore201response.md
- 📝 Modified:
docs/api-client/contactstorerequest.md
- 📝 Modified:
docs/api-client/contactstorerequesttranslationsinner.md
- 📝 Modified:
docs/api-client/contacttranslationapi.md
- 📝 Modified:
docs/api-client/contacttranslationindex200response.md
- 📝 Modified:
docs/api-client/contacttranslationresource.md
- 📝 Modified:
docs/api-client/contacttranslationstore200response.md
- 📝 Modified:
docs/api-client/contacttranslationstorerequest.md
- 📝 Modified:
docs/api-client/contacttranslationupdaterequest.md
- 📝 Modified:
docs/api-client/contactupdaterequest.md
- 📝 Modified:
docs/api-client/contactupdaterequesttranslationsinner.md
- 📝 Modified:
docs/api-client/contextapi.md
- 📝 Modified:
docs/api-client/contextgetdefault404response.md
- 📝 Modified:
docs/api-client/contextindex200response.md
- 📝 Modified:
docs/api-client/contextresource.md
- 📝 Modified:
docs/api-client/contextsetdefault200response.md
- 📝 Modified:
docs/api-client/contextsetdefaultrequest.md
- 📝 Modified:
docs/api-client/contextstorerequest.md
- 📝 Modified:
docs/api-client/countryapi.md
- 📝 Modified:
docs/api-client/countryindex200response.md
- 📝 Modified:
docs/api-client/countryresource.md
- 📝 Modified:
docs/api-client/countrystore200response.md
- 📝 Modified:
docs/api-client/countrystorerequest.md
- 📝 Modified:
docs/api-client/countryupdaterequest.md
- 📝 Modified:
docs/api-client/detailapi.md
- 📝 Modified:
docs/api-client/detailindex200response.md
- 📝 Modified:
docs/api-client/detailresource.md
- 📝 Modified:
docs/api-client/detailstore200response.md
- 📝 Modified:
docs/api-client/detailstorerequest.md
- 📝 Modified:
docs/api-client/detailtranslationapi.md
- 📝 Modified:
docs/api-client/detailtranslationresource.md
- 📝 Modified:
docs/api-client/detailtranslationsapi.md
- 📝 Modified:
docs/api-client/detailtranslationshow200response.md
- 📝 Modified:
docs/api-client/detailtranslationstorerequest.md
- 📝 Modified:
docs/api-client/detailtranslationupdaterequest.md
- 📝 Modified:
docs/api-client/imageuploadapi.md
- 📝 Modified:
docs/api-client/imageuploadindex200response.md
- 📝 Modified:
docs/api-client/imageuploadresource.md
- ✅ Added:
docs/api-client/imageuploadstatus200response.md
- ✅ Added:
docs/api-client/imageuploadstatus200responseanyof.md
- ✅ Added:
docs/api-client/imageuploadstatus200responseanyof1.md
- ✅ Added:
docs/api-client/imageuploadstatus404response.md
- 📝 Modified:
docs/api-client/imageuploadstore200response.md
- 📝 Modified:
docs/api-client/index.md
- 📝 Modified:
docs/api-client/inlineobject.md
- 📝 Modified:
docs/api-client/inlineobject1.md
- 📝 Modified:
docs/api-client/itemapi.md
- 📝 Modified:
docs/api-client/itemindex200response.md
- 📝 Modified:
docs/api-client/itemresource.md
- 📝 Modified:
docs/api-client/itemstore200response.md
- 📝 Modified:
docs/api-client/itemstorerequest.md
- 📝 Modified:
docs/api-client/itemtranslationapi.md
- 📝 Modified:
docs/api-client/itemtranslationresource.md
- 📝 Modified:
docs/api-client/itemtranslationsapi.md
- 📝 Modified:
docs/api-client/itemtranslationshow200response.md
- 📝 Modified:
docs/api-client/itemtranslationstorerequest.md
- 📝 Modified:
docs/api-client/itemtranslationupdaterequest.md
- 📝 Modified:
docs/api-client/itemupdatetagsrequest.md
- 📝 Modified:
docs/api-client/itemwithalltagsrequest.md
- 📝 Modified:
docs/api-client/languageapi.md
- 📝 Modified:
docs/api-client/languagegetdefault404response.md
- 📝 Modified:
docs/api-client/languagegetenglish404response.md
- 📝 Modified:
docs/api-client/languageindex200response.md
- 📝 Modified:
docs/api-client/languageresource.md
- 📝 Modified:
docs/api-client/languagesetdefault200response.md
- 📝 Modified:
docs/api-client/languagestorerequest.md
- 📝 Modified:
docs/api-client/languageupdaterequest.md
- 📝 Modified:
docs/api-client/locationapi.md
- 📝 Modified:
docs/api-client/locationindex200response.md
- 📝 Modified:
docs/api-client/locationresource.md
- 📝 Modified:
docs/api-client/locationstore201response.md
- 📝 Modified:
docs/api-client/locationstorerequest.md
- 📝 Modified:
docs/api-client/locationstorerequesttranslationsinner.md
- 📝 Modified:
docs/api-client/locationtranslationapi.md
- 📝 Modified:
docs/api-client/locationtranslationindex200response.md
- 📝 Modified:
docs/api-client/locationtranslationresource.md
- 📝 Modified:
docs/api-client/locationtranslationstore200response.md
- 📝 Modified:
docs/api-client/locationtranslationstorerequest.md
- 📝 Modified:
docs/api-client/locationtranslationupdaterequest.md
- 📝 Modified:
docs/api-client/locationupdaterequest.md
- 📝 Modified:
docs/api-client/locationupdaterequesttranslationsinner.md
- 📝 Modified:
docs/api-client/markdownapi.md
- 📝 Modified:
docs/api-client/markdownapiendpointsformarkdownprocessingandconversionapi.md
- 📝 Modified:
docs/api-client/markdownfromhtmlrequest.md
- 📝 Modified:
docs/api-client/markdownismarkdownrequest.md
- 📝 Modified:
docs/api-client/markdownpreview200response.md
- 📝 Modified:
docs/api-client/markdownpreview200responsedata.md
- 📝 Modified:
docs/api-client/markdownpreview422response.md
- 📝 Modified:
docs/api-client/markdownpreview500response.md
- 📝 Modified:
docs/api-client/markdowntohtmlrequest.md
- 📝 Modified:
docs/api-client/mobileappauthenticationapi.md
- 📝 Modified:
docs/api-client/partnerapi.md
- 📝 Modified:
docs/api-client/partnerindex200response.md
- 📝 Modified:
docs/api-client/partnerresource.md
- 📝 Modified:
docs/api-client/partnerstore200response.md
- 📝 Modified:
docs/api-client/partnerstorerequest.md
- 📝 Modified:
docs/api-client/pictureapi.md
- 📝 Modified:
docs/api-client/picturedetachfromitem422response.md
- 📝 Modified:
docs/api-client/pictureindex200response.md
- 📝 Modified:
docs/api-client/pictureresource.md
- 📝 Modified:
docs/api-client/pictureshow200response.md
- ✅ Added:
docs/api-client/picturetranslationapi.md
- ✅ Added:
docs/api-client/picturetranslationindex200response.md
- ✅ Added:
docs/api-client/picturetranslationindex200responselinks.md
- ✅ Added:
docs/api-client/picturetranslationindex200responsemeta.md
- ✅ Added:
docs/api-client/picturetranslationindex200responsemetalinksinner.md
- ✅ Added:
docs/api-client/picturetranslationresource.md
- ✅ Added:
docs/api-client/picturetranslationstore200response.md
- ✅ Added:
docs/api-client/picturetranslationstorerequest.md
- ✅ Added:
docs/api-client/picturetranslationupdaterequest.md
- 📝 Modified:
docs/api-client/pictureupdaterequest.md
- 📝 Modified:
docs/api-client/projectapi.md
- 📝 Modified:
docs/api-client/projectenabled200response.md
- 📝 Modified:
docs/api-client/projectresource.md
- 📝 Modified:
docs/api-client/projectsetenabledrequest.md
- 📝 Modified:
docs/api-client/projectsetlaunched200response.md
- 📝 Modified:
docs/api-client/projectsetlaunchedrequest.md
- 📝 Modified:
docs/api-client/projectstorerequest.md
- 📝 Modified:
docs/api-client/provinceapi.md
- 📝 Modified:
docs/api-client/provinceindex200response.md
- 📝 Modified:
docs/api-client/provinceresource.md
- 📝 Modified:
docs/api-client/provincestore201response.md
- 📝 Modified:
docs/api-client/provincetranslationapi.md
- 📝 Modified:
docs/api-client/provincetranslationindex200response.md
- 📝 Modified:
docs/api-client/provincetranslationresource.md
- 📝 Modified:
docs/api-client/provincetranslationstore200response.md
- 📝 Modified:
docs/api-client/provincetranslationstorerequest.md
- 📝 Modified:
docs/api-client/provincetranslationupdaterequest.md
- 📝 Modified:
docs/api-client/tagapi.md
- 📝 Modified:
docs/api-client/tagindex200response.md
- 📝 Modified:
docs/api-client/tagresource.md
- 📝 Modified:
docs/api-client/tagstore200response.md
- 📝 Modified:
docs/api-client/tagstorerequest.md
- 📝 Modified:
docs/api-client/tokenacquirerequest.md
- 📝 Modified:
docs/api-client/workshopresource.md
- 📝 Modified:
docs/generate-client-docs.py
- 📝 Modified:
routes/api.php
- ✅ Added:
tests/Feature/Api/Collection/AnonymousTest.php
- ✅ Added:
tests/Feature/Api/Collection/DestroyTest.php
- ✅ Added:
tests/Feature/Api/Collection/IndexTest.php
- ✅ Added:
tests/Feature/Api/Collection/ShowTest.php
- ✅ Added:
tests/Feature/Api/Collection/StoreTest.php
- ✅ Added:
tests/Feature/Api/Collection/UpdateTest.php
- ✅ Added:
tests/Unit/Collection/FactoryTest.php
Links
This documentation was automatically generated from Git commit data.