EmailEvent.java

package com.saltynote.service.event;

import com.saltynote.service.domain.EmailPayload;
import com.saltynote.service.domain.VaultType;
import com.saltynote.service.entity.SiteUser;
import com.saltynote.service.entity.Vault;
import com.saltynote.service.utils.BaseUtils;
import lombok.Getter;
import org.springframework.context.ApplicationEvent;

@Getter
public class EmailEvent extends ApplicationEvent {

    public enum Type {

        NEW_USER("Signup Code to SaltyNote!",
                new EmailPayload().setMessage("Below is the code you will use for signup.")) {
            @Override
            public Type loadVault(Vault vault, String encodedVault) {
                this.getPayload().setLinkText(vault.getSecret());
                return this;
            }

            @Override
            public VaultType getVaultType() {
                return VaultType.NEW_ACCOUNT;
            }
        },
        PASSWORD_FORGET("Password Reset from SaltyNote!",
                new EmailPayload().setLink("")
                    .setLinkText("Reset Your Password")
                    .setMessage("Below is the link for you to reset your password.")) {
            @Override
            public Type loadVault(Vault vault, String encodedVault) {
                this.getPayload().setLink(BaseUtils.getPasswordResetUrl(encodedVault));
                return this;
            }

            @Override
            public VaultType getVaultType() {
                return VaultType.PASSWORD;
            }
        };

        @Getter
        private final String subject;

        @Getter
        private final EmailPayload payload;

        Type(String subject, EmailPayload payload) {
            this.subject = subject;
            this.payload = payload;
        }

        public Type loadUser(SiteUser user) {
            this.payload.setUsername(user.getUsername());
            return this;
        }

        public abstract Type loadVault(Vault vault, String encodedVault);

        public abstract VaultType getVaultType();

    }

    private final SiteUser user;

    private final Type type;

    public EmailEvent(Object source, SiteUser user, Type type) {
        super(source);
        this.user = user;
        this.type = type;
    }

}