Files
tilbudgivern/docs/api/ORDRESTYRING_API_INVENTORY.md
2026-08-13 14:29:15 +02:00

16 KiB

Ordrestyring API Inventory - Current Usage Analysis

Date: October 23, 2025
Purpose: Complete inventory of all Ordrestyring API endpoints currently in use
Status: 🔍 In Progress


Summary Statistics

  • Total Files Using Ordrestyring API: 10+ files
  • Backend Services: 3 (ordrestyringService, ordrestyringSyncService, enhancedOrderDataService)
  • Frontend Components: 2 (FinalReview, LaborInput)
  • API Routes: 1 (ordrestyring.js)
  • Test/Import Scripts: 5 (can be archived)
  • Main Server: 1 (unified-server.js - mixed usage)

1. Backend Services

1.1 ordrestyringService.js (PRIMARY SERVICE)

File: backend/src/services/ordrestyringService.js
Lines: 790 total
Status: 🟡 MIXED - Both REST and GraphQL implementations

REST v1 Endpoints (DEPRECATED)

  • this.restApiUrl = 'https://api.ordrestyring.dk'
  • Action: DELETE - No longer maintained

REST v2 Endpoints (TO BE REPLACED)

  • this.restApiV2Url = 'https://v2.api.ordrestyring.dk'
  • Used by: makeAPIRequest() method
  • Action: REPLACE with GraphQL

GraphQL Endpoints (PARTIALLY IMPLEMENTED)

  • this.graphqlApiUrl = 'https://beta7-api.ordrestyring.dk/graphql'
  • ⚠️ Issue: Using BETA endpoint, should be production
  • Has: makeGraphQLRequest() method
  • Action: UPDATE to production endpoint + expand usage

Methods Inventory

Need to analyze each method and categorize:

  • Line 30-60: makeAPIRequest() - REST v2 - REPLACE
  • Line 62-95: makeGraphQLRequest() - GraphQL - KEEP & ENHANCE
  • Lines 100+: Individual endpoint methods - TO BE ANALYZED

Priority: HIGH - This is the main service layer


1.2 ordrestyringSyncService.js

File: backend/src/services/ordrestyringSyncService.js
Status: 🔴 REST v2 ONLY

Configuration

  • Line 12: this.apiBaseUrl = 'https://v2.api.ordrestyring.dk'
  • Line 11: this.apiToken = process.env.ORDRESTYRING_API_TOKEN || '<ORDRESTYRING_API_TOKEN>'

Purpose

  • Data synchronization between systems
  • Likely has polling/webhook logic

Action Required:

  • Audit all methods
  • Find GraphQL equivalents
  • Consider merging into main ordrestyringService
  • DELETE if redundant

Priority: MEDIUM


1.3 enhancedOrderDataService.js

File: backend/src/services/enhancedOrderDataService.js
Status: 🔴 REST v2 ONLY

Configuration

  • Line 7: this.apiBase = 'https://v2.api.ordrestyring.dk'

Purpose

  • Enhanced order data retrieval
  • Additional data enrichment

Action Required:

  • Audit all methods
  • Check if functionality exists in GraphQL
  • Consider merging into main service
  • DELETE if redundant

Priority: MEDIUM


2. API Routes

2.1 ordrestyring.js

File: backend/routes/ordrestyring.js
Status: 🔴 LEGACY REST v1

Endpoints Found

DELETE Case (Line 344)
await axios.delete(`https://api.ordrestyring.dk/v1/cases/${caseNumber}`, {
  headers: { Authorization: `Bearer ${apiToken}` }
})
  • Purpose: Delete case by case number
  • Status: LEGACY v1 API
  • GraphQL Equivalent: mutation deleteCase($id: Int!)
  • Priority: HIGH - Delete operation needs careful handling
  • Action: REPLACE with GraphQL mutation + add safety checks
GET Cases (Line 404)
const ordrestyringSvar = await axios.get('https://api.ordrestyring.dk/v1/cases', {
  headers: { Authorization: `Bearer ${apiToken}` }
})
  • Purpose: Fetch all cases
  • Status: LEGACY v1 API
  • GraphQL Equivalent: query cases($pagination: Pagination)
  • Priority: HIGH - Core functionality
  • Action: REPLACE with GraphQL query

