SocialHubEntity.java

/*
 * UVerify Backend
 * Copyright (C) 2025 Fabian Bormann
 *
 *  This program is free software: you can redistribute it and/or modify
 *  it under the terms of the GNU Affero General Public License as published by
 *  the Free Software Foundation, either version 3 of the License, or
 *  (at your option) any later version.
 *
 *  This program is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 *  GNU Affero General Public License for more details.
 *
 *  You should have received a copy of the GNU Affero General Public License
 *  along with this program. If not, see <http://www.gnu.org/licenses/>.
 */

package io.uverify.backend.extension.entity;

import com.bloxbean.cardano.client.util.HexUtil;
import io.uverify.backend.extension.validators.SocialHubDatum;
import jakarta.persistence.*;
import lombok.*;

import java.util.Base64;
import java.util.Optional;

@Getter
@Setter
@AllArgsConstructor
@NoArgsConstructor
@Builder
@Entity
@Table(name = "social_hub")
public class SocialHubEntity {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @Column(name = "password", nullable = false)
    private String password;

    @Column(name = "owner")
    private String owner;

    @Column(name = "picture")
    private String picture;

    @Column(name = "name")
    private String name;

    @Column(name = "subtitle")
    private String subtitle;

    @Column(name = "x")
    private String x;

    @Column(name = "telegram")
    private String telegram;

    @Column(name = "instagram")
    private String instagram;

    @Column(name = "discord")
    private String discord;

    @Column(name = "reddit")
    private String reddit;

    @Column(name = "youtube")
    private String youtube;

    @Column(name = "linkedin")
    private String linkedin;

    @Column(name = "github")
    private String github;

    @Column(name = "website")
    private String website;

    @Column(name = "adahandle")
    private String adaHandle;

    @Column(name = "email")
    private String email;

    @Column(name = "asset_id", nullable = false)
    private String assetId;

    @Column(name = "transaction_id", nullable = false)
    private String transactionId;

    @Column(name = "output_index", nullable = false)
    private Integer outputIndex;

    @Column(name = "creation_slot", nullable = false)
    private Long creationSlot;

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "batch_id", referencedColumnName = "id")
    private ConnectedGoodEntity connectedGood;

    private static String fieldToString(byte[] data) {
        if (data == null) {
            return null;
        }
        return Base64.getEncoder().encodeToString(data);
    }

    private static byte[] fieldToByteArray(String data) {
        if (data == null) {
            return null;
        }
        return Base64.getDecoder().decode(data);
    }

    public static SocialHubEntity fromSocialHubDatum(SocialHubDatum socialHubDatum) {
        return SocialHubEntity.builder()
                .owner(HexUtil.encodeHexString(socialHubDatum.getOwner()))
                .picture(fieldToString(socialHubDatum.getPicture().orElse(null)))
                .name(fieldToString(socialHubDatum.getName().orElse(null)))
                .subtitle(fieldToString(socialHubDatum.getSubtitle().orElse(null)))
                .x(fieldToString(socialHubDatum.getX().orElse(null)))
                .telegram(fieldToString(socialHubDatum.getTelegram().orElse(null)))
                .discord(fieldToString(socialHubDatum.getDiscord().orElse(null)))
                .youtube(fieldToString(socialHubDatum.getYoutube().orElse(null)))
                .website(fieldToString(socialHubDatum.getWebsite().orElse(null)))
                .reddit(fieldToString(socialHubDatum.getReddit().orElse(null)))
                .instagram(fieldToString(socialHubDatum.getInstagram().orElse(null)))
                .linkedin(fieldToString(socialHubDatum.getLinkedin().orElse(null)))
                .github(fieldToString(socialHubDatum.getGithub().orElse(null)))
                .email(fieldToString(socialHubDatum.getEmail().orElse(null)))
                .adaHandle(fieldToString(socialHubDatum.getAdahandle().orElse(null)))
                .build();
    }

    public SocialHubDatum toSocialHubDatum() {
        byte[] socialHubOwner = null;
        if (owner != null) {
            socialHubOwner = HexUtil.decodeHexString(owner);
        }

        byte[] socialHubBatchId = null;
        if (connectedGood != null) {
            socialHubBatchId = HexUtil.decodeHexString(connectedGood.getId());
        }

        return SocialHubDatum.builder()
                .owner(socialHubOwner)
                .batchId(socialHubBatchId)
                .picture(Optional.ofNullable(fieldToByteArray(picture)))
                .name(Optional.ofNullable(fieldToByteArray(name)))
                .subtitle(Optional.ofNullable(fieldToByteArray(subtitle)))
                .x(Optional.ofNullable(fieldToByteArray(x)))
                .telegram(Optional.ofNullable(fieldToByteArray(telegram)))
                .discord(Optional.ofNullable(fieldToByteArray(discord)))
                .youtube(Optional.ofNullable(fieldToByteArray(youtube)))
                .website(Optional.ofNullable(fieldToByteArray(website)))
                .reddit(Optional.ofNullable(fieldToByteArray(reddit)))
                .linkedin(Optional.ofNullable(fieldToByteArray(linkedin)))
                .instagram(Optional.ofNullable(fieldToByteArray(instagram)))
                .github(Optional.ofNullable(fieldToByteArray(github)))
                .email(Optional.ofNullable(fieldToByteArray(email)))
                .adahandle(Optional.ofNullable(fieldToByteArray(adaHandle)))
                .build();
    }
}