aboutsummaryrefslogtreecommitdiffstats
path: root/jdisc-security-filters/src/main/java/com/yahoo/jdisc/http/filter/security/misc/User.java
blob: 607e3482c3d277cdf1332fe208d0f9ddacfa6554 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
// Copyright Vespa.ai. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
package com.yahoo.jdisc.http.filter.security.misc;

import java.time.LocalDate;
import java.util.Map;
import java.util.Objects;
import java.util.TreeMap;

/**
 * @author smorgrav
 */
public record User(String email, String name, String nickname, String picture, boolean isVerified, int loginCount,
                   LocalDate lastLogin, Map<String, Object> extraAttributes) {
    public static final String ATTRIBUTE_NAME = "vespa.user.attributes";
    public static final LocalDate NO_DATE = LocalDate.EPOCH;

    public User {
        Objects.requireNonNull(email);
        Objects.requireNonNull(lastLogin);
        extraAttributes = Map.copyOf(Objects.requireNonNull(extraAttributes));
    }

    public User(String email, String name, String nickname, String picture, boolean isVerified, int loginCount,
                LocalDate lastLogin) {
        this(email, name, nickname, picture, isVerified, loginCount, lastLogin, Map.of());
    }

    public User(String email, String name, String nickname, String picture) {
        this(email, name, nickname, picture, false, -1, NO_DATE, Map.of());
    }

    private User(Builder builder) {
        this(builder.email, builder.name, builder.nickname, builder.picture, builder.isVerified, builder.loginCount,
             Objects.requireNonNullElse(builder.lastLogin, NO_DATE), builder.extraAttributes);
    }

    public static Builder builder() { return new Builder(); }

    public static class Builder {
        private String email;
        private String name;
        private String nickname;
        private String picture;
        private boolean isVerified;
        private int loginCount;
        private LocalDate lastLogin;
        private final Map<String, Object> extraAttributes = new TreeMap<>();

        private Builder() {}

        public Builder email(String email) { this.email = email; return this; }
        public Builder name(String name) { this.name = name; return this; }
        public Builder nickname(String nickname) { this.nickname = nickname; return this; }
        public Builder picture(String picture) { this.picture = picture; return this; }
        public Builder isVerified(boolean isVerified) { this.isVerified = isVerified; return this; }
        public Builder loginCount(int loginCount) { this.loginCount = loginCount; return this; }
        public Builder lastLogin(LocalDate lastLogin) { this.lastLogin = lastLogin; return this; }
        public Builder extraAttribute(String key, Object value) {
            extraAttributes.put(Objects.requireNonNull(key), Objects.requireNonNull(value)); return this;
        }
        public User build() { return new User(this); }
    }
}