Priority: HIGH - Main API routes


3. Frontend Components

3.1 FinalReview.js

File: frontend/src/components/FinalReview.js
Line: 84
Status: 🔴 CRITICAL - NON-EXISTENT ENDPOINT

Current Implementation

const response = await fetch(`${apiBaseUrl}/api/ordrestyring/submit-quote`, {
  method: 'POST',
  headers: { 'Content-Type': 'application/json' },
  body: JSON.stringify(orderData)
});

Issues

  • ⚠️ Endpoint does NOT exist in backend
  • ⚠️ Returns error or fails silently
  • ⚠️ No offers created in Ordrestyring

Required Implementation

Backend Endpoint: /api/ordrestyring/offers/create

GraphQL Mutation: createOffer

Script Reference: apitest/examples/mutation_create_offer.sh

Data Mapping Required:

Frontend  GraphQL
{
  customer: { id, name, ... }  customerId
  materials: [...]  offerLines (with productId)
  labor: { tasks: [...] }  offerLines (with isLabor flag)
  totals: { ... }  calculated automatically
  quote: { validUntil, ... }  metadata
}

Priority: 🔴 CRITICAL - Core business functionality

Estimated Effort: 1-2 days

Dependencies:

  • GraphQL client setup
  • CREATE_OFFER_MUTATION definition
  • Input validation
  • Error handling

3.2 LaborInput.js

File: frontend/src/components/LaborInput.js
Lines: 87, 290
Status: 🟡 REST ENDPOINT

Current Implementation

// Line 87
const workBreakdownResponse = await fetch(
  `${apiBaseUrl}/api/ordrestyring/case/${caseNumber}/work-breakdown`
);

// Line 290
const response = await fetch(
  `${apiBaseUrl}/api/ordrestyring/case/${caseNumber}/work-breakdown`
);

Purpose

  • Fetch work breakdown for a case
  • Display hours, tasks, materials

GraphQL Equivalent

Query: case(id: $id) with nested fields:

query GetCaseWorkBreakdown($caseId: Int!) {
  case(id: $caseId) {
    id
    caseNumber
    caseActivities {
      id
      description
      hours
      employee { id name }
      hourType { id name rate }
    }
    caseMaterials {
      id
      product { id name }
      quantity
      unitPrice
      total
    }
  }
}

Script Reference: apitest/examples/curl_case_activities.sh, curl_case_materials.sh

Priority: MEDIUM

Estimated Effort: 4-6 hours


4. Unified Server (Main Server)

4.1 unified-server.js

File: unified-server.js
Status: 🟡 MIXED - Configuration + Active Endpoints

API Configuration (Lines 8314-8321)

v1: 'https://api.ordrestyring.dk',
v2: 'https://v2.api.ordrestyring.dk'
// ...
graphql: {
  endpoint: 'https://beta7-api.ordrestyring.dk/graphql',
  graphiql: 'https://beta7-api.ordrestyring.dk/graphiql'
}

Issues:

  • Still referencing deprecated v1
  • Still referencing v2 (to be replaced)
  • GraphQL uses BETA endpoint

Action: UPDATE configuration to production GraphQL only

Active Endpoints (Lines 9501-9519)

Calendar Endpoint (Line 9511)
axios.get(`https://v2.api.ordrestyring.dk/calendar?start=${start}&stop=${stop}...`)
  • GraphQL Equivalent: query calendar($start: String!, $stop: String!)
  • Script Reference: apitest/examples/curl_calendar.sh
  • Priority: HIGH - Used for calendar display
Hours Endpoint (Line 9515)
axios.get(`https://v2.api.ordrestyring.dk/hours?start_time-min=${start}...`)
  • GraphQL Equivalent: query hours($filter: HourFilter)
  • Script Reference: apitest/examples/curl_hours.sh
  • Priority: HIGH - Time tracking
Planned Time Endpoint (Line 9519)
axios.get(`https://v2.api.ordrestyring.dk/planned-time?time_start-min=${start}...`)
  • GraphQL Equivalent: query plannedTime($filter: PlannedTimeFilter)
  • Script Reference: apitest/examples/curl_planned_time.sh
  • Priority: HIGH - Schedule planning

Priority: HIGH - Main server endpoints


5. Test & Import Scripts (Archive Candidates)

