working signup wizard.
This commit is contained in:
parent
db893f66e1
commit
f8292c300f
|
@ -6,6 +6,11 @@ import (
|
||||||
"strings"
|
"strings"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
type UserWizard struct {
|
||||||
|
*User `json:",inline"`
|
||||||
|
JoinMailingList bool `json:"join_mailing_list"`
|
||||||
|
}
|
||||||
|
|
||||||
type User struct {
|
type User struct {
|
||||||
ModelBase
|
ModelBase
|
||||||
FullName string `json:"full_name"`
|
FullName string `json:"full_name"`
|
||||||
|
|
|
@ -0,0 +1,45 @@
|
||||||
|
package utils
|
||||||
|
|
||||||
|
import (
|
||||||
|
"bytes"
|
||||||
|
"encoding/json"
|
||||||
|
"fmt"
|
||||||
|
"io"
|
||||||
|
"log"
|
||||||
|
"net/http"
|
||||||
|
)
|
||||||
|
|
||||||
|
func JoinNewsletter(name string, email string, message string, wantsToChat string) error {
|
||||||
|
mailingListRequestData := map[string]string{
|
||||||
|
"email": email,
|
||||||
|
"name": name,
|
||||||
|
"message": message,
|
||||||
|
"11_chat": wantsToChat,
|
||||||
|
}
|
||||||
|
|
||||||
|
payloadBytes, err := json.Marshal(mailingListRequestData)
|
||||||
|
if err != nil {
|
||||||
|
return fmt.Errorf("an error occurred while marshalling join newsletter request: %w", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
req, err := http.NewRequest(http.MethodPost, "https://api.platform.fastenhealth.com/v1/newsletter/join", bytes.NewBuffer(payloadBytes))
|
||||||
|
|
||||||
|
req.Header.Set("Content-Type", "application/json")
|
||||||
|
req.Header.Set("Accept", "application/json")
|
||||||
|
|
||||||
|
newsletterResp, err := http.DefaultClient.Do(req)
|
||||||
|
|
||||||
|
if err != nil {
|
||||||
|
return fmt.Errorf("an error occurred while sending newsletter join request: %w", err)
|
||||||
|
}
|
||||||
|
defer newsletterResp.Body.Close()
|
||||||
|
if newsletterResp.StatusCode >= 300 || newsletterResp.StatusCode < 200 {
|
||||||
|
b, err := io.ReadAll(newsletterResp.Body)
|
||||||
|
if err == nil {
|
||||||
|
log.Printf("Error Response body: %s", string(b))
|
||||||
|
}
|
||||||
|
return fmt.Errorf("an error occurred while attempting to join newsletter: %d", newsletterResp.StatusCode)
|
||||||
|
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
|
@ -7,6 +7,7 @@ import (
|
||||||
"github.com/fastenhealth/fasten-onprem/backend/pkg/config"
|
"github.com/fastenhealth/fasten-onprem/backend/pkg/config"
|
||||||
"github.com/fastenhealth/fasten-onprem/backend/pkg/database"
|
"github.com/fastenhealth/fasten-onprem/backend/pkg/database"
|
||||||
"github.com/fastenhealth/fasten-onprem/backend/pkg/models"
|
"github.com/fastenhealth/fasten-onprem/backend/pkg/models"
|
||||||
|
"github.com/fastenhealth/fasten-onprem/backend/pkg/utils"
|
||||||
"github.com/gin-gonic/gin"
|
"github.com/gin-gonic/gin"
|
||||||
"net/http"
|
"net/http"
|
||||||
)
|
)
|
||||||
|
@ -15,19 +16,25 @@ func AuthSignup(c *gin.Context) {
|
||||||
databaseRepo := c.MustGet(pkg.ContextKeyTypeDatabase).(database.DatabaseRepository)
|
databaseRepo := c.MustGet(pkg.ContextKeyTypeDatabase).(database.DatabaseRepository)
|
||||||
appConfig := c.MustGet(pkg.ContextKeyTypeConfig).(config.Interface)
|
appConfig := c.MustGet(pkg.ContextKeyTypeConfig).(config.Interface)
|
||||||
|
|
||||||
var user models.User
|
var userWizard models.UserWizard
|
||||||
if err := c.ShouldBindJSON(&user); err != nil {
|
if err := c.ShouldBindJSON(&userWizard); err != nil {
|
||||||
c.JSON(http.StatusInternalServerError, gin.H{"success": false, "error": err.Error()})
|
c.JSON(http.StatusInternalServerError, gin.H{"success": false, "error": err.Error()})
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
err := databaseRepo.CreateUser(c, &user)
|
err := databaseRepo.CreateUser(c, userWizard.User)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
c.JSON(http.StatusInternalServerError, gin.H{"success": false, "error": err.Error()})
|
c.JSON(http.StatusInternalServerError, gin.H{"success": false, "error": err.Error()})
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
//TODO: we can derive the encryption key and the hash'ed user from the responseData sub. For now the Sub will be the user id prepended with hello.
|
//TODO: we can derive the encryption key and the hash'ed user from the responseData sub. For now the Sub will be the user id prepended with hello.
|
||||||
userFastenToken, err := auth.JwtGenerateFastenTokenFromUser(user, appConfig.GetString("jwt.issuer.key"))
|
userFastenToken, err := auth.JwtGenerateFastenTokenFromUser(*userWizard.User, appConfig.GetString("jwt.issuer.key"))
|
||||||
|
|
||||||
|
//check if the user wants to join the mailing list
|
||||||
|
if userWizard.JoinMailingList {
|
||||||
|
//ignore error messages, we don't want to block the user from signing up
|
||||||
|
utils.JoinNewsletter(userWizard.FullName, userWizard.Email, "", "")
|
||||||
|
}
|
||||||
|
|
||||||
c.JSON(http.StatusOK, gin.H{"success": true, "data": userFastenToken})
|
c.JSON(http.StatusOK, gin.H{"success": true, "data": userFastenToken})
|
||||||
}
|
}
|
||||||
|
|
|
@ -69,14 +69,14 @@
|
||||||
</div><!-- form-group -->
|
</div><!-- form-group -->
|
||||||
|
|
||||||
<div class="form-group form-check">
|
<div class="form-group form-check">
|
||||||
<input [(ngModel)]="newUser.agreeTerms" name="agreeTerms" #agreeTerms="ngModel" type="checkbox" class="form-check-input" id="agreeTermsCheck" required>
|
<input [(ngModel)]="newUser.agree_terms" name="agree_terms" #agree_terms="ngModel" type="checkbox" class="form-check-input" id="agreeTermsCheck" required>
|
||||||
<label class="form-check-label" for="agreeTermsCheck">
|
<label class="form-check-label" for="agreeTermsCheck">
|
||||||
I have read and agree to the Fasten Health <br/> <a href="https://policy.fastenhealth.com/privacy_policy.html">Privacy Policy</a>
|
I have read and agree to the Fasten Health <br/> <a href="https://policy.fastenhealth.com/privacy_policy.html">Privacy Policy</a>
|
||||||
and <a href="https://policy.fastenhealth.com/terms.html">Terms of Service</a>
|
and <a href="https://policy.fastenhealth.com/terms.html">Terms of Service</a>
|
||||||
</label>
|
</label>
|
||||||
|
|
||||||
<div *ngIf="agreeTerms.invalid && (agreeTerms.dirty || agreeTerms.touched)" class="alert alert-danger">
|
<div *ngIf="agree_terms.invalid && (agree_terms.dirty || agree_terms.touched)" class="alert alert-danger">
|
||||||
<div *ngIf="agreeTerms.errors?.['required']">
|
<div *ngIf="agree_terms.errors?.['required']">
|
||||||
You must agree to the Privacy Policy and Terms of Use.
|
You must agree to the Privacy Policy and Terms of Use.
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
@ -84,22 +84,20 @@
|
||||||
|
|
||||||
|
|
||||||
<div class="form-group form-check">
|
<div class="form-group form-check">
|
||||||
<input [(ngModel)]="newUser.joinMailingList" name="joinMailingList" #joinMailingList="ngModel" type="checkbox" class="form-check-input" id="joinMailingListCheck">
|
<input [(ngModel)]="newUser.join_mailing_list" name="join_mailing_list" #join_mailing_list="ngModel" type="checkbox" class="form-check-input" id="joinMailingListCheck">
|
||||||
<label class="form-check-label" for="joinMailingListCheck">
|
<label class="form-check-label" for="joinMailingListCheck">
|
||||||
Join Mailing List
|
Join Mailing List
|
||||||
</label>
|
</label>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
<button [disabled]="!userForm.form.valid || loading" type="submit" class="btn btn-az-primary btn-block">Create Account</button>
|
||||||
|
|
||||||
<div *ngIf="errorMsg" class="alert alert-danger mt-3" role="alert">
|
<div *ngIf="errorMsg" class="alert alert-danger mt-3" role="alert">
|
||||||
<strong>Error</strong> {{errorMsg}}
|
<strong>Error</strong> {{errorMsg}}
|
||||||
</div>
|
</div>
|
||||||
</form>
|
</form>
|
||||||
|
|
||||||
</div><!-- az-signin-header -->
|
</div><!-- az-signin-header -->
|
||||||
<div class="az-signin-footer">
|
|
||||||
<button [disabled]="!userForm.form.valid || loading" type="submit" class="btn btn-az-primary btn-block">Create Account</button>
|
|
||||||
|
|
||||||
</div><!-- az-signin-footer -->
|
|
||||||
</div><!-- az-card-signin -->
|
</div><!-- az-card-signin -->
|
||||||
</div><!-- az-signin-wrapper -->
|
</div><!-- az-signin-wrapper -->
|
||||||
|
|
||||||
|
|
|
@ -7,9 +7,9 @@ import {ToastService} from '../../services/toast.service';
|
||||||
import {ToastNotification, ToastType} from '../../models/fasten/toast';
|
import {ToastNotification, ToastType} from '../../models/fasten/toast';
|
||||||
|
|
||||||
class UserWizard extends User {
|
class UserWizard extends User {
|
||||||
passwordConfirm: string = ""
|
password_confirm: string = ""
|
||||||
agreeTerms: boolean = false
|
agree_terms: boolean = false
|
||||||
joinMailingList: boolean = true
|
join_mailing_list: boolean = true
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -126,6 +126,7 @@ export class AuthSignupWizardComponent implements OnInit {
|
||||||
this.loading = true
|
this.loading = true
|
||||||
this.submitted = true;
|
this.submitted = true;
|
||||||
|
|
||||||
|
console.log("starting signup process...",this.newUser)
|
||||||
this.authService.Signup(this.newUser).then((tokenResp: any) => {
|
this.authService.Signup(this.newUser).then((tokenResp: any) => {
|
||||||
this.loading = false
|
this.loading = false
|
||||||
console.log(tokenResp);
|
console.log(tokenResp);
|
||||||
|
|
Loading…
Reference in New Issue