PsUser.java

package de.mirkosertic.powerstaff.auth;

import org.springframework.data.annotation.Id;
import org.springframework.data.domain.Persistable;
import org.springframework.data.relational.core.mapping.Column;
import org.springframework.data.relational.core.mapping.Table;

@Table("ps_user")
public class PsUser implements Persistable<String> {

    @Id
    private final String username;

    @Column("password_hash")
    private final String passwordHash;

    @Column("must_change_password")
    private final boolean mustChangePassword;

    @Column("enabled")
    private final boolean enabled;

    @Column("profile_search_system_prompt")
    private final String profileSearchSystemPrompt;

    @Column("is_admin")
    private final boolean admin;

    @Column("llm_api_token")
    private final String llmApiToken;

    public static final String DEFAULT_SYSTEM_PROMPT =
            "Du bist ein freundlicher KI-Assistent für den Benutzer {user} und antwortest immer auf deutsch. Dein Name ist Staffi.";

    public PsUser(final String username, final String passwordHash, final boolean mustChangePassword, final boolean enabled,
                  final String profileSearchSystemPrompt, final boolean admin, final String llmApiToken) {
        this.username = username;
        this.passwordHash = passwordHash;
        this.mustChangePassword = mustChangePassword;
        this.enabled = enabled;
        this.profileSearchSystemPrompt = profileSearchSystemPrompt != null
                ? profileSearchSystemPrompt : DEFAULT_SYSTEM_PROMPT;
        this.admin = admin;
        this.llmApiToken = llmApiToken;
    }

    /**
     * Spring Data JDBC: String-PKs sind niemals null, daher würde isNew() ohne
     * Persistable-Implementierung immer false liefern und save() ein UPDATE statt
     * INSERT ausführen. Da alle Passwort-Änderungen direkt per JdbcClient laufen,
     * geht save() im Repository ausschließlich für Neuanlage – daher immer true.
     */
    @Override
    public String getId() {
        return username;
    }

    @Override
    public boolean isNew() {
        return true;
    }

    public String getUsername() {
        return username;
    }

    public String getPasswordHash() {
        return passwordHash;
    }

    public boolean isMustChangePassword() {
        return mustChangePassword;
    }

    public boolean isEnabled() {
        return enabled;
    }

    public String getProfileSearchSystemPrompt() {
        return profileSearchSystemPrompt;
    }

    public boolean isAdmin() {
        return admin;
    }

    public String getLlmApiToken() {
        return llmApiToken;
    }
}