Welcome to the Strategize GraphQL & File-Storage API. Frontend teams, hereβs what you need:
POST /graphqlAuthorization: Bearer <JWT_TOKEN>Seeded Super-Admin on first run:
johndoe@email.comqwerty123Login Mutation
mutation Login($input: LoginEmployeeInput!) {
loginEmployee(loginInput: $input) {
accessToken
employee {
employeeId
fullName
email
role
}
}
}
Use the returned
accessTokenfor all subsequent requests.
query {
me {
employeeId
fullName
email
role
status
startDate
}
}
Each employees query now supports optional full-text search on fullName and email, plus pagination.
query Employees($search: String, $page: Int, $limit: Int) {
employees(search: $search, page: $page, limit: $limit) {
items {
employeeId
fullName
email
role
departments {
departmentId
name
}
}
meta {
totalItems
itemCount
itemsPerPage
totalPages
currentPage
}
}
}
mutation CreateEmployee($input: CreateEmployeeInput!) {
createEmployee(createEmployeeInput: $input) {
employeeId
fullName
email
role
}
}
mutation UpdateEmployee($input: UpdateEmployeeInput!) {
updateEmployee(updateEmployeeInput: $input) {
employeeId
fullName
email
role
}
}
mutation RemoveEmployee($id: ID!) {
removeEmployee(employeeId: $id) {
employeeId
fullName
}
}
query Divisions($search: String, $page: Int, $limit: Int) {
divisions(search: $search, page: $page, limit: $limit) {
items {
divisionId
name
manager {
employeeId
fullName
}
departments {
departmentId
name
}
}
meta {
totalItems
itemCount
itemsPerPage
totalPages
currentPage
}
}
}
mutation CreateDivision($input: CreateDivisionInput!) {
createDivision(createDivisionInput: $input) {
divisionId
name
}
}
mutation UpdateDivision($input: UpdateDivisionInput!) {
updateDivision(updateDivisionInput: $input) {
divisionId
name
}
}
mutation RemoveDivision($id: ID!) {
removeDivision(divisionId: $id) {
divisionId
name
}
}
query Departments($search: String, $page: Int, $limit: Int) {
departments(search: $search, page: $page, limit: $limit) {
items {
departmentId
name
manager {
employeeId
fullName
}
division {
divisionId
name
}
employees {
employeeId
fullName
}
}
meta {
totalItems
itemCount
itemsPerPage
totalPages
currentPage
}
}
}
mutation CreateDepartment($input: CreateDepartmentInput!) {
createDepartment(createDepartmentInput: $input) {
departmentId
name
}
}
mutation UpdateDepartment($input: UpdateDepartmentInput!) {
updateDepartment(updateDepartmentInput: $input) {
departmentId
name
}
}
mutation RemoveDepartment($id: ID!) {
removeDepartment(departmentId: $id) {
departmentId
name
}
}
mutation AddEmployeeToDept($deptId: ID!, $empId: ID!) {
addEmployeeToDepartment(departmentId: $deptId, employeeId: $empId) {
departmentId
name
employees {
employeeId
fullName
}
}
}
mutation RemoveEmployeeFromDept($deptId: ID!, $empId: ID!) {
removeEmployeeFromDepartment(departmentId: $deptId, employeeId: $empId) {
departmentId
name
employees {
employeeId
fullName
}
}
}
query StrategicPeriods($page: Int, $limit: Int) {
strategicPeriods(page: $page, limit: $limit) {
items {
strategicPeriodId
startDate
length
endDate
createdBy {
employeeId
fullName
}
}
meta {
totalItems
itemCount
itemsPerPage
totalPages
currentPage
}
}
}
mutation CreateStrategicPeriod($input: CreateStrategicPeriodInput!) {
createStrategicPeriod(createStrategicPeriodInput: $input) {
strategicPeriodId
startDate
length
endDate
}
}
mutation UpdateStrategicPeriod($input: UpdateStrategicPeriodInput!) {
updateStrategicPeriod(updateStrategicPeriodInput: $input) {
strategicPeriodId
startDate
length
endDate
}
}
mutation RemoveStrategicPeriod($id: ID!) {
removeStrategicPeriod(strategicPeriodId: $id) {
strategicPeriodId
}
}
query Objectives($search: String, $page: Int, $limit: Int, $assigneeId: ID) {
objectives(
search: $search
page: $page
limit: $limit
assigneeId: $assigneeId
) {
items {
objectiveId
name
type
status
strategicPeriod {
strategicPeriodId
startDate
}
createdBy {
employeeId
fullName
}
assignee {
employeeId
fullName
}
assigner {
employeeId
fullName
}
parent {
objectiveId
name
}
kpis {
kpiId
name
status
parentId
assigneeId
}
}
meta {
totalItems
itemCount
itemsPerPage
totalPages
currentPage
}
}
}
mutation AssignObjective($input: AssignObjectiveInput!) {
assignObjective(assignObjectiveInput: $input) {
objectiveId
parent {
objectiveId
name
}
assignee {
employeeId
fullName
}
assigner {
employeeId
fullName
}
kpis {
kpiId
name
parentId
assigneeId
status
}
createdBy {
employeeId
fullName
}
}
}
AssignObjectiveInput{
"objectiveId": "<parentObjectiveId>",
"assigneeId": "<employeeId>",
"assignerId": "<managerId>",
"assigneeType": "INDIVIDUAL",
"kpis": ["<kpiId1>", "<kpiId2>"]
}
query Kpis($search: String, $page: Int, $limit: Int) {
kpis(search: $search, page: $page, limit: $limit) {
items {
kpiId
name
unitType
weight
status
baseline
targets {
timeline
target
}
objective {
objectiveId
}
}
meta {
totalItems
itemCount
itemsPerPage
totalPages
currentPage
}
}
}
mutation CreateKpi($input: CreateKpiInput!) {
createKpi(createKpiInput: $input) {
kpiId
name
status
}
}
mutation UpdateKpi($input: UpdateKpiInput!) {
updateKpi(updateKpiInput: $input) {
kpiId
name
status
}
}
mutation RemoveKpi($id: ID!) {
removeKpi(kpiId: $id) {
kpiId
}
}
You can update a single KPI's order or multiple KPIs at once.
mutation UpdateKpiOrder($input: UpdateKpiOrderInput!) {
updateKpiOrder(updateKpiOrderInput: $input) {
kpiId
name
order
}
}
UpdateKpiOrderInput (single){
"kpiId": "<kpiId>",
"order": 2
}
mutation UpdateMultipleKpiOrders($inputs: [UpdateKpiOrderInput!]!) {
updateKpiOrders(updateKpiOrderInputs: $inputs) {
kpiId
name
order
}
}
[
{
"kpiId": "<kpiId1>",
"order": 1
},
{
"kpiId": "<kpiId2>",
"order": 2
},
{
"kpiId": "<kpiId3>",
"order": 3
}
]
query Objectives($search: String, $page: Int, $limit: Int, $assigneeId: ID) {
objectives(
search: $search
page: $page
limit: $limit
assigneeId: $assigneeId
) {
items {
objectiveId
name
type
status
strategicPeriod {
strategicPeriodId
startDate
}
createdBy {
employeeId
fullName
}
assignee {
employeeId
fullName
}
assigner {
employeeId
fullName
}
parent {
objectiveId
name
}
kpis {
kpiId
name
status
parentId
assigneeId
}
}
meta {
totalItems
itemCount
itemsPerPage
totalPages
currentPage
}
}
}
mutation AssignObjective($input: AssignObjectiveInput!) {
assignObjective(assignObjectiveInput: $input) {
objectiveId
parent {
objectiveId
name
}
assignee {
employeeId
fullName
}
assigner {
employeeId
fullName
}
kpis {
kpiId
name
parentId
assigneeId
status
}
createdBy {
employeeId
fullName
}
}
}
AssignObjectiveInput{
"objectiveId": "<parentObjectiveId>",
"assigneeId": "<employeeId>",
"assignerId": "<managerId>",
"assigneeType": "INDIVIDUAL",
"kpis": ["<kpiId1>", "<kpiId2>"]
}
You can update a single objective's order or multiple objectives at once.
mutation UpdateObjectiveOrder($input: UpdateObjectiveOrderInput!) {
updateObjectiveOrder(updateObjectiveOrderInput: $input) {
objectiveId
name
order
}
}
UpdateObjectiveOrderInput (single){
"objectiveId": "<objectiveId>",
"order": 1
}
mutation UpdateMultipleObjectiveOrders($inputs: [UpdateObjectiveOrderInput!]!) {
updateObjectiveOrders(updateObjectiveOrderInputs: $inputs) {
objectiveId
name
order
}
}
[
{
"objectiveId": "<objectiveId1>",
"order": 1
},
{
"objectiveId": "<objectiveId2>",
"order": 2
},
{
"objectiveId": "<objectiveId3>",
"order": 3
}
]
Upload
POST /upload
Content-Type: multipart/form-data
Body: { file: <binary> }
β returns { url, filename, originalname, size, type }
Download
GET /storage/:filename
β streams the file back
query Submissions($page: Int, $limit: Int, $type: ObjectiveType!) {
submissions(page: $page, limit: $limit, type: $type) {
items {
submissionId
type
level
status
reason
submittedBy {
employeeId
fullName
}
objective {
objectiveId
name
}
kpi {
kpiId
name
}
createdAt
}
meta {
totalItems
itemCount
itemsPerPage
totalPages
currentPage
}
}
}
query Submission($id: ID!) {
submission(submissionId: $id) {
submissionId
type
level
status
reason
submittedBy {
fullName
}
objective {
name
}
kpi {
name
}
createdAt
}
}
mutation CreateSubmission($input: CreateSubmissionInput!) {
createSubmission(createSubmissionInput: $input) {
submissionId
type
level
status
reason
createdAt
}
}
CreateSubmissionInput{
"type": "OBJECTIVE",
"level": "INDIVIDUAL",
"itemId": "<objectiveId>",
"reason": "Completed milestone 1"
}
mutation CreateSubmissions($inputs: [CreateSubmissionInput!]!) {
createSubmissions(createSubmissionInputs: $inputs) {
submissionId
type
level
status
reason
createdAt
}
}
createSubmissionInputs array[
{
"type": "OBJECTIVE",
"level": "INDIVIDUAL",
"itemId": "<objectiveId>",
"reason": "Completed milestone 1"
},
{
"type": "KPI",
"level": "TEAM",
"itemId": "<kpiId>",
"reason": "Exceeded Q2 target"
}
]
mutation UpdateSubmission($input: UpdateSubmissionInput!) {
updateSubmission(updateSubmissionInput: $input) {
submissionId
status
reason
updatedAt
}
}
mutation RemoveSubmission($id: ID!) {
removeSubmission(submissionId: $id) {
submissionId
status
}
}
/readme in your browser for the HTML docs (dark mode)/readme.md for raw Markdown/api for Swagger, /graphql for PlaygroundHappy building! π