eixcs
eixcs

Reputation: 1989

Java email: How can I send email before saving and returning entity?

I'm creating an account and then sending an email with the password. Right now it first sends the email and then saves the user. How can I change the order, because after return I can't use the email function.

How can I work around that? Should I create another function for those two?

public WorkDetail setWorkerData(PatchWorkerRequest request, User user, WorkDetail workDetail) {

        if (request.getName() != null) {
            user.setName(request.getName());
        }

        if (request.getIdCode() != null) {
            user.setIdCode(request.getIdCode());
        }

        if (request.getEmail() != null) {
            user.setEmail(request.getEmail());
        }

        if (request.getPhone() != null) {
            user.setPhone(request.getPhone());
        }

        if (request.getStatus() != null) {
            user.setStatus(request.getStatus());
        }

        // Work details

        if (request.getJobRelation() != null) {
            workDetail.setJobRelation(request.getJobRelation());
        }

        if (request.getSalary() != null) {
            workDetail.setSalary(request.getSalary());
        }

        if (request.getDistricts() != null) {
            workDetail.setDistricts(request.getDistricts());
        }

        if (request.getCompetences() != null) {
            workDetail.setCompetences(request.getCompetences());
        }

        workDetail = workDetailRepository.save(workDetail);
        user.setWorkDetail(workDetail);
        workDetail.setUser(user);


        return workDetailRepository.save(workDetail);
    }

    public WorkDetail createWorker(PatchWorkerRequest request) {
        WorkDetail workDetail = new WorkDetail();
        User user = new User();
        String generatedPassword = userService.generatePassword(8);
        user.setPassword(passwordEncoder.encode(generatedPassword));
        emailService.sendMail("SYDA", new String[]{request.getEmail()},
                "SYDA: teile loodi kasutaja",
                "Teile loodi SYDA süsteemi kasutaja. Teie parool on: " + generatedPassword +
                        "\nSisse saate logida kasutades emaili: " + request.getEmail());
        return this.setWorkerData(request, user, workDetail);
    }

Upvotes: 2

Views: 340

Answers (1)

SirFartALot
SirFartALot

Reputation: 1225

Instead of

emailService.sendMail("SYDA", new String[]{request.getEmail()},
            "SYDA: teile loodi kasutaja",
            "Teile loodi SYDA süsteemi kasutaja. Teie parool on: " + generatedPassword +
                    "\nSisse saate logida kasutades emaili: " + request.getEmail());
return this.setWorkerData(request, user, workDetail);

write

WorkDetail workDetailSaved = this.setWorkerData(request, user, workDetail);
emailService.sendMail("SYDA", new String[]{request.getEmail()},
            "SYDA: teile loodi kasutaja",
            "Teile loodi SYDA süsteemi kasutaja. Teie parool on: " + generatedPassword +
                    "\nSisse saate logida kasutades emaili: " + request.getEmail());
return workDetailSaved;

(as proposed by Stultuske)


BTW: I would completely rewrite the "setWorkerData(request, user, workDetail)" method and rename it to "buildWorkDetail(request, user)" which only creates a WorkDetail instance. Also I'd remove the "save"-part from there and do it after the creation of the WorkDetail.

Example:

public WorkDetail createWorker(PatchWorkerRequest request) {
    User user = buildUser(request); // builds a new User-instance from the request
    String generatedPassword = userService.generatePassword(8);
    user.setPassword(passwordEncoder.encode(generatedPassword));

    WorkDetail workDetail = buildWorkDetail(request, user); // builds a new WorkDetail-instance from the request
    workDetail.setUser(user);
    workDetailRepository.save(workDetail);
    user.setWorkDetail(workDetail);

    emailService.sendMail("SYDA", new String[]{request.getEmail()},
                "...",
                "...);
    return workDetail;
}

Upvotes: 1

Related Questions