first commit

This commit is contained in:
2020-12-31 17:49:54 +01:00
commit 2240985aa1
120 changed files with 11574 additions and 0 deletions
+46
View File
@@ -0,0 +1,46 @@
import Amplify from "@aws-amplify/core";
import Auth from "@aws-amplify/auth";
import type {CognitoAccessToken, CognitoUser} from "amazon-cognito-identity-js";
Amplify.configure({
Auth: {
region: process.env.AWS_AMPLIFY_REGION,
userPoolId: process.env.AWS_AMPLIFY_USER_POOL_ID,
userPoolWebClientId: process.env.AWS_AMPLIFY_USER_POOL_WEB_CLIENT_ID,
},
});
export async function signIn(username: string, password: string): Promise<CognitoUser | null> {
const u = await Auth.signIn(username, password);
return u || null;
}
export async function signOut(): Promise<void> {
await Auth.signOut();
}
async function getAccessToken(): Promise<CognitoAccessToken | null> {
try {
const u = await Auth.currentSession();
if (!u || !u.isValid()) {
return null;
}
return u.getAccessToken();
} catch (e) {
return null;
}
}
export async function getJwt(): Promise<string> {
const token = await getAccessToken();
if (!token) {
throw new Error("unauthorized");
}
return token.getJwtToken();
}
export async function checkSession(): Promise<boolean> {
return !!(await getAccessToken());
}
+260
View File
@@ -0,0 +1,260 @@
import { getJwt } from "./amplify";
import type { GoalFilter, GoalInput, GoalResult, GoalUpdate } from "../models/goal";
import type { ProjectFilter, ProjectInput, ProjectResult, ProjectUpdate } from "../models/project";
import type { TaskInput, TaskResult, TaskUpdate } from "../models/task";
import type { LogFilter, LogInput, LogResult, LogUpdate } from "../models/log";
import type { GroupInput, GroupResult, GroupUpdate } from "../models/group";
import type { ItemInput, ItemResult, ItemUpdate } from "../models/item";
export class StufflogClient {
private root: string;
constructor(root: string) {
this.root = root;
}
async findGoal(id: string): Promise<GoalResult> {
const data = await this.fetch("GET", `/api/goal/${id}`);
return data.goal;
}
async listGoals({minTime, maxTime, includesTime}: GoalFilter): Promise<GoalResult[]> {
let queries = [];
if (minTime != null) {
queries.push(`minTime=${minTime.toISOString()}`);
}
if (maxTime != null) {
queries.push(`maxTime=${maxTime.toISOString()}`);
}
if (includesTime != null) {
queries.push(`includesTime=${includesTime.toISOString()}`);
}
const query = queries.length > 0 ? `?${queries.join("&")}` : "";
const data = await this.fetch("GET", `/api/goal/${query}`);
return data.goals;
}
async createGoal(input: GoalInput): Promise<GoalResult> {
const data = await this.fetch("POST", "/api/goal/", input);
return data.goal;
}
async updateGoal(id: string, update: GoalUpdate): Promise<GoalResult> {
const data = await this.fetch("PUT", `/api/goal/${id}`, update);
return data.goal;
}
async deleteGoal(id: string): Promise<GoalResult> {
const data = await this.fetch("DELETE", `/api/goal/${id}`);
return data.goal;
}
async findProject(id: string): Promise<ProjectResult> {
const data = await this.fetch("GET", `/api/project/${id}`);
return data.project;
}
async listProjects({active, expiring}: ProjectFilter): Promise<ProjectResult[]> {
let queries = [];
if (active != null) {
queries.push(`active=${active}`);
}
if (expiring != null) {
queries.push(`expiring=${expiring}`);
}
const query = queries.length > 0 ? `?${queries.join("&")}` : "";
const data = await this.fetch("GET", `/api/project/${query}`);
return data.projects;
}
async createProject(input: ProjectInput): Promise<ProjectResult> {
const data = await this.fetch("POST", "/api/project/", input);
return data.project;
}
async updateProject(id: string, update: ProjectUpdate): Promise<ProjectResult> {
const data = await this.fetch("PUT", `/api/project/${id}`, update);
return data.project;
}
async deleteProject(id: string): Promise<ProjectResult> {
const data = await this.fetch("DELETE", `/api/project/${id}`);
return data.project;
}
async findLog(id: string): Promise<LogResult> {
const data = await this.fetch("GET", `/api/log/${id}`);
return data.log;
}
async listLogs({minTime, maxTime}: LogFilter): Promise<LogResult[]> {
let queries = [];
if (minTime != null) {
queries.push(`minTime=${minTime.toISOString()}`);
}
if (maxTime != null) {
queries.push(`maxTime=${maxTime.toISOString()}`);
}
const query = queries.length > 0 ? `?${queries.join("&")}` : "";
const data = await this.fetch("GET", `/api/log/${query}`);
return data.logs;
}
async createLog(input: LogInput): Promise<LogResult> {
const data = await this.fetch("POST", "/api/log/", input);
return data.log;
}
async updateLog(id: string, update: LogUpdate): Promise<LogResult> {
const data = await this.fetch("PUT", `/api/log/${id}`, update);
return data.log;
}
async deleteLog(id: string): Promise<LogResult> {
const data = await this.fetch("DELETE", `/api/log/${id}`);
return data.log;
}
async findTask(id: string): Promise<TaskResult> {
const data = await this.fetch("GET", `/api/task/${id}`);
return data.task;
}
async listTasks(active?: boolean): Promise<TaskResult[]> {
let query = (active != null) ? `?active=${active}` : "";
const data = await this.fetch("GET", `/api/task/${query}`);
return data.tasks;
}
async createTask(input: TaskInput): Promise<TaskResult> {
const data = await this.fetch("POST", "/api/task/", input);
return data.task;
}
async updateTask(id: string, update: TaskUpdate): Promise<TaskResult> {
const data = await this.fetch("PUT", `/api/task/${id}`, update);
return data.task;
}
async deleteTask(id: string): Promise<TaskResult> {
const data = await this.fetch("DELETE", `/api/task/${id}`);
return data.task;
}
async findGroup(id: string): Promise<GroupResult> {
const data = await this.fetch("GET", `/api/group/${id}`);
return data.group;
}
async listGroups(): Promise<GroupResult[]> {
const data = await this.fetch("GET", "/api/group/");
return data.groups;
}
async createGroup(input: GroupInput): Promise<GroupResult> {
const data = await this.fetch("POST", "/api/group/", input);
return data.group;
}
async updateGroup(id: string, update: GroupUpdate): Promise<GroupResult> {
const data = await this.fetch("PUT", `/api/group/${id}`, update);
return data.group;
}
async deleteGroup(id: string): Promise<GroupResult> {
const data = await this.fetch("DELETE", `/api/group/${id}`);
return data.group;
}
async findItem(id: string): Promise<ItemResult> {
const data = await this.fetch("GET", `/api/item/${id}`);
return data.item;
}
async listItems(): Promise<ItemResult[]> {
const data = await this.fetch("GET", "/api/item/");
return data.projects;
}
async createItem(input: ItemInput): Promise<ItemResult> {
const data = await this.fetch("POST", "/api/item/", input);
return data.item;
}
async updateItem(id: string, update: ItemUpdate): Promise<ItemResult> {
const data = await this.fetch("PUT", `/api/item/${id}`, update);
return data.item;
}
async deleteItem(id: string): Promise<ItemResult> {
const data = await this.fetch("DELETE", `/api/item/${id}`);
return data.item;
}
async fetch(method: string, path: string, body?: object) {
const fullPath = this.root + path;
const req: RequestInit = {method, headers: {}}
if (body != null) {
const data = new Blob([JSON.stringify(body)])
req.headers["Content-Type"] = req;
req.headers["Content-Length"] = data.size;
req.body = data;
}
console.warn("AUTH SKIPPED, remember to change back in prod!")
req.headers["Authorization"] = `Bearer ${await getJwt()}`;
const res = await fetch(fullPath, req);
if (!res.ok) {
if ((res.headers.get("Content-Type") || "").includes("application/json")) {
const data = await res.json();
throw new StuffLogError(data.errorCode, data.errorMessage)
} else {
const text = await res.text();
throw new StuffLogError(res.status, text)
}
}
return res.json();
}
}
export class StuffLogError {
public code: number
public message: string
constructor(code: number, message: string) {
this.code = code;
this.message = message;
}
toString() {
return `Error ${this.code}: ${this.message}`;
}
}
const stuffLogClient = new StufflogClient("");
export default stuffLogClient