UNPKG

@tak-ps/node-tak

Version:

Lightweight JavaScript library for communicating with TAK Server

141 lines (121 loc) 4.22 kB
import { Type, Static } from '@sinclair/typebox'; import { TAKItem } from './types.js'; import type { MissionOptions } from './mission.js'; import Commands from '../commands.js'; import { GUIDMatch } from './mission.js'; export const MissionLog = Type.Object({ id: Type.String(), content: Type.String(), creatorUid: Type.String(), missionNames: Type.Array(Type.String()), servertime: Type.String(), dtg: Type.Optional(Type.String()), created: Type.String(), contentHashes: Type.Array(Type.Unknown()), keywords: Type.Array(Type.String()) }); export const CreateMissionLog = Type.Object({ content: Type.String(), creatorUid: Type.String(), contentHashes: Type.Optional(Type.Array(Type.Unknown())), keywords: Type.Optional(Type.Array(Type.String())) }); export const UpdateMissionLog = Type.Composite([ CreateMissionLog, Type.Object({ id: Type.String() })]); export const TAKItem_MissionLog = TAKItem(MissionLog); export default class MissionLogCommands extends Commands { schema = {} async cli(): Promise<object | string> { throw new Error('Unsupported Subcommand'); } #headers(opts?: Static<typeof MissionOptions>): object { if (opts && opts.token) { return { MissionAuthorization: `Bearer ${opts.token}` } } else { return {}; } } #isGUID(id: string): boolean { return GUIDMatch.test(id) } /** * Delete a log entry on a Mission Sync * * {@link https://docs.tak.gov/api/takserver/redoc#tag/mission-api/operation/deleteLogEntry TAK Server Docs}. */ async delete( log: string, opts?: Static<typeof MissionOptions> ): Promise<void> { const url = new URL(`/Marti/api/missions/logs/entries/${log}`, this.api.url); await this.api.fetch(url, { method: 'DELETE', headers: this.#headers(opts), }); return; } /** * Get a log entry on a Mission Sync * * {@link https://docs.tak.gov/api/takserver/redoc#tag/mission-api/operation/getOneLogEntry TAK Server Docs}. */ async get( id: string, ): Promise<Static<typeof TAKItem_MissionLog>> { const url = new URL(`/Marti/api/missions/logs/entries/${encodeURIComponent(id)}`, this.api.url); return await this.api.fetch(url); } /** * Create a log entry on a Mission Sync * * {@link https://docs.tak.gov/api/takserver/redoc#tag/mission-api/operation/postLogEntry TAK Server Docs}. */ async create( mission: string, body: Static<typeof CreateMissionLog>, opts?: Static<typeof MissionOptions> ): Promise<Static<typeof TAKItem_MissionLog>> { const url = new URL(`/Marti/api/missions/logs/entries`, this.api.url); if (this.#isGUID(mission)) { mission = (await this.api.Mission.get(mission, {}, opts)).name; } return await this.api.fetch(url, { method: 'POST', headers: this.#headers(opts), body: { content: body.content, creatorUid: body.creatorUid, keywords: body.keywords, missionNames: [ mission ], } }); } /** * Update a log entry on a Mission Sync * * {@link https://docs.tak.gov/api/takserver/redoc#tag/mission-api/operation/updateLogEntry TAK Server Docs}. */ async update( mission: string, body: Static<typeof UpdateMissionLog>, opts?: Static<typeof MissionOptions> ): Promise<Static<typeof TAKItem_MissionLog>> { const url = new URL(`/Marti/api/missions/logs/entries`, this.api.url); if (this.#isGUID(mission)) { mission = (await this.api.Mission.get(mission, {}, opts)).name; } return await this.api.fetch(url, { method: 'PUT', headers: this.#headers(opts), body: { content: body.content, creatorUid: body.creatorUid, keywords: body.keywords, missionNames: [ mission ], } }); } }