14 KiB
TODO: Migrate from v2 API to GraphQL API
Status: 🔴 Not Started
Priority: HIGH
Estimated Effort: 2-3 weeks
Last Updated: October 23, 2025
Overview
Currently, the tilbudsgiveren application uses the v2 REST API for Ordrestyring integration. We need to migrate all API calls to the new GraphQL API at https://graphql.ordrestyring.dk/graphql.
Benefits of Migration
✅ Single endpoint - No more managing multiple REST endpoints
✅ Efficient data fetching - Request only the fields you need
✅ Type safety - GraphQL schema provides strong typing
✅ Better error handling - Structured error responses
✅ Reduced over/under-fetching - Get exactly what you need
✅ Real-time capabilities - GraphQL subscriptions for live updates
✅ Better documentation - Self-documenting API via introspection
Current State
API Scripts Available
Located in /home/w34078/scripts/apitest/:
- 255 Query Scripts (read-only operations) - ✅ Safe to integrate immediately
- 311 Mutation Scripts (write operations) - ⚠️ Requires careful integration
- 144 Output Examples - Real API responses for testing
- 565/566 Endpoints documented (99.8% coverage)
Documentation
API_INTEGRATION_GUIDE.md- Complete integration guideBATCH_*_SUMMARY.md- Batch documentation files- All scripts have
--helpdocumentation
Migration Plan
Phase 1: Setup & Infrastructure (Week 1)
1.1 Backend Setup
- Install GraphQL client library (
graphql-requestorapollo-client) - Create GraphQL client wrapper in
backend/src/graphql/client.js - Set up authentication with API key from environment variables
- Create error handling middleware for GraphQL responses
Example:
// backend/src/graphql/client.js
const { GraphQLClient } = require('graphql-request');
const client = new GraphQLClient('https://graphql.ordrestyring.dk/graphql', {
headers: {
authorization: `Bearer ${process.env.ORDRESTYRING_API_KEY}`,
},
});
module.exports = client;
1.2 Environment Configuration
- Add
ORDRESTYRING_API_KEYto.envfile - Add
GRAPHQL_ENDPOINTto.envfile - Update deployment scripts to include new env vars
- Document API key rotation procedure
Files to update:
.env.env.exampleREADME.md- Deployment scripts
Phase 2: Query Migration (Week 1-2)
Migrate all read-only queries first - these are safe to integrate immediately.
2.1 Core Business Queries (High Priority)
Cases API
- Migrate
GET /api/cases→ GraphQLcasesquery - Migrate
GET /api/cases/:id→ GraphQLcase(id: $id)query - Migrate case activities, statuses, types, templates queries
- Update React components to use new endpoints
Current: /api/customer-projects/
New: GraphQL queries from curl_cases.sh, curl_case_activities.sh, etc.
Files to update:
backend/routes/customerProjects.jsfrontend/src/api/customerProjectsAPI.jsfrontend/src/components/ProjectList.jsxfrontend/src/components/ProjectDetails.jsx
Customers API
- Migrate
GET /api/customers→ GraphQLcustomersquery - Migrate
GET /api/customers/:id→ GraphQLcustomer(id: $id)query - Migrate contact persons, categories queries
- Update customer selection components
Files to update:
backend/routes/customers.js(if exists)frontend/src/api/customersAPI.js- Customer selection components
Offers API
- Migrate offers queries
- Migrate offer lines, statuses, types queries
- Update quote/offer components
Products API
- Migrate products queries
- Migrate materials, suppliers queries
- Update material selection components
2.2 Supporting Queries (Medium Priority)
- Invoices (sales, creditor, drafts)
- Finance agreements and contracts
- Services and installations
- Hours and time tracking
- Documentation and files
2.3 Configuration Queries (Low Priority)
- Settings and preferences
- VAT types, payment terms
- Discount groups, hour types
- User and department data
Phase 3: Safe Mutations (Week 2)
Integrate safe mutations that don't modify critical data:
markMessageAsRead- Mark notifications as read (idempotent)setNamedPreference- User preferences (safe)sendCaseViaEmail- Send notifications (with confirmation)sendOfferViaEmail- Send offers (with confirmation)approveScheme- Approve schemes (with validation)
Safety measures:
- ✅ All operations are idempotent or have user confirmation
- ✅ No data deletion or modification of critical records
- ✅ Easy rollback if needed
Files to update:
- Backend mutation services
- Frontend action handlers
- Add confirmation dialogs for email sends
Phase 4: Update Mutations (Week 3)
⚠️ REQUIRES TEST ENVIRONMENT FIRST
Integrate update mutations with proper validation:
4.1 Test Environment Setup
- Create test database snapshot
- Set up staging environment with test GraphQL endpoint
- Implement rollback procedures
- Create audit logging for all mutations
4.2 Core Update Mutations
updateCase- Update case detailsupdateCustomer- Update customer informationupdateOffer- Update offer detailsupdateProduct- Update product informationupdateInvoice- Update invoice data
Safety requirements:
- ✅ Input validation on backend
- ✅ User authentication/authorization
- ✅ Audit trail of all changes
- ✅ Rollback capability
- ✅ Test in staging before production
Phase 5: Create/Delete Operations (Week 4+)
🔴 HIGH RISK - IMPLEMENT LAST
Critical requirements before implementation:
- ✅ Test environment mandatory
- ✅ Rollback procedures documented and tested
- ✅ User confirmation dialogs for all operations
- ✅ Audit logging with user tracking
- ✅ Database backup before execution
- ✅ Soft delete implementation (mark as deleted, don't remove)
5.1 Create Mutations
createCase- Create new casescreateCustomer- Create new customerscreateOffer- Create new offerscreateProduct- Create new productscreateInvoice- Create new invoices
5.2 Delete Mutations (LAST)
- Implement soft delete strategy
deleteCase→archiveCase(soft delete)deleteCustomer→anonymizeCustomer(GDPR compliant)- Add restore functionality
- Add bulk operations with careful validation
Code Examples
GraphQL Query Integration
Before (REST API):
// frontend/src/api/customerProjectsAPI.js
export const getProjects = async (page = 1, limit = 20) => {
const response = await fetch(`/api/customer-projects?page=${page}&limit=${limit}`);
return response.json();
};
After (GraphQL):
// frontend/src/api/customerProjectsAPI.js
import { request } from '../utils/graphqlClient';
export const getProjects = async (page = 1, limit = 20) => {
const query = `
query GetCases($pagination: Pagination) {
cases(pagination: $pagination) {
items {
id
caseNumber
customer { id name }
status { id name }
createdAt
}
totalCount
}
}
`;
const data = await request(query, {
pagination: { page, limit }
});
return data.cases;
};
GraphQL Mutation Integration
Before (REST API):
export const updateProject = async (projectId, projectData) => {
const response = await fetch(`/api/customer-projects/${projectId}`, {
method: 'PUT',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify(projectData)
});
return response.json();
};
After (GraphQL):
export const updateProject = async (caseId, caseInput) => {
const mutation = `
mutation UpdateCase($id: Int!, $input: CaseInput!) {
updateCase(id: $id, input: $input) {
id
caseNumber
updatedAt
}
}
`;
const data = await request(mutation, {
id: parseInt(caseId),
input: caseInput
});
return data.updateCase;
};
Files That Need Migration
Backend Files
backend/routes/customerProjects.js- All case/project endpointsbackend/routes/customers.js- Customer endpoints (if exists)backend/routes/offers.js- Offer endpoints (if exists)backend/routes/products.js- Product endpoints (if exists)backend/services/*Service.js- All service files that call v2 API
Frontend Files
frontend/src/api/customerProjectsAPI.jsfrontend/src/api/customersAPI.jsfrontend/src/api/offersAPI.jsfrontend/src/api/productsAPI.js- All components that directly call API functions
Configuration Files
.env- Add GraphQL endpoint and API key.env.example- Document required env varsREADME.md- Update API documentation- Deployment scripts - Include new env vars
Testing Strategy
1. Query Testing (Safe)
✅ All 255 queries already tested in production
✅ 144 output files available as test fixtures
✅ Can integrate immediately
Test approach:
- Create test suite using output files as expected results
- Run GraphQL queries and compare with v2 API responses
- Validate data structure matches frontend expectations
- Check pagination, filtering, sorting
2. Mutation Testing (Requires Staging)
Test environment setup:
- Clone production database to staging
- Point staging app to test GraphQL endpoint
- Test all mutations with dummy data
- Validate rollback procedures
Test checklist:
- Test create operations
- Test update operations
- Test delete operations (soft delete)
- Test bulk operations
- Test error handling
- Test validation
- Test rollback procedures
3. Integration Testing
- Test complete user workflows (create → update → delete)
- Test concurrent operations
- Test error scenarios (network failures, timeouts)
- Test authentication failures
- Test rate limiting
- Performance testing (compare with v2 API)
Rollback Plan
If migration fails or introduces bugs:
-
Immediate Rollback (< 5 minutes)
- Keep v2 API endpoints active during migration
- Use feature flags to toggle between v2/GraphQL
- Can switch back via environment variable
-
Gradual Migration
- Migrate one feature at a time
- Keep both APIs running in parallel
- Monitor error rates and performance
- Roll back individual features if needed
-
Data Rollback
- Database snapshots before write operations
- Audit log for all mutations
- Restore procedures documented and tested
Performance Considerations
Optimization Strategies
- Use pagination for large datasets (default: 20 items per page)
- Implement caching for frequently accessed data
- Use GraphQL field selection (only request needed fields)
- Batch operations where possible (bulkUpdate* mutations)
- Monitor API rate limits and implement throttling
Monitoring
- Track API response times
- Monitor error rates
- Alert on rate limit approaches
- Log slow queries (> 1 second)
Security Checklist
- API key stored in environment variables (never in code)
- Backend validates all user input
- HTTPS only for API communication
- Implement user authentication/authorization
- Rate limiting on backend
- Audit logging for mutations
- User confirmation for dangerous operations
- SQL injection prevention (parameterized queries)
- XSS prevention (input sanitization)
Resources
Documentation
- Main Guide:
apitest/API_INTEGRATION_GUIDE.md - Scripts Location:
/home/w34078/scripts/apitest/examples/ - Output Examples:
/home/w34078/scripts/apitest/examples/output/ - GraphQL Endpoint:
https://graphql.ordrestyring.dk/graphql - API Key: Stored in environment variables
Available Scripts by Category
Safe Queries (255 scripts)
curl_cases.sh,curl_customers.sh,curl_offers.sh,curl_products.shcurl_invoices.sh,curl_users.sh,curl_departments.sh- See
API_INTEGRATION_GUIDE.mdfor complete list
Safe Mutations (24 scripts)
mutation_mark_message_as_read.shmutation_set_named_preference.shmutation_send_*_via_email.sh(7 scripts)mutation_approve_scheme.sh
Update Mutations (78 scripts)
mutation_update_case.shmutation_update_customer.shmutation_update_offer.sh- See
BATCHES_14_15_SUMMARY.md
Create/Delete Mutations (208 scripts)
mutation_create_*.sh(75 scripts)mutation_delete_*.sh(59 scripts)- See
BATCHES_16_22_SUMMARY.md
Progress Tracking
Week 1
- Backend GraphQL client setup
- Environment configuration
- Core business queries migration (cases, customers)
- Test query integration
Week 2
- Remaining query migrations (offers, products, invoices)
- Configuration queries migration
- Safe mutations integration
- Frontend component updates
Week 3
- Test environment setup
- Update mutations integration
- Validation and error handling
- Audit logging implementation
Week 4+
- Create mutations (with caution)
- Soft delete implementation
- Final testing and validation
- Production deployment
- Monitor and optimize
Success Criteria
✅ All query endpoints migrated to GraphQL
✅ Zero data loss during migration
✅ Performance equal or better than v2 API
✅ Error rates < 0.1%
✅ All mutations properly validated
✅ Audit logging in place
✅ Rollback procedures tested
✅ Documentation updated
✅ Team trained on new API
Notes
- Current API key:
<ORDRESTYRING_API_TOKEN>(rotate after migration) - GraphQL endpoint:
https://graphql.ordrestyring.dk/graphql - 565/566 endpoints available (99.8% coverage)
- All scripts have
--helpdocumentation - 144 output examples available for testing
Next Steps
- Review this TODO with team
- Prioritize which endpoints to migrate first
- Set up GraphQL client in backend
- Start with safe query migrations
- Test thoroughly before production
- Monitor closely after deployment
Created: October 23, 2025
Last Updated: October 23, 2025
Assigned To: Development Team
Dependencies: API_INTEGRATION_GUIDE.md, apitest scripts
Related: ORDRESTYRING_DATABASE_SYSTEM.md