Compare commits
12 Commits
1.1.22
...
feat/plain
Author | SHA1 | Date | |
---|---|---|---|
![]() |
ecefe12355 | ||
![]() |
5c8f9406f6 | ||
![]() |
ae84213e34 | ||
![]() |
87bf1c3045 | ||
![]() |
b467e7002d | ||
![]() |
4afd544c41 | ||
![]() |
307c6f7d15 | ||
![]() |
bbc6394cf3 | ||
![]() |
63c8e2e55f | ||
![]() |
b224892a39 | ||
![]() |
13edf1965c | ||
![]() |
1f220a5205 |
1079
dashboard/package-lock.json
generated
1079
dashboard/package-lock.json
generated
File diff suppressed because it is too large
Load Diff
@@ -29,6 +29,10 @@ import {
|
||||
Tbody,
|
||||
Td,
|
||||
Code,
|
||||
Radio,
|
||||
RadioGroup,
|
||||
Stack,
|
||||
Textarea,
|
||||
} from '@chakra-ui/react';
|
||||
import { FaPlus, FaAngleDown, FaAngleUp } from 'react-icons/fa';
|
||||
import { useClient } from 'urql';
|
||||
@@ -38,6 +42,7 @@ import {
|
||||
EmailTemplateInputDataFields,
|
||||
emailTemplateEventNames,
|
||||
emailTemplateVariables,
|
||||
EmailTemplateEditors,
|
||||
} from '../constants';
|
||||
import { capitalizeFirstLetter } from '../utils';
|
||||
import { AddEmailTemplate, EditEmailTemplate } from '../graphql/mutation';
|
||||
@@ -66,6 +71,8 @@ interface templateVariableDataTypes {
|
||||
interface emailTemplateDataType {
|
||||
[EmailTemplateInputDataFields.EVENT_NAME]: string;
|
||||
[EmailTemplateInputDataFields.SUBJECT]: string;
|
||||
[EmailTemplateInputDataFields.TEMPLATE]: string;
|
||||
[EmailTemplateInputDataFields.DESIGN]: string;
|
||||
}
|
||||
|
||||
interface validatorDataType {
|
||||
@@ -75,6 +82,8 @@ interface validatorDataType {
|
||||
const initTemplateData: emailTemplateDataType = {
|
||||
[EmailTemplateInputDataFields.EVENT_NAME]: emailTemplateEventNames.Signup,
|
||||
[EmailTemplateInputDataFields.SUBJECT]: '',
|
||||
[EmailTemplateInputDataFields.TEMPLATE]: '',
|
||||
[EmailTemplateInputDataFields.DESIGN]: '',
|
||||
};
|
||||
|
||||
const initTemplateValidatorData: validatorDataType = {
|
||||
@@ -91,6 +100,9 @@ const UpdateEmailTemplate = ({
|
||||
const emailEditorRef = useRef(null);
|
||||
const { isOpen, onOpen, onClose } = useDisclosure();
|
||||
const [loading, setLoading] = useState<boolean>(false);
|
||||
const [editor, setEditor] = useState<string>(
|
||||
EmailTemplateEditors.PLAIN_HTML_EDITOR,
|
||||
);
|
||||
const [templateVariables, setTemplateVariables] = useState<
|
||||
templateVariableDataTypes[]
|
||||
>([]);
|
||||
@@ -107,9 +119,11 @@ const UpdateEmailTemplate = ({
|
||||
if (selectedTemplate) {
|
||||
const { design } = selectedTemplate;
|
||||
try {
|
||||
if (design) {
|
||||
const designData = JSON.parse(design);
|
||||
// @ts-ignore
|
||||
emailEditorRef.current.editor.loadDesign(designData);
|
||||
}
|
||||
} catch (error) {
|
||||
console.error(error);
|
||||
onClose();
|
||||
@@ -136,24 +150,7 @@ const UpdateEmailTemplate = ({
|
||||
);
|
||||
};
|
||||
|
||||
const saveData = async () => {
|
||||
if (!validateData()) return;
|
||||
setLoading(true);
|
||||
// @ts-ignore
|
||||
return await emailEditorRef.current.editor.exportHtml(async (data) => {
|
||||
const { design, html } = data;
|
||||
if (!html || !design) {
|
||||
setLoading(false);
|
||||
return;
|
||||
}
|
||||
const params = {
|
||||
[EmailTemplateInputDataFields.EVENT_NAME]:
|
||||
templateData[EmailTemplateInputDataFields.EVENT_NAME],
|
||||
[EmailTemplateInputDataFields.SUBJECT]:
|
||||
templateData[EmailTemplateInputDataFields.SUBJECT],
|
||||
[EmailTemplateInputDataFields.TEMPLATE]: html.trim(),
|
||||
[EmailTemplateInputDataFields.DESIGN]: JSON.stringify(design),
|
||||
};
|
||||
const updateTemplate = async (params: emailTemplateDataType) => {
|
||||
let res: any = {};
|
||||
if (
|
||||
view === UpdateModalViews.Edit &&
|
||||
@@ -197,9 +194,41 @@ const UpdateEmailTemplate = ({
|
||||
setValidator({ ...initTemplateValidatorData });
|
||||
fetchEmailTemplatesData();
|
||||
}
|
||||
view === UpdateModalViews.ADD && onClose();
|
||||
});
|
||||
};
|
||||
|
||||
const saveData = async () => {
|
||||
if (!validateData()) return;
|
||||
setLoading(true);
|
||||
let params: emailTemplateDataType = {
|
||||
[EmailTemplateInputDataFields.EVENT_NAME]:
|
||||
templateData[EmailTemplateInputDataFields.EVENT_NAME],
|
||||
[EmailTemplateInputDataFields.SUBJECT]:
|
||||
templateData[EmailTemplateInputDataFields.SUBJECT],
|
||||
[EmailTemplateInputDataFields.TEMPLATE]:
|
||||
templateData[EmailTemplateInputDataFields.TEMPLATE],
|
||||
[EmailTemplateInputDataFields.DESIGN]: '',
|
||||
};
|
||||
if (editor === EmailTemplateEditors.UNLAYER_EDITOR) {
|
||||
// @ts-ignore
|
||||
await emailEditorRef.current.editor.exportHtml(async (data) => {
|
||||
const { design, html } = data;
|
||||
if (!html || !design) {
|
||||
setLoading(false);
|
||||
return;
|
||||
}
|
||||
params = {
|
||||
...params,
|
||||
[EmailTemplateInputDataFields.TEMPLATE]: html.trim(),
|
||||
[EmailTemplateInputDataFields.DESIGN]: JSON.stringify(design),
|
||||
};
|
||||
await updateTemplate(params);
|
||||
});
|
||||
} else {
|
||||
await updateTemplate(params);
|
||||
}
|
||||
view === UpdateModalViews.ADD && onClose();
|
||||
};
|
||||
|
||||
const resetData = () => {
|
||||
if (selectedTemplate) {
|
||||
setTemplateData(selectedTemplate);
|
||||
@@ -207,6 +236,8 @@ const UpdateEmailTemplate = ({
|
||||
setTemplateData({ ...initTemplateData });
|
||||
}
|
||||
};
|
||||
|
||||
// set template data if edit modal is open
|
||||
useEffect(() => {
|
||||
if (
|
||||
isOpen &&
|
||||
@@ -214,10 +245,12 @@ const UpdateEmailTemplate = ({
|
||||
selectedTemplate &&
|
||||
Object.keys(selectedTemplate || {}).length
|
||||
) {
|
||||
const { id, created_at, template, design, ...rest } = selectedTemplate;
|
||||
const { id, created_at, ...rest } = selectedTemplate;
|
||||
setTemplateData(rest);
|
||||
}
|
||||
}, [isOpen]);
|
||||
|
||||
// set template variables
|
||||
useEffect(() => {
|
||||
const updatedTemplateVariables = Object.entries(
|
||||
emailTemplateVariables,
|
||||
@@ -244,6 +277,51 @@ const UpdateEmailTemplate = ({
|
||||
setTemplateVariables(updatedTemplateVariables);
|
||||
}, [templateData[EmailTemplateInputDataFields.EVENT_NAME]]);
|
||||
|
||||
// change editor
|
||||
useEffect(() => {
|
||||
if (isOpen && selectedTemplate) {
|
||||
const { design } = selectedTemplate;
|
||||
if (design) {
|
||||
setEditor(EmailTemplateEditors.UNLAYER_EDITOR);
|
||||
} else {
|
||||
setEditor(EmailTemplateEditors.PLAIN_HTML_EDITOR);
|
||||
}
|
||||
}
|
||||
}, [isOpen, selectedTemplate]);
|
||||
|
||||
// reset fields when editor is changed
|
||||
useEffect(() => {
|
||||
if (selectedTemplate?.design) {
|
||||
if (editor === EmailTemplateEditors.UNLAYER_EDITOR) {
|
||||
setTemplateData({
|
||||
...templateData,
|
||||
[EmailTemplateInputDataFields.TEMPLATE]: selectedTemplate.template,
|
||||
[EmailTemplateInputDataFields.DESIGN]: selectedTemplate.design,
|
||||
});
|
||||
} else {
|
||||
setTemplateData({
|
||||
...templateData,
|
||||
[EmailTemplateInputDataFields.TEMPLATE]: '',
|
||||
[EmailTemplateInputDataFields.DESIGN]: '',
|
||||
});
|
||||
}
|
||||
} else if (selectedTemplate?.template) {
|
||||
if (editor === EmailTemplateEditors.UNLAYER_EDITOR) {
|
||||
setTemplateData({
|
||||
...templateData,
|
||||
[EmailTemplateInputDataFields.TEMPLATE]: '',
|
||||
[EmailTemplateInputDataFields.DESIGN]: '',
|
||||
});
|
||||
} else {
|
||||
setTemplateData({
|
||||
...templateData,
|
||||
[EmailTemplateInputDataFields.TEMPLATE]: selectedTemplate?.template,
|
||||
[EmailTemplateInputDataFields.DESIGN]: '',
|
||||
});
|
||||
}
|
||||
}
|
||||
}, [editor]);
|
||||
|
||||
return (
|
||||
<>
|
||||
{view === UpdateModalViews.ADD ? (
|
||||
@@ -414,7 +492,22 @@ const UpdateEmailTemplate = ({
|
||||
alignItems="center"
|
||||
marginBottom="2%"
|
||||
>
|
||||
Template Body
|
||||
<Flex flex="1">Template Body</Flex>
|
||||
<Flex flex="3">
|
||||
<RadioGroup
|
||||
onChange={(value) => setEditor(value)}
|
||||
value={editor}
|
||||
>
|
||||
<Stack direction="row" spacing="50px">
|
||||
<Radio value={EmailTemplateEditors.PLAIN_HTML_EDITOR}>
|
||||
Plain HTML
|
||||
</Radio>
|
||||
<Radio value={EmailTemplateEditors.UNLAYER_EDITOR}>
|
||||
Unlayer Editor
|
||||
</Radio>
|
||||
</Stack>
|
||||
</RadioGroup>
|
||||
</Flex>
|
||||
</Flex>
|
||||
<Flex
|
||||
width="100%"
|
||||
@@ -423,7 +516,22 @@ const UpdateEmailTemplate = ({
|
||||
border="1px solid"
|
||||
borderColor="gray.200"
|
||||
>
|
||||
{editor === EmailTemplateEditors.UNLAYER_EDITOR ? (
|
||||
<EmailEditor ref={emailEditorRef} onReady={onReady} />
|
||||
) : (
|
||||
<Textarea
|
||||
value={templateData.template}
|
||||
onChange={(e) => {
|
||||
setTemplateData({
|
||||
...templateData,
|
||||
[EmailTemplateInputDataFields.TEMPLATE]: e.target.value,
|
||||
});
|
||||
}}
|
||||
placeholder="Template HTML"
|
||||
border="0"
|
||||
height="500px"
|
||||
/>
|
||||
)}
|
||||
</Flex>
|
||||
</Flex>
|
||||
</ModalBody>
|
||||
|
@@ -337,3 +337,8 @@ export const webhookPayloadExample: string = `{
|
||||
},
|
||||
"auth_recipe":"google"
|
||||
}`;
|
||||
|
||||
export enum EmailTemplateEditors {
|
||||
UNLAYER_EDITOR = 'unlayer_editor',
|
||||
PLAIN_HTML_EDITOR = 'plain_html_editor',
|
||||
}
|
||||
|
@@ -26,7 +26,6 @@ func NewProvider() (*provider, error) {
|
||||
config := aws.Config{
|
||||
MaxRetries: aws.Int(3),
|
||||
CredentialsChainVerboseErrors: aws.Bool(true), // for full error logs
|
||||
|
||||
}
|
||||
|
||||
if awsRegion != "" {
|
||||
|
@@ -246,6 +246,7 @@ type ComplexityRoot struct {
|
||||
}
|
||||
|
||||
ValidateJWTTokenResponse struct {
|
||||
Claims func(childComplexity int) int
|
||||
IsValid func(childComplexity int) int
|
||||
}
|
||||
|
||||
@@ -1646,6 +1647,13 @@ func (e *executableSchema) Complexity(typeName, field string, childComplexity in
|
||||
|
||||
return e.complexity.Users.Users(childComplexity), true
|
||||
|
||||
case "ValidateJWTTokenResponse.claims":
|
||||
if e.complexity.ValidateJWTTokenResponse.Claims == nil {
|
||||
break
|
||||
}
|
||||
|
||||
return e.complexity.ValidateJWTTokenResponse.Claims(childComplexity), true
|
||||
|
||||
case "ValidateJWTTokenResponse.is_valid":
|
||||
if e.complexity.ValidateJWTTokenResponse.IsValid == nil {
|
||||
break
|
||||
@@ -2110,6 +2118,7 @@ type Env {
|
||||
|
||||
type ValidateJWTTokenResponse {
|
||||
is_valid: Boolean!
|
||||
claims: Map
|
||||
}
|
||||
|
||||
type GenerateJWTKeysResponse {
|
||||
@@ -2386,7 +2395,7 @@ input AddEmailTemplateRequest {
|
||||
event_name: String!
|
||||
subject: String!
|
||||
template: String!
|
||||
design: String!
|
||||
design: String
|
||||
}
|
||||
|
||||
input UpdateEmailTemplateRequest {
|
||||
@@ -9136,6 +9145,8 @@ func (ec *executionContext) fieldContext_Query_validate_jwt_token(ctx context.Co
|
||||
switch field.Name {
|
||||
case "is_valid":
|
||||
return ec.fieldContext_ValidateJWTTokenResponse_is_valid(ctx, field)
|
||||
case "claims":
|
||||
return ec.fieldContext_ValidateJWTTokenResponse_claims(ctx, field)
|
||||
}
|
||||
return nil, fmt.Errorf("no field named %q was found under type ValidateJWTTokenResponse", field.Name)
|
||||
},
|
||||
@@ -10965,6 +10976,47 @@ func (ec *executionContext) fieldContext_ValidateJWTTokenResponse_is_valid(ctx c
|
||||
return fc, nil
|
||||
}
|
||||
|
||||
func (ec *executionContext) _ValidateJWTTokenResponse_claims(ctx context.Context, field graphql.CollectedField, obj *model.ValidateJWTTokenResponse) (ret graphql.Marshaler) {
|
||||
fc, err := ec.fieldContext_ValidateJWTTokenResponse_claims(ctx, field)
|
||||
if err != nil {
|
||||
return graphql.Null
|
||||
}
|
||||
ctx = graphql.WithFieldContext(ctx, fc)
|
||||
defer func() {
|
||||
if r := recover(); r != nil {
|
||||
ec.Error(ctx, ec.Recover(ctx, r))
|
||||
ret = graphql.Null
|
||||
}
|
||||
}()
|
||||
resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (interface{}, error) {
|
||||
ctx = rctx // use context from middleware stack in children
|
||||
return obj.Claims, nil
|
||||
})
|
||||
if err != nil {
|
||||
ec.Error(ctx, err)
|
||||
return graphql.Null
|
||||
}
|
||||
if resTmp == nil {
|
||||
return graphql.Null
|
||||
}
|
||||
res := resTmp.(map[string]interface{})
|
||||
fc.Result = res
|
||||
return ec.marshalOMap2map(ctx, field.Selections, res)
|
||||
}
|
||||
|
||||
func (ec *executionContext) fieldContext_ValidateJWTTokenResponse_claims(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {
|
||||
fc = &graphql.FieldContext{
|
||||
Object: "ValidateJWTTokenResponse",
|
||||
Field: field,
|
||||
IsMethod: false,
|
||||
IsResolver: false,
|
||||
Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {
|
||||
return nil, errors.New("field of type Map does not have child fields")
|
||||
},
|
||||
}
|
||||
return fc, nil
|
||||
}
|
||||
|
||||
func (ec *executionContext) _VerificationRequest_id(ctx context.Context, field graphql.CollectedField, obj *model.VerificationRequest) (ret graphql.Marshaler) {
|
||||
fc, err := ec.fieldContext_VerificationRequest_id(ctx, field)
|
||||
if err != nil {
|
||||
@@ -14078,7 +14130,7 @@ func (ec *executionContext) unmarshalInputAddEmailTemplateRequest(ctx context.Co
|
||||
var err error
|
||||
|
||||
ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("design"))
|
||||
it.Design, err = ec.unmarshalNString2string(ctx, v)
|
||||
it.Design, err = ec.unmarshalOString2ᚖstring(ctx, v)
|
||||
if err != nil {
|
||||
return it, err
|
||||
}
|
||||
@@ -17353,6 +17405,10 @@ func (ec *executionContext) _ValidateJWTTokenResponse(ctx context.Context, sel a
|
||||
if out.Values[i] == graphql.Null {
|
||||
invalids++
|
||||
}
|
||||
case "claims":
|
||||
|
||||
out.Values[i] = ec._ValidateJWTTokenResponse_claims(ctx, field, obj)
|
||||
|
||||
default:
|
||||
panic("unknown field " + strconv.Quote(field.Name))
|
||||
}
|
||||
|
@@ -6,7 +6,7 @@ type AddEmailTemplateRequest struct {
|
||||
EventName string `json:"event_name"`
|
||||
Subject string `json:"subject"`
|
||||
Template string `json:"template"`
|
||||
Design string `json:"design"`
|
||||
Design *string `json:"design"`
|
||||
}
|
||||
|
||||
type AddWebhookRequest struct {
|
||||
@@ -387,6 +387,7 @@ type ValidateJWTTokenInput struct {
|
||||
|
||||
type ValidateJWTTokenResponse struct {
|
||||
IsValid bool `json:"is_valid"`
|
||||
Claims map[string]interface{} `json:"claims"`
|
||||
}
|
||||
|
||||
type VerificationRequest struct {
|
||||
|
@@ -153,6 +153,7 @@ type Env {
|
||||
|
||||
type ValidateJWTTokenResponse {
|
||||
is_valid: Boolean!
|
||||
claims: Map
|
||||
}
|
||||
|
||||
type GenerateJWTKeysResponse {
|
||||
@@ -429,7 +430,7 @@ input AddEmailTemplateRequest {
|
||||
event_name: String!
|
||||
subject: String!
|
||||
template: String!
|
||||
design: String!
|
||||
design: String
|
||||
}
|
||||
|
||||
input UpdateEmailTemplateRequest {
|
||||
|
@@ -154,6 +154,7 @@ func TokenHandler() gin.HandlerFunc {
|
||||
"error": "invalid_refresh_token",
|
||||
"error_description": "The refresh token is invalid",
|
||||
})
|
||||
return
|
||||
}
|
||||
|
||||
claims, err := token.ValidateRefreshToken(gc, refreshToken)
|
||||
@@ -163,9 +164,10 @@ func TokenHandler() gin.HandlerFunc {
|
||||
"error": "unauthorized",
|
||||
"error_description": err.Error(),
|
||||
})
|
||||
return
|
||||
}
|
||||
userID = claims["sub"].(string)
|
||||
loginMethod := claims["login_method"]
|
||||
claimLoginMethod := claims["login_method"]
|
||||
rolesInterface := claims["roles"].([]interface{})
|
||||
scopeInterface := claims["scope"].([]interface{})
|
||||
for _, v := range rolesInterface {
|
||||
@@ -176,9 +178,11 @@ func TokenHandler() gin.HandlerFunc {
|
||||
}
|
||||
|
||||
sessionKey = userID
|
||||
if loginMethod != nil && loginMethod != "" {
|
||||
sessionKey = loginMethod.(string) + ":" + sessionKey
|
||||
if claimLoginMethod != nil && claimLoginMethod != "" {
|
||||
sessionKey = claimLoginMethod.(string) + ":" + sessionKey
|
||||
loginMethod = claimLoginMethod.(string)
|
||||
}
|
||||
|
||||
// remove older refresh token and rotate it for security
|
||||
go memorystore.Provider.DeleteUserSession(sessionKey, claims["nonce"].(string))
|
||||
}
|
||||
@@ -211,6 +215,7 @@ func TokenHandler() gin.HandlerFunc {
|
||||
})
|
||||
return
|
||||
}
|
||||
|
||||
memorystore.Provider.SetUserSession(sessionKey, constants.TokenTypeSessionToken+"_"+authToken.FingerPrint, authToken.FingerPrintHash)
|
||||
memorystore.Provider.SetUserSession(sessionKey, constants.TokenTypeAccessToken+"_"+authToken.FingerPrint, authToken.AccessToken.Token)
|
||||
cookie.SetSession(gc, authToken.FingerPrintHash)
|
||||
|
@@ -8,6 +8,7 @@ import (
|
||||
"github.com/authorizerdev/authorizer/server/db"
|
||||
"github.com/authorizerdev/authorizer/server/db/models"
|
||||
"github.com/authorizerdev/authorizer/server/graph/model"
|
||||
"github.com/authorizerdev/authorizer/server/refs"
|
||||
"github.com/authorizerdev/authorizer/server/token"
|
||||
"github.com/authorizerdev/authorizer/server/utils"
|
||||
"github.com/authorizerdev/authorizer/server/validators"
|
||||
@@ -40,15 +41,17 @@ func AddEmailTemplateResolver(ctx context.Context, params model.AddEmailTemplate
|
||||
return nil, fmt.Errorf("empty template not allowed")
|
||||
}
|
||||
|
||||
if strings.TrimSpace(params.Design) == "" {
|
||||
return nil, fmt.Errorf("empty design not allowed")
|
||||
var design string
|
||||
|
||||
if params.Design == nil || strings.TrimSpace(refs.StringValue(params.Design)) == "" {
|
||||
design = ""
|
||||
}
|
||||
|
||||
_, err = db.Provider.AddEmailTemplate(ctx, models.EmailTemplate{
|
||||
EventName: params.EventName,
|
||||
Template: params.Template,
|
||||
Subject: params.Subject,
|
||||
Design: params.Design,
|
||||
Design: design,
|
||||
})
|
||||
if err != nil {
|
||||
log.Debug("Failed to add email template: ", err)
|
||||
|
@@ -93,5 +93,6 @@ func ValidateJwtTokenResolver(ctx context.Context, params model.ValidateJWTToken
|
||||
}
|
||||
return &model.ValidateJWTTokenResponse{
|
||||
IsValid: true,
|
||||
Claims: claims,
|
||||
}, nil
|
||||
}
|
||||
|
@@ -51,16 +51,30 @@ func addEmailTemplateTest(t *testing.T, s TestSetup) {
|
||||
assert.Nil(t, emailTemplate)
|
||||
})
|
||||
|
||||
t.Run("should not add email template with empty design", func(t *testing.T) {
|
||||
var design string
|
||||
design = ""
|
||||
|
||||
for _, eventType := range s.TestInfo.TestEmailTemplateEventTypes {
|
||||
t.Run("should add email template with empty design for "+eventType, func(t *testing.T) {
|
||||
emailTemplate, err := resolvers.AddEmailTemplateResolver(ctx, model.AddEmailTemplateRequest{
|
||||
EventName: s.TestInfo.TestEmailTemplateEventTypes[0],
|
||||
Template: "test",
|
||||
Subject: "test",
|
||||
Design: " ",
|
||||
EventName: eventType,
|
||||
Template: "Test email",
|
||||
Subject: "Test email",
|
||||
Design: &design,
|
||||
})
|
||||
assert.Error(t, err)
|
||||
assert.Nil(t, emailTemplate)
|
||||
assert.NoError(t, err)
|
||||
assert.NotNil(t, emailTemplate)
|
||||
assert.NotEmpty(t, emailTemplate.Message)
|
||||
|
||||
et, err := db.Provider.GetEmailTemplateByEventName(ctx, eventType)
|
||||
assert.NoError(t, err)
|
||||
assert.Equal(t, et.EventName, eventType)
|
||||
assert.Equal(t, "Test email", et.Subject)
|
||||
assert.Equal(t, "Test design", et.Design)
|
||||
})
|
||||
}
|
||||
|
||||
design = "Test design"
|
||||
|
||||
for _, eventType := range s.TestInfo.TestEmailTemplateEventTypes {
|
||||
t.Run("should add email template for "+eventType, func(t *testing.T) {
|
||||
@@ -68,7 +82,7 @@ func addEmailTemplateTest(t *testing.T, s TestSetup) {
|
||||
EventName: eventType,
|
||||
Template: "Test email",
|
||||
Subject: "Test email",
|
||||
Design: "Test design",
|
||||
Design: &design,
|
||||
})
|
||||
assert.NoError(t, err)
|
||||
assert.NotNil(t, emailTemplate)
|
||||
|
@@ -62,7 +62,7 @@ func TestResolvers(t *testing.T) {
|
||||
|
||||
err := db.InitDB()
|
||||
if err != nil {
|
||||
t.Errorf("Error initializing database: %s", err.Error())
|
||||
t.Logf("Error initializing database: %s", err.Error())
|
||||
}
|
||||
|
||||
// clean the persisted config for test to use fresh config
|
||||
@@ -71,14 +71,14 @@ func TestResolvers(t *testing.T) {
|
||||
envData.EnvData = ""
|
||||
_, err = db.Provider.UpdateEnv(ctx, envData)
|
||||
if err != nil {
|
||||
t.Errorf("Error updating env: %s", err.Error())
|
||||
t.Logf("Error updating env: %s", err.Error())
|
||||
}
|
||||
} else if err != nil {
|
||||
t.Errorf("Error getting env: %s", err.Error())
|
||||
t.Logf("Error getting env: %s", err.Error())
|
||||
}
|
||||
err = env.PersistEnv()
|
||||
if err != nil {
|
||||
t.Errorf("Error persisting env: %s", err.Error())
|
||||
t.Logf("Error persisting env: %s", err.Error())
|
||||
}
|
||||
|
||||
memorystore.Provider.UpdateEnvVariable(constants.EnvKeyEnv, "test")
|
||||
|
@@ -93,5 +93,6 @@ func validateJwtTokenTest(t *testing.T, s TestSetup) {
|
||||
})
|
||||
assert.NoError(t, err)
|
||||
assert.True(t, res.IsValid)
|
||||
assert.Equal(t, user.Email, res.Claims["email"])
|
||||
})
|
||||
}
|
||||
|
@@ -124,6 +124,7 @@ func CreateRefreshToken(user models.User, roles, scopes []string, hostname, nonc
|
||||
"scope": scopes,
|
||||
"nonce": nonce,
|
||||
"login_method": loginMethod,
|
||||
"allowed_roles": strings.Split(user.Roles, ","),
|
||||
}
|
||||
|
||||
token, err := SignJWTToken(customClaims)
|
||||
@@ -163,6 +164,7 @@ func CreateAccessToken(user models.User, roles, scopes []string, hostName, nonce
|
||||
"scope": scopes,
|
||||
"roles": roles,
|
||||
"login_method": loginMethod,
|
||||
"allowed_roles": strings.Split(user.Roles, ","),
|
||||
}
|
||||
|
||||
token, err := SignJWTToken(customClaims)
|
||||
@@ -256,7 +258,6 @@ func ValidateRefreshToken(gc *gin.Context, refreshToken string) (map[string]inte
|
||||
if loginMethod != nil && loginMethod != "" {
|
||||
sessionKey = loginMethod.(string) + ":" + userID
|
||||
}
|
||||
|
||||
token, err := memorystore.Provider.GetUserSession(sessionKey, constants.TokenTypeRefreshToken+"_"+nonce)
|
||||
if nonce == "" || err != nil {
|
||||
return res, fmt.Errorf(`unauthorized`)
|
||||
|
Reference in New Issue
Block a user