From 62eaf2ec2ac9951a7d27188752f047087af5a9dd Mon Sep 17 00:00:00 2001 From: Jonathan Bernard Date: Sun, 24 Feb 2019 06:56:39 -0700 Subject: [PATCH] Add Personal Management API client implementation. --- web/src/models/api-token.ts | 6 + web/src/models/index.ts | 6 + web/src/models/measure.ts | 12 ++ web/src/models/measurement.ts | 7 ++ web/src/models/user.ts | 7 ++ web/src/services/pm-api-client.ts | 175 ++++++++++++++++++++++++++++++ 6 files changed, 213 insertions(+) create mode 100644 web/src/models/api-token.ts create mode 100644 web/src/models/index.ts create mode 100644 web/src/models/measure.ts create mode 100644 web/src/models/measurement.ts create mode 100644 web/src/models/user.ts create mode 100644 web/src/services/pm-api-client.ts diff --git a/web/src/models/api-token.ts b/web/src/models/api-token.ts new file mode 100644 index 0000000..ee81377 --- /dev/null +++ b/web/src/models/api-token.ts @@ -0,0 +1,6 @@ +export default interface ApiToken { + id: string; + userId: string; + name: string; + value?: string; +} diff --git a/web/src/models/index.ts b/web/src/models/index.ts new file mode 100644 index 0000000..8720cfd --- /dev/null +++ b/web/src/models/index.ts @@ -0,0 +1,6 @@ +import ApiToken from './api-token'; +import Measure from './measure'; +import Measurement from './measurement'; +import User from './user'; + +export { ApiToken, Measure, Measurement, User }; diff --git a/web/src/models/measure.ts b/web/src/models/measure.ts new file mode 100644 index 0000000..1eb36de --- /dev/null +++ b/web/src/models/measure.ts @@ -0,0 +1,12 @@ +export default interface Measure { + id: string; + userId: string; + slug: string; + name: string; + description: string; + domainSource?: string; + domainUnites: string; + rangeSource?: string; + rangeUnits: string; + analysis: string[]; +} diff --git a/web/src/models/measurement.ts b/web/src/models/measurement.ts new file mode 100644 index 0000000..75c5122 --- /dev/null +++ b/web/src/models/measurement.ts @@ -0,0 +1,7 @@ +export default interface Measurement { + id: string; + measureId: string; + value: number; + timestamp: Date; + extData: object; +} diff --git a/web/src/models/user.ts b/web/src/models/user.ts new file mode 100644 index 0000000..2cd513d --- /dev/null +++ b/web/src/models/user.ts @@ -0,0 +1,7 @@ +export default interface User { + id: string; + displayName: string; + email: string; + isAdmin: boolean; + authToken?: string; +} diff --git a/web/src/services/pm-api-client.ts b/web/src/services/pm-api-client.ts new file mode 100644 index 0000000..94b0286 --- /dev/null +++ b/web/src/services/pm-api-client.ts @@ -0,0 +1,175 @@ +import { default as Axios, AxiosInstance } from 'axios'; +import { ApiToken, Measure, Measurement, User } from '@/models'; +import merge from 'lodash.merge'; + +export class PmApiClient { + private http: AxiosInstance; + + constructor(apiBase: string) { + this.http = Axios.create({ + baseURL: apiBase + /* + headers: { + post: { + 'Content-Type': 'application/json' + } + } + */ + }); + } + + public version(): Promise { + return this.http + .get('/version') + .then((resp) => resp.data); + } + + public createAuthToken(email: string, password: string): Promise { + return this.http + .post('/auth-token', { email, password }) + .then((resp) => resp.data); + } + + public getUser(authToken: string): Promise { + return this.http + .get('/user', { headers: { Authorization: 'Bearer ' + authToken }}) + .then((resp) => return merge(resp.data, { authToken }); ); + } + + public getAllUsers(user: User): Promise { + return this.http + .get('/users', { headers: this.authHeader(user) }) + .then((resp) => resp.data); + } + + public getUserById(curUser: User, reqUserId: string): Promise { + return this.http + .get(`/users/${reqUserId}`, { headers: this.authHeader(curUser) }) + .then((resp) => resp.data); + } + + public createUser(curUser: User, newUser: User): Promise { + return this.http + .post('/users', newUser, { headers: this.authHeader(curUser) }) + .then((resp) => resp.data); + } + + public deleteUser(curUser: User, toDeleteUserId: string): Promise { + return this.http + .delete(`/users/${toDeleteUserId}`, { headers: this.authHeader(curUser) }) + .then((resp) => true); + } + + public changePwd(user: User, oldPassword: string, newPassword: string): Promise { + return this.http + .post( + '/change-pwd', + { oldPassword, newPassword }, + { headers: this.authHeader(user) }) + .then((resp) => true); + } + + public changePwdForUser(user: User, forUserId: string, newPassword: string): Promise { + return this.http + .post( + `/change-pwd/${forUserId}`, + { newPassword }, + { headers: this.authHeader(user) }) + .then((resp) => true); + } + + public createApiToken(user: User, token: ApiToken): Promise { + return this.http + .post(`/api-tokens`, token, { headers: this.authHeader(user) }) + .then((resp) => resp.data); + } + + public getAllApiTokens(user: User): Promise { + return this.http + .get('/api-tokens', { headers: this.authHeader(user) }) + .then((resp) => resp.data); + } + + public getApiToken(user: User, tokenId: string): Promise { + return this.http + .get(`/api-tokens/${tokenId}`, { headers: this.authHeader(user) }) + .then((resp) => resp.data); + } + + public deleteApiToken(user: User, tokenId: string): Promise { + return this.http + .delete(`/api-tokens/${tokenId}`, { headers: this.authHeader(user) }) + .then((resp) => true); + } + + public getAllMeasures(user: User): Promise { + return this.http + .get(`/measures`, { headers: this.authHeader(user) }) + .then((resp) => resp.data); + } + + public createMeasure(user: User, measure: Measure): Promise { + return this.http + .post(`/measures`, measure, { headers: this.authHeader(user) }) + .then((resp) => resp.data); + } + + public getMeasure(user: User, slug: string): Promise { + return this.http + .get(`/measures/${slug}`, { headers: this.authHeader(user) }) + .then((resp) => resp.data); + } + + public deleteMeasure(user: User, slug: string): Promise { + return this.http + .delete(`/measures/${slug}`, { headers: this.authHeader(user) }) + .then((resp) => true); + } + + public getMeasurements(user: User, measureSlug: string): + Promise { + + return this.http + .get(`/measure/${measureSlug}`, { headers: this.authHeader(user) }) + .then((resp) => resp.data); + } + + public createMeasurement(user: User, measureSlug: string, + measurement: Measurement): Promise { + return this.http + .post(`/measure/${measureSlug}`, + measurement, + { headers: this.authHeader(user) }) + .then((resp) => resp.data); + } + + public getMeasurement(user: User, measureSlug: string, measurementId: string): + Promise { + + return this.http + .get(`/measure/${measureSlug}/${measurementId}`, + { headers: this.authHeader(user) }) + .then((resp) => resp.data); + } + + public updateMeasurement(user: User, measureSlug: string, + measurement: Measurement): Promise { + return this.http + .put(`/measure/${measureSlug}/${measurement.id}`, + measurement, + { headers: this.authHeader(user) }) + .then((resp) => resp.data) ; + } + + public deleteMeasurement(user: User, measureSlug: string, measurementId: string): Promise { + return this.http + .delete(`/measure/${measureSlug}/${measurementId}`, + {headers: this.authHeader(user) }) + .then((resp) => true); + } + + + + private authHeader(user: User): { [key: string]: string } { + return { Authorization: 'Bearer ' + user.authToken }; +}