216 lines
3.2 KiB
Markdown
216 lines
3.2 KiB
Markdown
|
|
# Sankofa Phoenix API Contracts
|
||
|
|
|
||
|
|
This document defines the GraphQL API contracts for the Sankofa Phoenix platform. This serves as the contract between frontend and backend teams during parallel development.
|
||
|
|
|
||
|
|
**Last Updated**: 2024
|
||
|
|
**Version**: 1.0.0
|
||
|
|
|
||
|
|
## GraphQL Endpoint
|
||
|
|
|
||
|
|
- **Development**: `http://localhost:4000/graphql`
|
||
|
|
- **Production**: `https://api.sankofa.nexus/graphql`
|
||
|
|
|
||
|
|
## Authentication
|
||
|
|
|
||
|
|
All queries and mutations (except `login`) require authentication via JWT token:
|
||
|
|
|
||
|
|
```http
|
||
|
|
Authorization: Bearer <token>
|
||
|
|
```
|
||
|
|
|
||
|
|
## Core Types
|
||
|
|
|
||
|
|
### Resource
|
||
|
|
|
||
|
|
```graphql
|
||
|
|
type Resource {
|
||
|
|
id: ID!
|
||
|
|
name: String!
|
||
|
|
type: ResourceType!
|
||
|
|
status: ResourceStatus!
|
||
|
|
site: Site!
|
||
|
|
metadata: JSON
|
||
|
|
createdAt: DateTime!
|
||
|
|
updatedAt: DateTime!
|
||
|
|
}
|
||
|
|
```
|
||
|
|
|
||
|
|
### Site
|
||
|
|
|
||
|
|
```graphql
|
||
|
|
type Site {
|
||
|
|
id: ID!
|
||
|
|
name: String!
|
||
|
|
region: String!
|
||
|
|
status: SiteStatus!
|
||
|
|
resources: [Resource!]!
|
||
|
|
createdAt: DateTime!
|
||
|
|
updatedAt: DateTime!
|
||
|
|
}
|
||
|
|
```
|
||
|
|
|
||
|
|
### ResourceInventoryItem
|
||
|
|
|
||
|
|
```graphql
|
||
|
|
type ResourceInventoryItem {
|
||
|
|
id: ID!
|
||
|
|
resourceType: String!
|
||
|
|
provider: ResourceProvider!
|
||
|
|
providerId: String!
|
||
|
|
providerResourceId: String
|
||
|
|
name: String!
|
||
|
|
region: String
|
||
|
|
site: Site
|
||
|
|
metadata: JSON
|
||
|
|
tags: [String!]!
|
||
|
|
discoveredAt: DateTime!
|
||
|
|
lastSyncedAt: DateTime!
|
||
|
|
createdAt: DateTime!
|
||
|
|
updatedAt: DateTime!
|
||
|
|
}
|
||
|
|
```
|
||
|
|
|
||
|
|
## Queries
|
||
|
|
|
||
|
|
### Get Resources
|
||
|
|
|
||
|
|
```graphql
|
||
|
|
query GetResources($filter: ResourceFilter) {
|
||
|
|
resources(filter: $filter) {
|
||
|
|
id
|
||
|
|
name
|
||
|
|
type
|
||
|
|
status
|
||
|
|
site {
|
||
|
|
id
|
||
|
|
name
|
||
|
|
region
|
||
|
|
}
|
||
|
|
createdAt
|
||
|
|
updatedAt
|
||
|
|
}
|
||
|
|
}
|
||
|
|
```
|
||
|
|
|
||
|
|
### Get Resource Inventory
|
||
|
|
|
||
|
|
```graphql
|
||
|
|
query GetResourceInventory($filter: ResourceInventoryFilter) {
|
||
|
|
resourceInventory(filter: $filter) {
|
||
|
|
id
|
||
|
|
name
|
||
|
|
resourceType
|
||
|
|
provider
|
||
|
|
region
|
||
|
|
tags
|
||
|
|
metadata
|
||
|
|
lastSyncedAt
|
||
|
|
}
|
||
|
|
}
|
||
|
|
```
|
||
|
|
|
||
|
|
### Get Sites
|
||
|
|
|
||
|
|
```graphql
|
||
|
|
query GetSites {
|
||
|
|
sites {
|
||
|
|
id
|
||
|
|
name
|
||
|
|
region
|
||
|
|
status
|
||
|
|
resources {
|
||
|
|
id
|
||
|
|
name
|
||
|
|
type
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
```
|
||
|
|
|
||
|
|
## Mutations
|
||
|
|
|
||
|
|
### Login
|
||
|
|
|
||
|
|
```graphql
|
||
|
|
mutation Login($email: String!, $password: String!) {
|
||
|
|
login(email: $email, password: $password) {
|
||
|
|
token
|
||
|
|
user {
|
||
|
|
id
|
||
|
|
email
|
||
|
|
name
|
||
|
|
role
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
```
|
||
|
|
|
||
|
|
### Create Resource
|
||
|
|
|
||
|
|
```graphql
|
||
|
|
mutation CreateResource($input: CreateResourceInput!) {
|
||
|
|
createResource(input: $input) {
|
||
|
|
id
|
||
|
|
name
|
||
|
|
type
|
||
|
|
status
|
||
|
|
site {
|
||
|
|
id
|
||
|
|
name
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
```
|
||
|
|
|
||
|
|
## Subscriptions
|
||
|
|
|
||
|
|
### Resource Updates
|
||
|
|
|
||
|
|
```graphql
|
||
|
|
subscription ResourceUpdated($id: ID!) {
|
||
|
|
resourceUpdated(id: $id) {
|
||
|
|
id
|
||
|
|
name
|
||
|
|
status
|
||
|
|
updatedAt
|
||
|
|
}
|
||
|
|
}
|
||
|
|
```
|
||
|
|
|
||
|
|
## Error Codes
|
||
|
|
|
||
|
|
- `UNAUTHENTICATED`: Authentication required
|
||
|
|
- `FORBIDDEN`: Insufficient permissions
|
||
|
|
- `NOT_FOUND`: Resource not found
|
||
|
|
- `VALIDATION_ERROR`: Input validation failed
|
||
|
|
- `SERVER_ERROR`: Internal server error
|
||
|
|
|
||
|
|
## Rate Limiting
|
||
|
|
|
||
|
|
- 100 requests per minute per IP
|
||
|
|
- 1000 requests per hour per authenticated user
|
||
|
|
|
||
|
|
## Mock Data
|
||
|
|
|
||
|
|
For frontend development, use the following mock responses structure:
|
||
|
|
|
||
|
|
```typescript
|
||
|
|
// Mock Resource
|
||
|
|
{
|
||
|
|
id: "uuid",
|
||
|
|
name: "example-resource",
|
||
|
|
type: "VM",
|
||
|
|
status: "RUNNING",
|
||
|
|
site: {
|
||
|
|
id: "uuid",
|
||
|
|
name: "US East Primary",
|
||
|
|
region: "us-east-1"
|
||
|
|
},
|
||
|
|
createdAt: "2024-01-01T00:00:00Z",
|
||
|
|
updatedAt: "2024-01-01T00:00:00Z"
|
||
|
|
}
|
||
|
|
```
|
||
|
|
|
||
|
|
See [examples.md](./examples.md) for more detailed examples.
|
||
|
|
|