MapComplete/src/Logic/Maproulette.ts

Ignoring revisions in .git-blame-ignore-revs. Click here to bypass and see the normal blame view.

103 lines
3.3 KiB
TypeScript
Raw Normal View History

2023-10-06 03:34:26 +02:00
import Constants from "../Models/Constants"
2024-05-13 18:45:43 +02:00
export interface MaprouletteTask {
2024-06-16 16:06:26 +02:00
name: string
description: string
2024-05-13 18:45:43 +02:00
instruction: string
}
2022-07-13 08:03:09 +00:00
export default class Maproulette {
2023-10-06 03:34:26 +02:00
public static readonly defaultEndpoint = "https://maproulette.org/api/v2"
2023-10-05 22:40:57 +02:00
2023-10-06 03:34:26 +02:00
public static readonly STATUS_OPEN = 0
public static readonly STATUS_FIXED = 1
public static readonly STATUS_FALSE_POSITIVE = 2
public static readonly STATUS_SKIPPED = 3
public static readonly STATUS_DELETED = 4
public static readonly STATUS_ALREADY_FIXED = 5
public static readonly STATUS_TOO_HARD = 6
public static readonly STATUS_DISABLED = 9
public static readonly STATUS_MEANING = {
0: "Open",
1: "Fixed",
2024-01-26 18:19:45 +01:00
2: "False_positive",
3: "Skipped",
4: "Deleted",
5: "Already fixed",
2024-01-29 17:56:22 +01:00
6: "Too_Hard",
2023-10-06 03:34:26 +02:00
9: "Disabled",
}
public static singleton = new Maproulette()
/*
2022-07-13 08:03:09 +00:00
* The API endpoint to use
*/
2023-10-06 03:34:26 +02:00
endpoint: string
2022-07-13 08:03:09 +00:00
/**
* The API key to use for all requests
*/
2023-10-06 03:34:26 +02:00
private readonly apiKey: string
2022-07-13 08:03:09 +00:00
/**
* Creates a new Maproulette instance
* @param endpoint The API endpoint to use
*/
2023-10-05 22:40:57 +02:00
constructor(endpoint?: string) {
2023-10-06 03:34:26 +02:00
this.endpoint = endpoint ?? Maproulette.defaultEndpoint
if (!this.endpoint) {
2023-10-05 22:40:57 +02:00
throw "MapRoulette endpoint is undefined. Make sure that `Maproulette.defaultEndpoint` is defined on top of the class"
}
2023-10-06 03:34:26 +02:00
this.apiKey = Constants.MaprouletteApiKey
2023-10-05 22:40:57 +02:00
}
/**
* Converts a status text into the corresponding number
*
* Maproulette.codeToIndex("Created") // => 0
* Maproulette.codeToIndex("qdsf") // => undefined
*
*/
public static codeToIndex(code: string): number | undefined {
if (code === "Created") {
2023-10-06 03:34:26 +02:00
return Maproulette.STATUS_OPEN
2023-10-05 22:40:57 +02:00
}
for (let i = 0; i < 9; i++) {
if (Maproulette.STATUS_MEANING["" + i] === code) {
2023-10-06 03:34:26 +02:00
return i
2023-10-05 22:40:57 +02:00
}
}
2023-10-06 03:34:26 +02:00
return undefined
2022-07-13 08:03:09 +00:00
}
/**
* Close a task; might throw an error
*
* Also see:https://maproulette.org/docs/swagger-ui/index.html?url=/assets/swagger.json&docExpansion=none#/Task/setTaskStatus
2022-07-13 08:03:09 +00:00
* @param taskId The task to close
* @param status A number indicating the status. Use MapRoulette.STATUS_*
* @param options Additional settings to pass. Refer to the API-docs for more information
2022-07-13 08:03:09 +00:00
*/
async closeTask(
taskId: number,
status = Maproulette.STATUS_FIXED,
options?: {
comment?: string
tags?: string
requestReview?: boolean
completionResponses?: Record<string, string>
}
): Promise<void> {
2023-10-06 03:34:26 +02:00
console.log("Maproulette: setting", `${this.endpoint}/task/${taskId}/${status}`, options)
const response = await fetch(`${this.endpoint}/task/${taskId}/${status}`, {
2022-07-13 08:03:09 +00:00
method: "PUT",
headers: {
"Content-Type": "application/json",
2023-10-06 03:34:26 +02:00
apiKey: this.apiKey,
2022-07-13 08:03:09 +00:00
},
2023-10-06 03:34:26 +02:00
body: options !== undefined ? JSON.stringify(options) : undefined,
})
if (response.status !== 204) {
2023-10-06 03:34:26 +02:00
console.log(`Failed to close task: ${response.status}`)
throw `Failed to close task: ${response.status}`
2023-06-09 16:13:35 +02:00
}
}
2022-07-13 08:03:09 +00:00
}