From c040a5077a1a363297e4db1f295b74e413ce43fd Mon Sep 17 00:00:00 2001 From: Robert Date: Wed, 14 Apr 2021 10:30:52 +0200 Subject: [PATCH] Register account with email and password --- .eslintrc.js | 1 + package-lock.json | 11 +++ package.json | 2 + src/api.ts | 68 +++++++++++++ src/components/LoginForm.vue | 15 ++- .../migrations/0003_auto_20210414_0827.py | 31 ++++++ userausfall/models.py | 98 ++++++++++++++++++- userausfall/rest_api/urls.py | 2 +- userausfall/settings.py | 1 + userausfall/urls.py | 3 +- vue.config.js | 13 +++ 11 files changed, 236 insertions(+), 9 deletions(-) create mode 100644 src/api.ts create mode 100644 userausfall/migrations/0003_auto_20210414_0827.py create mode 100644 vue.config.js diff --git a/.eslintrc.js b/.eslintrc.js index 95800e3..7324f13 100644 --- a/.eslintrc.js +++ b/.eslintrc.js @@ -16,5 +16,6 @@ module.exports = { rules: { "no-console": process.env.NODE_ENV === "production" ? "warn" : "off", "no-debugger": process.env.NODE_ENV === "production" ? "warn" : "off", + "@typescript-eslint/no-explicit-any": "off", }, }; diff --git a/package-lock.json b/package-lock.json index 1c69979..fa5fc60 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1300,6 +1300,12 @@ "@types/node": "*" } }, + "@types/js-cookie": { + "version": "2.2.6", + "resolved": "https://registry.npmjs.org/@types/js-cookie/-/js-cookie-2.2.6.tgz", + "integrity": "sha512-+oY0FDTO2GYKEV0YPvSshGq9t7YozVkgvXLty7zogQNuCxBhT9/3INX9Q7H1aRZ4SUDRXAKlJuA4EA5nTt7SNw==", + "dev": true + }, "@types/json-schema": { "version": "7.0.7", "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.7.tgz", @@ -7622,6 +7628,11 @@ } } }, + "js-cookie": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/js-cookie/-/js-cookie-2.2.1.tgz", + "integrity": "sha512-HvdH2LzI/EAZcUwA8+0nKNtWHqS+ZmijLA30RwZA0bo7ToCckjK5MkGhjED9KoRcXO6BaGI3I9UIzSA1FKFPOQ==" + }, "js-message": { "version": "1.0.7", "resolved": "https://registry.npmjs.org/js-message/-/js-message-1.0.7.tgz", diff --git a/package.json b/package.json index 79a7c10..fc6f90b 100644 --- a/package.json +++ b/package.json @@ -10,6 +10,7 @@ "dependencies": { "buefy": "^0.9.6", "core-js": "^3.6.5", + "js-cookie": "^2.2.1", "register-service-worker": "^1.7.1", "vue": "^2.6.11", "vue-class-component": "^7.2.3", @@ -17,6 +18,7 @@ "vue-router": "^3.2.0" }, "devDependencies": { + "@types/js-cookie": "^2.2.6", "@typescript-eslint/eslint-plugin": "^4.18.0", "@typescript-eslint/parser": "^4.18.0", "@vue/cli-plugin-babel": "~4.5.0", diff --git a/src/api.ts b/src/api.ts new file mode 100644 index 0000000..e23d953 --- /dev/null +++ b/src/api.ts @@ -0,0 +1,68 @@ +import Cookies from "js-cookie"; + +class APIError extends Error { + constructor(message: string, public readonly errors: unknown) { + super(message); + } +} + +class Model { + static async fetch( + method: "get" | "post", + endpoint: string, + item_callback: (item: any) => any + ) { + const init = { + headers: new Headers(), + method: method, + //body: JSON.stringify({}) + }; + const csrfToken = Cookies.get("csrftoken"); + if (csrfToken != undefined) { + init.headers.set("X-CSRFToken", csrfToken); + } + init.headers.set("Accept", "application/json"); + init.headers.set("Content-Type", "application/json"); + const response = await fetch(`/api/${endpoint}`, init); + const dataOrErrors: Array = await response.json(); + if (response.status === 200) { + return dataOrErrors.map(item_callback); + } else { + throw new APIError(response.statusText, dataOrErrors); + } + } + + protected async create(endpoint: string, data: any) { + const init = { + headers: new Headers(), + method: "post", + body: JSON.stringify(data), + }; + const csrfToken = Cookies.get("csrftoken"); + if (csrfToken != undefined) { + init.headers.set("X-CSRFToken", csrfToken); + } + init.headers.set("Accept", "application/json"); + init.headers.set("Content-Type", "application/json"); + const response = await fetch(`/api/${endpoint}/`, init); + const dataOrErrors: Array = await response.json(); + if (response.status !== 201) { + throw new APIError(response.statusText, dataOrErrors); + } + } +} + +interface UserData { + email: string; + password: string; +} + +export class User extends Model implements UserData { + constructor(public email: string, public password: string) { + super(); + } + + async signup(): Promise { + await super.create("users", { email: this.email, password: this.password }); + } +} diff --git a/src/components/LoginForm.vue b/src/components/LoginForm.vue index b750f6d..d1d2d3d 100644 --- a/src/components/LoginForm.vue +++ b/src/components/LoginForm.vue @@ -1,10 +1,10 @@