diff --git a/lib/www/client/source/src/lib/user/User.js b/lib/www/client/source/src/lib/user/User.js new file mode 100644 index 0000000..e97f21e --- /dev/null +++ b/lib/www/client/source/src/lib/user/User.js @@ -0,0 +1,97 @@ + +import { User as BaseUser } from '@dougal/user'; + +class User extends BaseUser { + + api // Instance of Vuex api method + dirty // Whether the values have changed since last saved + + constructor (data, client) { + super (data); + + if (client) { + this.api = client; + } else if (data instanceof User) { + this.api = data.api; + } + + this.dirty = false; + this.on("changed", () => this.dirty = true); + } + + static async fromAPI (api, id) { + if (id) { + const url = `/user/${id}`; + const res = await api([url]); + return new User(res, api); + } else { + const url = `/user`; + const res = await api([url]); + return res?.map( row => new User(row, api) ); + } + } + + /** Save this user to the server + * + * If this is a new user, the `api` parameter must be + * supplied and this will result in a `POST` request. + * For an existing user coming from the database, + * `this.api` will be used for a `PUT` request. + */ + async save (api) { + if (this.api) { + const url = `/user/${this.id}`; + const init = { + headers: { + "Content-Type": "application/json" + }, + method: "PUT", + body: this.toJSON() + }; + const res = await this.api([url, init]); + if (res) { + this.dirty = false; + return new User(res, this.api); + } else { + // Something has gone wrong + console.log("Something has gone wrong (PUT)"); + } + } else if (api) { + const url = `/user`; + const init = { + headers: { + "Content-Type": "application/json" + }, + method: "POST", + body: this.toJSON() + } + const res = await api([url, init]); + if (res) { + return new User(res, api); + } else { + // Something has gone wrong + console.log("Something has gone wrong (POST)"); + } + } else { + throw new Error("Don't know how to save this user"); + } + } + + /** Delete this user from the server + */ + async remove () { + const url = `/user/${this.id}`; + const init = { + headers: { + "Content-Type": "application/json" + }, + method: "PUT", + body: this.toJSON() + }; + const res = await this.api([url, init]); + console.log("remove RES", res); + } + +} + +export default User;