From ba162911d79ea25fd1ac6f0801af175288a0a43f Mon Sep 17 00:00:00 2001 From: Kyle Corbelli Date: Sun, 3 Sep 2017 17:20:23 -0700 Subject: [PATCH] Make registration more flexible --- dist/actions.js | 78 ++++++++++++++++++++++++++++++++------------- dist/actions.js.map | 2 +- dist/index.js.map | 2 +- dist/types.js.map | 2 +- package.json | 2 +- src/actions.ts | 67 +++++++++++++++++++++++++++++++------- src/types.ts | 7 ++-- 7 files changed, 120 insertions(+), 40 deletions(-) diff --git a/dist/actions.js b/dist/actions.js index 3fe4c8d..e666d2f 100644 --- a/dist/actions.js +++ b/dist/actions.js @@ -89,36 +89,70 @@ exports.signOutRequestFailed = function () { return ({ //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // Async Redux Thunk actions: //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -var generateAuthActions = function (authUrl) { +// what is the second argument here? it needs to contain configs for (1) userRegistrationDetails, (2) userAttributes, (3) maybe even the authUrl... just make it a simple one-argument function +// we'll also want the userAttributes to pertain to the end-user's initial state and heaven forbid reducers +// actually, userSignInCredentials, userSignOutCredentials, and verificationParams are always the same as per devise token auth +// const config = { +// authUrl: 'http://url.com', +// userAttributes: { +// firstName: 'name' // <- key is how the frontend knows it, value is how the backend knows it +// }, +// userRegistrationAttributes: { <- this is for keys/vals IN ADDITION TO email, password and passwordConfirmation +// firstName: 'name' +// }, +// } +// extract this service somewhere: +var invertHash = function (hash) { + var newHash = {}; + for (var key in hash) { + var val = hash[key]; + newHash[val] = key; + } + return newHash; +}; +var generateAuthActions = function (config) { + var authUrl = config.authUrl, userAttributes = config.userAttributes, userRegistrationAttributes = config.userRegistrationAttributes; var registerUser = function (userRegistrationDetails) { return function (dispatch) { return __awaiter(this, void 0, void 0, function () { - var firstName, email, password, passwordConfirmation, response, userAttributes, error_1; + var email, password, passwordConfirmation, data, response_1, invertedUserAttributes_1, userAttributesBackendKeys_1, userAttributesToSave_1, error_1; return __generator(this, function (_a) { switch (_a.label) { case 0: dispatch(exports.registrationRequestSent()); - firstName = userRegistrationDetails.firstName, email = userRegistrationDetails.email, password = userRegistrationDetails.password, passwordConfirmation = userRegistrationDetails.passwordConfirmation; + email = userRegistrationDetails.email, password = userRegistrationDetails.password, passwordConfirmation = userRegistrationDetails.passwordConfirmation; + data = { + email: email, + password: password, + password_confirmation: passwordConfirmation, + }; + Object.keys(userRegistrationAttributes).forEach(function (key) { + var backendKey = userRegistrationAttributes[key]; + data[backendKey] = userRegistrationDetails[key]; + }); _a.label = 1; case 1: _a.trys.push([1, 3, , 4]); return [4 /*yield*/, axios_1.default({ method: 'POST', url: authUrl, - data: { - email: email, - name: firstName, - password: password, - password_confirmation: passwordConfirmation, - }, + data: data, })]; case 2: - response = _a.sent(); - auth_1.setAuthHeaders(response.headers); - auth_1.persistAuthHeadersInLocalStorage(response.headers); - userAttributes = { - firstName: firstName, - }; - dispatch(exports.registrationRequestSucceeded(userAttributes)); + response_1 = _a.sent(); + auth_1.setAuthHeaders(response_1.headers); + // Have to check what type of platform it is, depending on the key provided by the end-user... like "browser", "iphone", or "android", etc.: + auth_1.persistAuthHeadersInLocalStorage(response_1.headers); + invertedUserAttributes_1 = invertHash(userAttributes); + userAttributesBackendKeys_1 = Object.keys(invertedUserAttributes_1); + userAttributesToSave_1 = {}; + Object.keys(response_1.data.data).forEach(function (key) { + if (userAttributesBackendKeys_1.indexOf(key) !== -1) { + userAttributesToSave_1[invertedUserAttributes_1[key]] = response_1.data.data[key]; + } + }); + console.log('userAttributesToSave'); + console.log(userAttributesToSave_1); + dispatch(exports.registrationRequestSucceeded(userAttributesToSave_1)); // <- need to make this reducer more flexible return [3 /*break*/, 4]; case 3: error_1 = _a.sent(); @@ -131,7 +165,7 @@ var generateAuthActions = function (authUrl) { }; }; var verifyToken = function (verificationParams) { return function (dispatch) { return __awaiter(this, void 0, void 0, function () { - var response, name_1, userAttributes, error_2; + var response, name_1, userAttributes_1, error_2; return __generator(this, function (_a) { switch (_a.label) { case 0: @@ -149,10 +183,10 @@ var generateAuthActions = function (authUrl) { name_1 = response.data.data.name; auth_1.setAuthHeaders(response.headers); auth_1.persistAuthHeadersInLocalStorage(response.headers); - userAttributes = { + userAttributes_1 = { firstName: name_1, }; - dispatch(exports.verifyTokenRequestSucceeded(userAttributes)); + dispatch(exports.verifyTokenRequestSucceeded(userAttributes_1)); return [3 /*break*/, 4]; case 3: error_2 = _a.sent(); @@ -165,7 +199,7 @@ var generateAuthActions = function (authUrl) { }; }; var signInUser = function (userSignInCredentials) { return function (dispatch) { return __awaiter(this, void 0, void 0, function () { - var email, password, response, name_2, userAttributes, error_3; + var email, password, response, name_2, userAttributes_2, error_3; return __generator(this, function (_a) { switch (_a.label) { case 0: @@ -187,10 +221,10 @@ var generateAuthActions = function (authUrl) { auth_1.setAuthHeaders(response.headers); auth_1.persistAuthHeadersInLocalStorage(response.headers); name_2 = response.data.data.name; - userAttributes = { + userAttributes_2 = { firstName: name_2, }; - dispatch(exports.signInRequestSucceeded(userAttributes)); + dispatch(exports.signInRequestSucceeded(userAttributes_2)); return [3 /*break*/, 4]; case 3: error_3 = _a.sent(); diff --git a/dist/actions.js.map b/dist/actions.js.map index 8599a2f..2824855 100644 --- a/dist/actions.js.map +++ b/dist/actions.js.map @@ -1 +1 @@ -{"version":3,"file":"actions.js","sourceRoot":"","sources":["../src/actions.ts"],"names":[],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"actions.js","sourceRoot":"","sources":["../src/actions.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/dist/index.js.map b/dist/index.js.map index f5da955..802e865 100644 --- a/dist/index.js.map +++ b/dist/index.js.map @@ -1 +1 @@ -{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;AAAA,qCAA2D;AAIzD,8CAJK,iBAAmC,CAIL;AAHrC,uCAA8C;AAI5C,gCAJK,kBAAqB,CAIL;AAGvB,wHAAwH;AACxH,sDAAsD;AACtD,wHAAwH;AAExH,WAAW;AACX,2BAA2B;AAC3B,4BAA4B;AAC5B,EAAE;AACF,wDAAwD;AACxD,2BAA2B;AAC3B,uBAAuB;AACvB,2BAA2B;AAC3B,IAAI;AACJ,UAAU;AACV,kBAAkB;AAClB,iBAAiB;AACjB,gBAAgB;AAChB,iBAAiB;AACjB,qDAAqD"} \ No newline at end of file +{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;AAAA,qCAA2C;AAIzC,8BAJK,iBAAmB,CAIL;AAHrB,uCAA8C;AAI5C,gCAJK,kBAAqB,CAIL;AAGvB,wHAAwH;AACxH,sDAAsD;AACtD,wHAAwH;AAExH,WAAW;AACX,2BAA2B;AAC3B,4BAA4B;AAC5B,EAAE;AACF,wDAAwD;AACxD,2BAA2B;AAC3B,uBAAuB;AACvB,2BAA2B;AAC3B,IAAI;AACJ,UAAU;AACV,kBAAkB;AAClB,iBAAiB;AACjB,gBAAgB;AAChB,iBAAiB;AACjB,qDAAqD"} \ No newline at end of file diff --git a/dist/types.js.map b/dist/types.js.map index ce5e017..ef645b1 100644 --- a/dist/types.js.map +++ b/dist/types.js.map @@ -1 +1 @@ -{"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":";;AAkCa,QAAA,yBAAyB,GAA8B,4CAA4C,CAAA;AAGnG,QAAA,8BAA8B,GAAmC,iDAAiD,CAAA;AAGlH,QAAA,2BAA2B,GAAgC,8CAA8C,CAAA;AAGzG,QAAA,yBAAyB,GAA8B,4CAA4C,CAAA;AAGnG,QAAA,8BAA8B,GAAmC,iDAAiD,CAAA;AAGlH,QAAA,2BAA2B,GAAgC,8CAA8C,CAAA;AAGzG,QAAA,mBAAmB,GAAwB,sCAAsC,CAAA;AAGjF,QAAA,wBAAwB,GAA6B,2CAA2C,CAAA;AAGhG,QAAA,qBAAqB,GAA0B,wCAAwC,CAAA;AAGvF,QAAA,oBAAoB,GAAyB,uCAAuC,CAAA;AAGpF,QAAA,yBAAyB,GAA8B,4CAA4C,CAAA;AAGnG,QAAA,sBAAsB,GAA2B,yCAAyC,CAAA"} \ No newline at end of file +{"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":";;AAqCa,QAAA,yBAAyB,GAA8B,4CAA4C,CAAA;AAGnG,QAAA,8BAA8B,GAAmC,iDAAiD,CAAA;AAGlH,QAAA,2BAA2B,GAAgC,8CAA8C,CAAA;AAGzG,QAAA,yBAAyB,GAA8B,4CAA4C,CAAA;AAGnG,QAAA,8BAA8B,GAAmC,iDAAiD,CAAA;AAGlH,QAAA,2BAA2B,GAAgC,8CAA8C,CAAA;AAGzG,QAAA,mBAAmB,GAAwB,sCAAsC,CAAA;AAGjF,QAAA,wBAAwB,GAA6B,2CAA2C,CAAA;AAGhG,QAAA,qBAAqB,GAA0B,wCAAwC,CAAA;AAGvF,QAAA,oBAAoB,GAAyB,uCAAuC,CAAA;AAGpF,QAAA,yBAAyB,GAA8B,4CAA4C,CAAA;AAGnG,QAAA,sBAAsB,GAA2B,yCAAyC,CAAA"} \ No newline at end of file diff --git a/package.json b/package.json index e09aa61..9df7db6 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "redux-token-auth", - "version": "0.4.0", + "version": "0.6.0", "description": "Redux actions and reducers to integrate with Devise Token Auth", "main": "dist/index.js", "types": "index.d.ts", diff --git a/src/actions.ts b/src/actions.ts index 8ae7cc6..962ac3c 100644 --- a/src/actions.ts +++ b/src/actions.ts @@ -105,35 +105,78 @@ export const signOutRequestFailed = (): SignOutRequestFailedAction => ({ // Async Redux Thunk actions: //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -const generateAuthActions = (authUrl: string): ActionsExport => { +// what is the second argument here? it needs to contain configs for (1) userRegistrationDetails, (2) userAttributes, (3) maybe even the authUrl... just make it a simple one-argument function +// we'll also want the userAttributes to pertain to the end-user's initial state and heaven forbid reducers +// actually, userSignInCredentials, userSignOutCredentials, and verificationParams are always the same as per devise token auth +// const config = { +// authUrl: 'http://url.com', +// userAttributes: { +// firstName: 'name' // <- key is how the frontend knows it, value is how the backend knows it +// }, +// userRegistrationAttributes: { <- this is for keys/vals IN ADDITION TO email, password and passwordConfirmation +// firstName: 'name' +// }, +// } + +// extract this service somewhere: +const invertHash = (hash: { [key: string]: any }) => { + const newHash = {} + for (let key in hash) { + const val = hash[key] + newHash[val] = key + } + return newHash +} + +const generateAuthActions = (config: { [key: string]: any }): ActionsExport => { + const { + authUrl, + userAttributes, + userRegistrationAttributes, + } = config + const registerUser = ( userRegistrationDetails: UserRegistrationDetails, ) => async function (dispatch: Dispatch<{}>): Promise { dispatch(registrationRequestSent()) const { - firstName, email, password, passwordConfirmation, } = userRegistrationDetails + const data = { + email, + password, + password_confirmation: passwordConfirmation, + } + Object.keys(userRegistrationAttributes).forEach((key: string) => { + const backendKey = userRegistrationAttributes[key] + data[backendKey] = userRegistrationDetails[key] + }) try { const response: AuthResponse = await axios({ method: 'POST', url: authUrl, - data: { - email, - name: firstName, // even this is tricky because it requires the user's devise configuration to allow the "name" attribute - password, - password_confirmation: passwordConfirmation, - }, + data, }) setAuthHeaders(response.headers) + // Have to check what type of platform it is, depending on the key provided by the end-user... like "browser", "iphone", or "android", etc.: persistAuthHeadersInLocalStorage(response.headers) // Gonna need to refer to the passed-in User model configuration from the package user - const userAttributes: UserAttributes = { - firstName, - } - dispatch(registrationRequestSucceeded(userAttributes)) + // const userAttributes: UserAttributes = { + // firstName, + // } + const invertedUserAttributes = invertHash(userAttributes) + const userAttributesBackendKeys = Object.keys(invertedUserAttributes) + const userAttributesToSave = {} + Object.keys(response.data.data).forEach((key: string) => { + if (userAttributesBackendKeys.indexOf(key) !== -1) { + userAttributesToSave[invertedUserAttributes[key]] = response.data.data[key] + } + }) + console.log('userAttributesToSave') + console.log(userAttributesToSave) + dispatch(registrationRequestSucceeded(userAttributesToSave)) // <- need to make this reducer more flexible } catch (error) { dispatch(registrationRequestFailed()) throw error diff --git a/src/types.ts b/src/types.ts index 99d4e9a..f8165dd 100644 --- a/src/types.ts +++ b/src/types.ts @@ -23,6 +23,9 @@ export interface AuthHeaders { export interface AuthResponse { readonly headers: AuthHeaders + readonly data: { + readonly data: { [key: string]: any } + } } export interface VerificationParams { @@ -68,10 +71,10 @@ export type SIGNOUT_REQUEST_FAILED = 'redux-token-auth/SIGNOUT_REQUEST_FAILED' export const SIGNOUT_REQUEST_FAILED: SIGNOUT_REQUEST_FAILED = 'redux-token-auth/SIGNOUT_REQUEST_FAILED' export interface UserRegistrationDetails { - readonly firstName: string readonly email: string readonly password: string readonly passwordConfirmation: string + readonly [key: string]: any } export interface UserSignInCredentials { @@ -164,4 +167,4 @@ export interface ActionsExport { readonly signOutUser: ReduxAsyncAction } -export type ActionsGeneratorExport = (authUrl: string) => ActionsExport +export type ActionsGeneratorExport = (config: { [key: string]: any }) => ActionsExport