5.1 test_ordrestyring_import.js

  • Line 9: const API_BASE = 'https://v2.api.ordrestyring.dk';
  • Purpose: Test import functionality
  • Action: ARCHIVE (no longer needed after GraphQL migration)

5.2 comprehensive_ordrestyring_import.js

  • Line 31: baseUrl: 'https://v2.api.ordrestyring.dk'
  • Purpose: Comprehensive data import
  • Action: ARCHIVE or UPDATE to GraphQL for ongoing use

5.3 ordrestyring_full_import.js

  • Line 31: baseUrl: 'https://api.ordrestyring.dk/v2'
  • Purpose: Full data import
  • Action: ARCHIVE

5.4 complete_import.js

  • Line 9: const API_BASE = 'https://v2.api.ordrestyring.dk';
  • Purpose: Complete import process
  • Action: ARCHIVE

5.5 test_all_calendar_sources.js

  • Line 4: const baseURL = 'https://v2.api.ordrestyring.dk';
  • Purpose: Test calendar data sources
  • Action: ARCHIVE or UPDATE for GraphQL testing

Priority: LOW - Can be archived once migration complete


6. Detailed Endpoint Migration Map

Priority 1: CRITICAL (Must Migrate First)

Current Endpoint File Line GraphQL Equivalent Script Reference Effort
POST /submit-quote FinalReview.js 84 createOffer mutation mutation_create_offer.sh 1-2 days
GET /cases ordrestyring.js 404 cases query curl_cases.sh 4 hours
DELETE /cases/:id ordrestyring.js 344 deleteCase mutation mutation_delete_case.sh 6 hours

Priority 2: HIGH (Core Functionality)

Current Endpoint File Line GraphQL Equivalent Script Reference Effort
GET /calendar unified-server.js 9511 calendar query curl_calendar.sh 4 hours
GET /hours unified-server.js 9515 hours query curl_hours.sh 4 hours
GET /planned-time unified-server.js 9519 plannedTime query curl_planned_time.sh 4 hours
GET /work-breakdown LaborInput.js 87, 290 case query (nested) curl_case_activities.sh 6 hours

Priority 3: MEDIUM (Service Layer)

Service File Status Action Effort
ordrestyringService ordrestyringService.js Mixed Refactor to GraphQL only 2 days
ordrestyringSyncService ordrestyringSyncService.js REST v2 Migrate or merge 1 day
enhancedOrderDataService enhancedOrderDataService.js REST v2 Migrate or merge 1 day

Priority 4: LOW (Cleanup)

Item Action Effort
Test scripts Archive to archive/ folder 1 hour
Legacy v1 config Remove from code 2 hours
REST v2 config Remove after migration 2 hours
Documentation Update with GraphQL 4 hours

7. GraphQL Queries/Mutations Available

From apitest folder: 565 scripts (99.8% API coverage)

Queries (255 scripts)

Most Relevant:

  • curl_cases.sh - List cases
  • curl_case_by_id.sh - Get case by ID
  • curl_case_activities.sh - Case activities
  • curl_case_materials.sh - Case materials
  • curl_calendar.sh - Calendar events
  • curl_hours.sh - Hours/time tracking
  • curl_planned_time.sh - Planned time
  • curl_offers.sh - List offers
  • curl_offer.sh - Get single offer
  • curl_customers.sh - List customers
  • curl_products.sh - List products

Mutations (310 scripts)

Most Relevant:

  • mutation_create_offer.sh - CREATE OFFER (CRITICAL!)
  • mutation_update_offer.sh - Update offer
  • mutation_delete_case.sh - Delete case
  • mutation_create_case.sh - Create case
  • mutation_update_case.sh - Update case
  • mutation_send_offer_via_email.sh - Send offer
  • mutation_mark_message_as_read.sh - Mark read

8. Authentication Analysis

Current Token

const apiToken = process.env.ORDRESTYRING_API_TOKEN || '<ORDRESTYRING_API_TOKEN>';

REST v2 Auth (Current)

auth: {
  username: apiToken,
  password: 'x'
}

GraphQL Auth (Current - BETA)

headers: {
  'Authorization': `Bearer ${apiToken}`
}

