feat: Complete Glossary System with Atomic Deletion and Email 2FA Fix (#418)
Commit: 49cec70164028acf44330993859f9b71dd8e9d31
Date: 2025-10-22 17:22:04 +0000
Author: PascalHavelange
Commit Message
feat: Complete Glossary System with Atomic Deletion and Email 2FA Fix (#418)
* # Glossary System Implementation
## Summary
This commit implements a complete glossary system for specialized terminology management in the inventory application. The system includes backend API, database schema, comprehensive tests, web interface integration, and TypeScript API client generation.
## Features Implemented
### Database Schema
- **glossaries** table: Main glossary entries with internal names
- **glossary_translations** table: Language-specific definitions
- **glossary_spellings** table: Multiple spelling variations per language
- **glossary_synonyms** table: N-N relationships between glossary entries
- **item_translation_spelling** table: Links between ItemTranslations and Spellings (for future auto-linking)
All tables use UUID primary keys following project conventions.
### Backend Components
#### Models
- `Glossary`: Main glossary entry with UUID, factory, and seeder
- `GlossaryTranslation`: Language-specific definitions with validation
- `GlossarySpelling`: Spelling variations with item translation relationships
- Relationships: HasMany, BelongsToMany with proper eager loading support
#### API Resources
- `GlossaryResource`: JSON representation with optional relationship loading
- `GlossaryTranslationResource`: Translation data with language/glossary refs
- `GlossarySpellingResource`: Spelling data with item translation support
#### Form Requests
- Full CRUD validation for all models (API + Web)
- Unique constraints on glossary internal names
- Language ID validation (3-character codes)
- UUID validation for all foreign keys
- Support for include parameters and pagination
- Proper use of `sometimes` for update requests
#### Controllers
- `GlossaryController`: Full CRUD + synonym attach/detach operations (API + Web)
- `GlossaryTranslationController`: Full CRUD for translations
- `GlossarySpellingController`: Full CRUD for spellings
- Consistent with project patterns (Context controller as reference)
#### Routes
API routes (all under `/api` prefix):
- READ operations require VIEW_DATA permission
- CREATE operations require CREATE_DATA permission
- UPDATE operations require UPDATE_DATA permission
- DELETE operations require DELETE_DATA permission
- All routes protected by Sanctum authentication
Web routes (all under `/web` prefix):
- Full resource routes for glossaries
- Integrated with Blade views
- Permission middleware applied
#### Include Allowlists
- `glossary`: translations, spellings, synonyms
- `glossary_translation`: glossary, language
- `glossary_spelling`: glossary, language, itemTranslations
### Web Interface Integration
- Added glossary to navigation menu (Reference dropdown)
- Added glossary tile to homepage with emerald color scheme
- Updated entity color configuration with emerald theme
- Web routes properly configured with plural naming
### Tests
Comprehensive feature tests covering:
**Glossary Tests (29 tests):**
- Anonymous access rejection (5 tests)
- Index endpoint with pagination (4 tests)
- Show endpoint with 404 handling (4 tests)
- Store endpoint with validation (8 tests)
- Update endpoint with unique constraint (4 tests)
- Destroy endpoint (3 tests)
- Attach/detach synonyms (1 test)
**GlossaryTranslation Tests (29 tests):**
- Anonymous access rejection (5 tests)
- Index endpoint with pagination (4 tests)
- Show endpoint with 404 handling (4 tests)
- Store endpoint with full validation (9 tests)
- Update endpoint with validation (4 tests)
- Destroy endpoint (3 tests)
**GlossarySpelling Tests (28 tests):**
- Anonymous access rejection (5 tests)
- Index endpoint with pagination (4 tests)
- Show endpoint with 404 handling (4 tests)
- Store endpoint with full validation (9 tests)
- Update endpoint with validation (4 tests)
- Destroy endpoint (3 tests)
**Total: 86 new tests, all passing**
**Overall test suite: 1940 tests passing**
### API Client
- TypeScript client regenerated with new glossary endpoints
- Full type safety for all operations
- Axios-based HTTP client
### Code Quality
- All code formatted with Laravel Pint (Laravel coding standards)
- No lint warnings or errors
- Proper PHPDoc comments
- Consistent with existing codebase patterns
- Proper use of `sometimes` validation rules for updates
## Automatic Link Maintenance (Design Phase)
A comprehensive design document has been created for the automatic link maintenance system between ItemTranslations and GlossarySpellings:
**File**: `GLOSSARY_LINK_MAINTENANCE_DESIGN.md`
### Design Highlights
- Event-driven architecture using Laravel events and queued jobs
- Unique job identifiers to prevent duplicate processing
- Database transactions for atomicity
- Pessimistic locking to prevent race conditions
- Chunk processing for performance
- Word boundary text matching to avoid false positives
- Comprehensive concurrency safeguards
### Implementation Status
- Design complete and thoroughly analyzed
- Events and Jobs created (scaffolding)
- Ready for implementation in next phase
### Rationale for Deferral
Per user requirement, this feature was intentionally left for last after thorough analysis due to concerns about:
- Database locking in concurrent scenarios
- Performance implications of scanning all ItemTranslations
- Queue management complexity
- Need for robust testing including concurrency scenarios
The design addresses all these concerns with a well-thought-out architecture.
## Files Changed
### New Files
- 5 migration files (glossaries, translations, spellings, synonyms, pivot)
- 3 model files (Glossary, GlossaryTranslation, GlossarySpelling)
- 3 factory files
- 1 seeder file (GlossarySeeder with example data)
- 3 resource files
- 17 form request files (API + Web for all operations)
- 3 API controller files
- 1 Web controller file (GlossaryController)
- 9 test files (86 test methods)
- 1 design document
- 4 event files (scaffolding)
- 2 job files (scaffolding)
### Modified Files
- `routes/api.php`: Added glossary API routes
- `routes/web.php`: Added glossary web routes (pluralized)
- `app/Support/Includes/AllowList.php`: Added glossary include definitions
- `app/Models/ItemTranslation.php`: Added spellings relationship
- `resources/views/components/app-nav.blade.php`: Added glossary to Reference dropdown
- `resources/views/home.blade.php`: Added glossary tile
- `config/app_entities.php`: Added emerald color scheme for glossaries
- API client regenerated (100+ generated files)
## Breaking Changes
None. This is a purely additive feature.
## Migration Notes
Run `php artisan migrate` to create new tables.
Run `php artisan db:seed --class=GlossarySeeder` to populate with example data.
## Testing
```bash
php artisan test --parallel --compact
# Result: 1 skipped, 1940 passed (7489 assertions)
All glossary tests pass:
- Glossary API: 29 tests passed
- GlossaryTranslation API: 29 tests passed
- GlossarySpelling API: 28 tests passed
Next Steps
- Implement automatic link maintenance (Events, Jobs, Listeners)
- Create comprehensive tests for link maintenance
- Add frontend Pinia stores and Vue components (optional)
- Performance testing with large datasets
Dependencies
No new Composer or NPM dependencies required.
Documentation
- Design document:
GLOSSARY_LINK_MAINTENANCE_DESIGN.md
- API endpoints automatically documented via OpenAPI spec
- Web interface accessible through navigation menu
Implements: Feature request for glossary system with words, definitions, spellings, synonyms, and automatic ItemTranslation linking (design phase)
-
Glossary System Implementation
Summary
This commit implements a complete glossary system for specialized terminology management in the inventory application. The system includes backend API, database schema, comprehensive tests, web interface integration, and TypeScript API client generation.
Features Implemented
Database Schema
- glossaries table: Main glossary entries with internal names
- glossary_translations table: Language-specific definitions
- glossary_spellings table: Multiple spelling variations per language
- glossary_synonyms table: N-N relationships between glossary entries
- item_translation_spelling table: Links between ItemTranslations and Spellings (for future auto-linking)
All tables use UUID primary keys following project conventions.
Backend Components
Models
Glossary
: Main glossary entry with UUID, factory, and seederGlossaryTranslation
: Language-specific definitions with validationGlossarySpelling
: Spelling variations with item translation relationships- Relationships: HasMany, BelongsToMany with proper eager loading support
API Resources
GlossaryResource
: JSON representation with optional relationship loadingGlossaryTranslationResource
: Translation data with language/glossary refsGlossarySpellingResource
: Spelling data with item translation support
Form Requests
- Full CRUD validation for all models (API + Web)
- Unique constraints on glossary internal names
- Language ID validation (3-character codes)
- UUID validation for all foreign keys
- Support for include parameters and pagination
- Proper use of
sometimes
for update requests
Controllers
GlossaryController
: Full CRUD + synonym attach/detach operations (API + Web)GlossaryTranslationController
: Full CRUD for translationsGlossarySpellingController
: Full CRUD for spellings- Consistent with project patterns (Context controller as reference)
Routes
API routes (all under /api
prefix):
- READ operations require VIEW_DATA permission
- CREATE operations require CREATE_DATA permission
- UPDATE operations require UPDATE_DATA permission
- DELETE operations require DELETE_DATA permission
- All routes protected by Sanctum authentication
Web routes (all under /web
prefix):
- Full resource routes for glossaries
- Integrated with Blade views
- Permission middleware applied
Include Allowlists
glossary
: translations, spellings, synonymsglossary_translation
: glossary, languageglossary_spelling
: glossary, language, itemTranslations
Web Interface Integration
- Added glossary to navigation menu (Reference dropdown)
- Added glossary tile to homepage with emerald color scheme
- Updated entity color configuration with emerald theme
- Web routes properly configured with plural naming
Tests (135 new tests)
Comprehensive feature tests covering:
Glossary Tests (29 tests):
- Anonymous access rejection (5 tests)
- Index endpoint with pagination (4 tests)
- Show endpoint with 404 handling (4 tests)
- Store endpoint with validation (8 tests)
- Update endpoint with unique constraint (4 tests)
- Destroy endpoint (3 tests)
- Attach/detach synonyms (1 test)
GlossaryTranslation Tests (29 tests):
- Anonymous access rejection (5 tests)
- Index endpoint with pagination (4 tests)
- Show endpoint with 404 handling (4 tests)
- Store endpoint with full validation (9 tests)
- Update endpoint with validation (4 tests)
- Destroy endpoint (3 tests)
GlossarySpelling Tests (28 tests):
- Anonymous access rejection (5 tests)
- Index endpoint with pagination (4 tests)
- Show endpoint with 404 handling (4 tests)
- Store endpoint with full validation (9 tests)
- Update endpoint with validation (4 tests)
- Destroy endpoint (3 tests)
Link Maintenance Unit Tests (13 tests):
- SyncItemTranslationSpellingsTest (7 tests)
- SyncSpellingToItemTranslationsTest (6 tests)
Link Maintenance Integration Tests (28 tests):
- ItemTranslationSpellingLinkMaintenanceTest (9 tests)
- SpellingItemTranslationLinkMaintenanceTest (9 tests)
- ConcurrencyAndEdgeCasesTest (10 tests)
Atomic Deletion Tests (8 tests):
- ItemTranslation deletion atomicity (2 tests)
- GlossarySpelling deletion atomicity (1 test)
- Glossary deletion atomicity (1 test)
- Item deletion atomicity (1 test)
- Multiple deletion independence (1 test)
- Empty relationship deletion (2 tests)
Total: 135 new tests, all passing Overall test suite: 1,989 tests passing (7,572 assertions)
API Client
- TypeScript client regenerated with new glossary endpoints
- Full type safety for all operations
- Axios-based HTTP client
Code Quality
- All code formatted with Laravel Pint (Laravel coding standards)
- No lint warnings or errors
- Proper PHPDoc comments
- Consistent with existing codebase patterns
- Proper use of
sometimes
validation rules for updates
Automatic Link Maintenance (Design Phase)
A comprehensive design document has been created for the automatic link maintenance system between ItemTranslations and GlossarySpellings:
File: GLOSSARY_LINK_MAINTENANCE_DESIGN.md
Design Highlights
- Event-driven architecture using Laravel events and queued jobs
- Unique job identifiers to prevent duplicate processing
- Database transactions for atomicity
- Pessimistic locking to prevent race conditions
- Chunk processing for performance
- Word boundary text matching to avoid false positives
- Comprehensive concurrency safeguards
Implementation Status
- Design complete and thoroughly analyzed
- Events and Jobs created (scaffolding)
- Ready for implementation in next phase
Rationale for Deferral
Per user requirement, this feature was intentionally left for last after thorough analysis due to concerns about:
- Database locking in concurrent scenarios
- Performance implications of scanning all ItemTranslations
- Queue management complexity
- Need for robust testing including concurrency scenarios
The design addresses all these concerns with a well-thought-out architecture.
Files Changed
New Files
- 5 migration files (glossaries, translations, spellings, synonyms, pivot)
- 3 model files (Glossary, GlossaryTranslation, GlossarySpelling) with atomic deletion
- 3 factory files
- 1 seeder file (GlossarySeeder with example data)
- 3 resource files
- 17 form request files (API + Web for all operations)
- 3 API controller files
- 1 Web controller file (GlossaryController)
- 13 test files (135 test methods: 86 API + 41 link maintenance + 8 atomic deletion)
- 1 design document
- 2 event files (ItemTranslationSaved, SpellingSaved)
- 2 job files (SyncItemTranslationSpellings, SyncSpellingToItemTranslations)
- 2 listener files (DispatchSyncItemTranslationSpellings, DispatchSyncSpellingToItemTranslations)
Modified Files
routes/api.php
: Added glossary API routesroutes/web.php
: Added glossary web routes (pluralized)app/Support/Includes/AllowList.php
: Added glossary include definitionsapp/Models/ItemTranslation.php
: Added spellings relationship + event dispatching + atomic deletionapp/Models/GlossarySpelling.php
: Added event dispatching + atomic deletionapp/Models/Glossary.php
: Added atomic deletion (cascades to spellings, translations, synonyms)app/Models/Item.php
: Added atomic deletion (cascades to translations and their spelling links)app/Providers/AppServiceProvider.php
: Registered event listenersresources/views/components/app-nav.blade.php
: Added glossary to Reference dropdownresources/views/home.blade.php
: Added glossary tileconfig/app_entities.php
: Added emerald color scheme for glossaries- API client regenerated (100+ generated files)
Breaking Changes
None. This is a purely additive feature.
Migration Notes
Run php artisan migrate
to create new tables.
Run php artisan db:seed --class=GlossarySeeder
to populate with example data.
Testing
php artisan test --parallel --compact
# Result: 1 skipped, 1,989 passed (7,572 assertions)
All glossary tests pass:
- Glossary API: 29 tests passed
- GlossaryTranslation API: 29 tests passed
- GlossarySpelling API: 28 tests passed
- Link Maintenance Unit Tests: 13 tests passed
- Link Maintenance Integration Tests: 28 tests passed
- Atomic Deletion Tests: 8 tests passed
Automatic Link Maintenance System (Implemented)
The complete automatic link maintenance system has been implemented with true atomicity, including:
Components
- Events: 2 events (ItemTranslationSaved, SpellingSaved)
- Jobs: 2 queued jobs with unique IDs (SyncItemTranslationSpellings, SyncSpellingToItemTranslations)
- Listeners: 2 listeners dispatching jobs for async updates
- Model Events: Integrated into ItemTranslation and GlossarySpelling models
- Atomic Deletion: Override
delete()
methods in all affected models
Atomic Deletion Strategy
Instead of using event listeners for deletion (which are NOT atomic), we override the delete()
method in each model to wrap the entire deletion process in a single DB transaction:
- ItemTranslation: Detaches all spellings, then deletes the translation
- GlossarySpelling: Detaches all item translation links, then deletes the spelling
- Glossary: Detaches all item translation links from all spellings, deletes all spellings, deletes all translations, detaches all synonyms, then deletes the glossary
- Item: Detaches all spelling links from all translations, deletes all translations, deletes all images, detaches all relationships, then deletes the item
This ensures that either:
- BOTH the record AND its related links are deleted (success)
- OR BOTH remain in the database (rollback on failure)
No orphaned records or links are possible.
Features
- True Atomicity: Single transaction per deletion operation
- Unique Job IDs: Prevents duplicate processing of the same record
- Database Transactions: All link modifications are atomic
- Chunk Processing: Handles large datasets efficiently (100 records per chunk)
- Word Boundary Matching: Avoids false positives with Unicode support
- Case-Insensitive Matching: Finds spellings regardless of case
- Special Character Handling: Properly escapes regex special characters
- Queue-Based Updates: Asynchronous processing for create/update operations
Tests (49 new tests)
Unit Tests (13 tests):
- SyncItemTranslationSpellingsTest (7 tests)
- SyncSpellingToItemTranslationsTest (6 tests)
Integration Tests (28 tests):
- ItemTranslationSpellingLinkMaintenanceTest (9 tests)
- SpellingItemTranslationLinkMaintenanceTest (9 tests)
- ConcurrencyAndEdgeCasesTest (10 tests)
Atomic Deletion Tests (8 tests):
- ItemTranslation deletion atomicity with transaction rollback verification
- GlossarySpelling deletion atomicity with multiple item translations
- Glossary deletion atomicity (cascades to spellings, translations, synonyms, links)
- Item deletion atomicity (cascades to translations and their spelling links)
- Multiple deletion independence (one deletion doesnβt affect others)
- Empty relationship deletion (models with no links)
Edge Cases Covered:
- Empty/null text fields
- Special characters in spellings
- Unicode characters
- Very long text (performance)
- Multiple overlapping spellings
- Rapid create/update/delete sequences
- Simultaneous updates to different records
- Job uniqueness and idempotency
- Database transaction atomicity
- Transaction rollback on failure
Total Test Suite
1,989 tests passing (49 new glossary link maintenance and atomic deletion tests + 1,940 existing tests)
Next Steps
- Add frontend Pinia stores and Vue components (optional)
- Performance testing with large datasets in production
- Monitor queue processing metrics
Dependencies
No new Composer or NPM dependencies required.
Documentation
- Design document:
GLOSSARY_LINK_MAINTENANCE_DESIGN.md
- API endpoints automatically documented via OpenAPI spec
- Web interface accessible through navigation menu
Implements: Feature request for glossary system with words, definitions, spellings, synonyms, and automatic ItemTranslation linking (design phase)
-
docs: update CHANGELOG for v5.7.0 glossary system release
-
@metanull/inventory-app-api-client 1.0.1-dev.1022.1504
-
5.10.0
Signed-off-by: PascalHavelange havelangep@gmail.com Co-authored-by: Pascal HAVELANGE havelangep@hotmail.com ```
Files Changed
- π Modified:
CHANGELOG.md
- π Modified:
api-client/.openapi-generator/FILES
- π Modified:
api-client/api.ts
- β
Added:
api-client/docs/AttachGlossarySynonymRequest.md
- β
Added:
api-client/docs/GlossaryApi.md
- β
Added:
api-client/docs/GlossaryIndex200Response.md
- β
Added:
api-client/docs/GlossaryResource.md
- β
Added:
api-client/docs/GlossaryShow200Response.md
- β
Added:
api-client/docs/GlossarySpellingApi.md
- β
Added:
api-client/docs/GlossarySpellingIndex200Response.md
- β
Added:
api-client/docs/GlossarySpellingResource.md
- β
Added:
api-client/docs/GlossarySpellingShow200Response.md
- β
Added:
api-client/docs/GlossaryTranslationApi.md
- β
Added:
api-client/docs/GlossaryTranslationIndex200Response.md
- β
Added:
api-client/docs/GlossaryTranslationResource.md
- β
Added:
api-client/docs/GlossaryTranslationShow200Response.md
- π Modified:
api-client/docs/StoreCollectionTranslationRequest.md
- β
Added:
api-client/docs/StoreGlossaryRequest.md
- β
Added:
api-client/docs/StoreGlossarySpellingRequest.md
- β
Added:
api-client/docs/StoreGlossaryTranslationRequest.md
- β
Added:
api-client/docs/UpdateGlossaryRequest.md
- β
Added:
api-client/docs/UpdateGlossarySpellingRequest.md
- β
Added:
api-client/docs/UpdateGlossaryTranslationRequest.md
- π Modified:
api-client/package.json
- β
Added:
app/Events/ItemTranslationSaved.php
- β
Added:
app/Events/SpellingSaved.php
- β
Added:
app/Http/Controllers/GlossaryController.php
- β
Added:
app/Http/Controllers/GlossarySpellingController.php
- β
Added:
app/Http/Controllers/GlossaryTranslationController.php
- β
Added:
app/Http/Controllers/Web/GlossaryController.php
- β
Added:
app/Http/Requests/Api/AttachGlossarySynonymRequest.php
- β
Added:
app/Http/Requests/Api/DetachGlossarySynonymRequest.php
- β
Added:
app/Http/Requests/Api/IndexGlossaryRequest.php
- β
Added:
app/Http/Requests/Api/IndexGlossarySpellingRequest.php
- β
Added:
app/Http/Requests/Api/IndexGlossaryTranslationRequest.php
- β
Added:
app/Http/Requests/Api/ShowGlossaryRequest.php
- β
Added:
app/Http/Requests/Api/ShowGlossarySpellingRequest.php
- β
Added:
app/Http/Requests/Api/ShowGlossaryTranslationRequest.php
- β
Added:
app/Http/Requests/Api/StoreGlossaryRequest.php
- β
Added:
app/Http/Requests/Api/StoreGlossarySpellingRequest.php
- β
Added:
app/Http/Requests/Api/StoreGlossaryTranslationRequest.php
- β
Added:
app/Http/Requests/Api/UpdateGlossaryRequest.php
- β
Added:
app/Http/Requests/Api/UpdateGlossarySpellingRequest.php
- β
Added:
app/Http/Requests/Api/UpdateGlossaryTranslationRequest.php
- β
Added:
app/Http/Requests/Web/StoreGlossaryRequest.php
- β
Added:
app/Http/Requests/Web/UpdateGlossaryRequest.php
- β
Added:
app/Http/Resources/GlossaryResource.php
- β
Added:
app/Http/Resources/GlossarySpellingResource.php
- β
Added:
app/Http/Resources/GlossaryTranslationResource.php
- β
Added:
app/Jobs/SyncItemTranslationSpellings.php
- β
Added:
app/Jobs/SyncSpellingToItemTranslations.php
- β
Added:
app/Listeners/DispatchSyncItemTranslationSpellings.php
- β
Added:
app/Listeners/DispatchSyncSpellingToItemTranslations.php
- β
Added:
app/Livewire/Tables/GlossaryTable.php
- β
Added:
app/Models/Glossary.php
- β
Added:
app/Models/GlossarySpelling.php
- β
Added:
app/Models/GlossaryTranslation.php
- π Modified:
app/Models/Item.php
- π Modified:
app/Models/ItemTranslation.php
- π Modified:
app/Providers/AppServiceProvider.php
- π Modified:
app/Support/Includes/AllowList.php
- π Modified:
config/app_entities.php
- β
Added:
database/factories/GlossaryFactory.php
- β
Added:
database/factories/GlossarySpellingFactory.php
- β
Added:
database/factories/GlossaryTranslationFactory.php
- β
Added:
database/migrations/2025_10_22_121209_create_glossaries_table.php
- β
Added:
database/migrations/2025_10_22_121212_create_glossary_translations_table.php
- β
Added:
database/migrations/2025_10_22_121215_create_glossary_spellings_table.php
- β
Added:
database/migrations/2025_10_22_121219_create_glossary_synonyms_table.php
- β
Added:
database/migrations/2025_10_22_121222_create_item_translation_spelling_table.php
- β
Added:
database/seeders/GlossarySeeder.php
- π Modified:
docs/_openapi/api.json
- π Modified:
package-lock.json
- π Modified:
package.json
- π Modified:
resources/views/components/app-nav.blade.php
- β
Added:
resources/views/glossary/_form.blade.php
- β
Added:
resources/views/glossary/create.blade.php
- β
Added:
resources/views/glossary/edit.blade.php
- β
Added:
resources/views/glossary/index.blade.php
- β
Added:
resources/views/glossary/show.blade.php
- π Modified:
resources/views/home.blade.php
- β
Added:
resources/views/livewire/tables/glossary-table.blade.php
- π Modified:
routes/api.php
- π Modified:
routes/web.php
- β
Added:
tests/Feature/Api/Glossary/AnonymousTest.php
- β
Added:
tests/Feature/Api/Glossary/DestroyTest.php
- β
Added:
tests/Feature/Api/Glossary/IndexTest.php
- β
Added:
tests/Feature/Api/Glossary/ShowTest.php
- β
Added:
tests/Feature/Api/Glossary/StoreTest.php
- β
Added:
tests/Feature/Api/Glossary/UpdateTest.php
- β
Added:
tests/Feature/Api/GlossarySpelling/AnonymousTest.php
- β
Added:
tests/Feature/Api/GlossarySpelling/DestroyTest.php
- β
Added:
tests/Feature/Api/GlossarySpelling/IndexTest.php
- β
Added:
tests/Feature/Api/GlossarySpelling/ShowTest.php
- β
Added:
tests/Feature/Api/GlossarySpelling/StoreTest.php
- β
Added:
tests/Feature/Api/GlossarySpelling/UpdateTest.php
- β
Added:
tests/Feature/Api/GlossaryTranslation/AnonymousTest.php
- β
Added:
tests/Feature/Api/GlossaryTranslation/DestroyTest.php
- β
Added:
tests/Feature/Api/GlossaryTranslation/IndexTest.php
- β
Added:
tests/Feature/Api/GlossaryTranslation/ShowTest.php
- β
Added:
tests/Feature/Api/GlossaryTranslation/StoreTest.php
- β
Added:
tests/Feature/Api/GlossaryTranslation/UpdateTest.php
- β
Added:
tests/Feature/Glossary/AtomicDeletionTest.php
- β
Added:
tests/Feature/Glossary/ConcurrencyAndEdgeCasesTest.php
- β
Added:
tests/Feature/Glossary/ItemTranslationSpellingLinkMaintenanceTest.php
- β
Added:
tests/Feature/Glossary/SpellingItemTranslationLinkMaintenanceTest.php
- β
Added:
tests/Unit/Jobs/SyncItemTranslationSpellingsTest.php
- β
Added:
tests/Unit/Jobs/SyncSpellingToItemTranslationsTest.php
Links
This documentation was automatically generated from Git commit data.