/*
 * Licensed to the Apache Software Foundation (ASF) under one or more
 * contributor license agreements.  See the NOTICE file distributed with
 * this work for additional information regarding copyright ownership.
 * The ASF licenses this file to You under the Apache License, Version 2.0
 * (the "License"); you may not use this file except in compliance with
 * the License.  You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package org.acme;

import javax.enterprise.context.ApplicationScoped;
import javax.inject.Named;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.NamedQueries;
import javax.persistence.NamedQuery;
import javax.persistence.Table;

import io.quarkus.runtime.annotations.RegisterForReflection;

@Entity
@Table(name = "audit_log")
@NamedQueries({
        @NamedQuery(name = "getAuditLog", query = "select al from AuditLog al")
})
@Named("auditLog")
@ApplicationScoped
@RegisterForReflection
public class AuditLog {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "id")
    private long id;
    private String message;

    public String getMessage() {
        return message;
    }

    public AuditLog createAuditLog(String message) {
        AuditLog auditLog = new AuditLog();
        auditLog.message = message;
        return auditLog;
    }

    @Override
    public String toString() {
        return String.format("{message=%s}", message);
    }
}