Issues Found

  • ⚠️ Hardcoded fallback token in code (security risk)
  • ⚠️ Using BETA GraphQL endpoint
  • ⚠️ Error messages suggest REST token ≠ GraphQL token

Action Required

  • Verify token works with production GraphQL: https://graphql.ordrestyring.dk/graphql
  • Request new GraphQL-specific token if needed
  • Remove hardcoded fallback token
  • Use environment variable only
  • Document token rotation procedure

9. Risk Assessment by Endpoint

High Risk (Data Modification)

Endpoint Risk Mitigation
createOffer Data corruption if mapping wrong Extensive testing, validation
deleteCase Accidental deletion Add confirmation, soft delete
updateCase Data overwrite Backup before update, validate

Medium Risk (Data Retrieval)

Endpoint Risk Mitigation
cases query Performance issues Pagination, caching
calendar query Missing data Fallback handling
hours query Incorrect calculations Unit tests

Low Risk (Read-Only)

Endpoint Risk Mitigation
List queries None Standard error handling
Get by ID 404 errors Graceful error messages

10. Next Steps

Immediate (This Week)

  1. Test GraphQL Authentication

    • Verify production endpoint: https://graphql.ordrestyring.dk/graphql
    • Test with current token
    • Request new token if needed
  2. Review createOffer Mutation

    • Study apitest/examples/mutation_create_offer.sh
    • Understand input format
    • Map FinalReview data to GraphQL input
  3. Setup GraphQL Client

    • Install graphql-request or @apollo/client
    • Create client configuration
    • Test connection

Short Term (Next Week)

  1. Implement createOffer Endpoint

    • Backend: /api/ordrestyring/offers/create
    • Frontend: Update FinalReview.js
    • Test thoroughly
  2. Migrate Calendar Endpoints

    • Replace REST with GraphQL in unified-server.js
    • Test calendar display
  3. Migrate Cases Endpoints

    • Replace in ordrestyring.js routes
    • Update error handling

Medium Term (Weeks 2-3)

  1. Refactor Services

    • Clean up ordrestyringService.js
    • Merge redundant services
    • Remove deprecated code
  2. Comprehensive Testing

    • Unit tests for all GraphQL calls
    • Integration tests
    • E2E tests

Long Term (Week 4+)

  1. Production Deployment

    • Staged rollout
    • Monitoring
    • Documentation
  2. Cleanup

    • Archive test scripts
    • Remove REST code
    • Update documentation

11. Questions & Blockers

Questions to Answer

  • What is the production GraphQL endpoint URL?
  • Does current token work with production GraphQL?
  • Are there any rate limits on GraphQL API?
  • What is the error response format for GraphQL?
  • Are there any breaking changes between beta and production?
  • Do we need separate tokens for staging/production?
  • What fields are required vs optional in createOffer?
  • How are errors returned for mutations?

🚧 Potential Blockers

  • GraphQL authentication might require new token
  • Production endpoint might not be available yet
  • Schema differences between beta and production
  • Missing required fields in current data structure
  • Performance issues with complex queries
  • Rate limiting on GraphQL API

12. Success Metrics

Code Quality

  • Zero REST v1 references
  • Zero REST v2 references
  • All services use GraphQL only
  • Test coverage > 80%

Functionality

  • FinalReview successfully creates offers
  • All queries return expected data
  • All mutations execute successfully
  • Error handling works properly

Performance

  • GraphQL response time < REST v2
  • No increase in error rates
  • Successful migration of all endpoints

Status: 🔍 In Progress
Next Update: After authentication testing
Owner: Development Team


Appendix: File Locations

Backend

  • backend/src/services/ordrestyringService.js
  • backend/src/services/ordrestyringSyncService.js
  • backend/src/services/enhancedOrderDataService.js
  • backend/routes/ordrestyring.js
  • unified-server.js

Frontend

  • frontend/src/components/FinalReview.js
  • frontend/src/components/LaborInput.js

Scripts (To Archive)

  • test_ordrestyring_import.js
  • comprehensive_ordrestyring_import.js
  • ordrestyring_full_import.js
  • complete_import.js
  • test_all_calendar_sources.js

GraphQL Resources

  • apitest/examples/ - 565 script files
  • apitest/API_INTEGRATION_GUIDE.md - Integration guide
  • apitest/outputs/ - Example responses