status-im/status-go

View on GitHub
protocol/identity/profile_showcase.go

Summary

Maintainability
A
0 mins
Test Coverage
F
41%
package identity

import "errors"

var ErrorNoAccountProvidedWithTokenOrCollectible = errors.New("no account provided with tokens or collectible")

var ErrorExceedMaxProfileShowcaseCommunitiesLimit = errors.New("exeed maximum profile showcase communities limit")
var ErrorExceedMaxProfileShowcaseAccountsLimit = errors.New("exeed maximum profile showcase accounts limit")
var ErrorExceedMaxProfileShowcaseCollectiblesLimit = errors.New("exeed maximum profile showcase collectibles limit")
var ErrorExceedMaxProfileShowcaseVerifiedTokensLimit = errors.New("exeed maximum profile showcase verified tokens limit")
var ErrorExceedMaxProfileShowcaseUnverifiedTokensLimit = errors.New("exeed maximum profile showcase unverified tokens limit")
var ErrorExceedMaxProfileShowcaseSocialLinksLimit = errors.New("exeed maximum profile showcase communities limit")

const MaxProfileShowcaseSocialLinksLimit = 20
const MaxProfileShowcaseEntriesLimit = 100

type ProfileShowcaseVisibility int

const (
    ProfileShowcaseVisibilityNoOne ProfileShowcaseVisibility = iota
    ProfileShowcaseVisibilityIDVerifiedContacts
    ProfileShowcaseVisibilityContacts
    ProfileShowcaseVisibilityEveryone
)

type ProfileShowcaseMembershipStatus int

const (
    ProfileShowcaseMembershipStatusUnproven ProfileShowcaseMembershipStatus = iota
    ProfileShowcaseMembershipStatusProvenMember
    ProfileShowcaseMembershipStatusNotAMember
)

const (
    TwitterID      = "__twitter"
    PersonalSiteID = "__personal_site"
    GithubID       = "__github"
    YoutubeID      = "__youtube"
    DiscordID      = "__discord"
    TelegramID     = "__telegram"
)

// Profile showcase preferences

type ProfileShowcaseCommunityPreference struct {
    CommunityID        string                    `json:"communityId"`
    ShowcaseVisibility ProfileShowcaseVisibility `json:"showcaseVisibility"`
    Order              int                       `json:"order"`
}

type ProfileShowcaseAccountPreference struct {
    Address            string                    `json:"address"`
    ShowcaseVisibility ProfileShowcaseVisibility `json:"showcaseVisibility"`
    Order              int                       `json:"order"`
}

type ProfileShowcaseCollectiblePreference struct {
    ContractAddress    string                    `json:"contractAddress"`
    ChainID            uint64                    `json:"chainId"`
    TokenID            string                    `json:"tokenId"`
    ShowcaseVisibility ProfileShowcaseVisibility `json:"showcaseVisibility"`
    Order              int                       `json:"order"`
}

type ProfileShowcaseVerifiedTokenPreference struct {
    Symbol             string                    `json:"symbol"`
    ShowcaseVisibility ProfileShowcaseVisibility `json:"showcaseVisibility"`
    Order              int                       `json:"order"`
}

type ProfileShowcaseUnverifiedTokenPreference struct {
    ContractAddress    string                    `json:"contractAddress"`
    ChainID            uint64                    `json:"chainId"`
    ShowcaseVisibility ProfileShowcaseVisibility `json:"showcaseVisibility"`
    Order              int                       `json:"order"`
}

type ProfileShowcaseSocialLinkPreference struct {
    URL                string                    `json:"url"`
    Text               string                    `json:"text"`
    ShowcaseVisibility ProfileShowcaseVisibility `json:"showcaseVisibility"`
    Order              int                       `json:"order"`
}

type ProfileShowcasePreferences struct {
    Clock            uint64                                      `json:"clock"`
    Communities      []*ProfileShowcaseCommunityPreference       `json:"communities"`
    Accounts         []*ProfileShowcaseAccountPreference         `json:"accounts"`
    Collectibles     []*ProfileShowcaseCollectiblePreference     `json:"collectibles"`
    VerifiedTokens   []*ProfileShowcaseVerifiedTokenPreference   `json:"verifiedTokens"`
    UnverifiedTokens []*ProfileShowcaseUnverifiedTokenPreference `json:"unverifiedTokens"`
    SocialLinks      []*ProfileShowcaseSocialLinkPreference      `json:"socialLinks"`
}

// Profile showcase for a contact

type ProfileShowcaseCommunity struct {
    CommunityID      string                          `json:"communityId"`
    Order            int                             `json:"order"`
    MembershipStatus ProfileShowcaseMembershipStatus `json:"membershipStatus"`
    Grant            []byte                          `json:"grant,omitempty"`
}

type ProfileShowcaseAccount struct {
    ContactID string `json:"contactId"`
    Address   string `json:"address"`
    Name      string `json:"name"`
    ColorID   string `json:"colorId"`
    Emoji     string `json:"emoji"`
    Order     int    `json:"order"`
}

type ProfileShowcaseCollectible struct {
    ContractAddress string `json:"contractAddress"`
    ChainID         uint64 `json:"chainId"`
    TokenID         string `json:"tokenId"`
    Order           int    `json:"order"`
}

type ProfileShowcaseVerifiedToken struct {
    Symbol string `json:"symbol"`
    Order  int    `json:"order"`
}

type ProfileShowcaseUnverifiedToken struct {
    ContractAddress string `json:"contractAddress"`
    ChainID         uint64 `json:"chainId"`
    Order           int    `json:"order"`
}

type ProfileShowcaseSocialLink struct {
    URL   string `json:"url"`
    Text  string `json:"text"`
    Order int    `json:"order"`
}

type ProfileShowcase struct {
    ContactID        string                            `json:"contactId"`
    Communities      []*ProfileShowcaseCommunity       `json:"communities"`
    Accounts         []*ProfileShowcaseAccount         `json:"accounts"`
    Collectibles     []*ProfileShowcaseCollectible     `json:"collectibles"`
    VerifiedTokens   []*ProfileShowcaseVerifiedToken   `json:"verifiedTokens"`
    UnverifiedTokens []*ProfileShowcaseUnverifiedToken `json:"unverifiedTokens"`
    SocialLinks      []*ProfileShowcaseSocialLink      `json:"socialLinks"`
}

func Validate(preferences *ProfileShowcasePreferences) error {
    if len(preferences.Communities) > MaxProfileShowcaseEntriesLimit {
        return ErrorExceedMaxProfileShowcaseCommunitiesLimit
    }
    if len(preferences.Accounts) > MaxProfileShowcaseEntriesLimit {
        return ErrorExceedMaxProfileShowcaseAccountsLimit
    }
    if len(preferences.Collectibles) > MaxProfileShowcaseEntriesLimit {
        return ErrorExceedMaxProfileShowcaseCollectiblesLimit
    }
    if len(preferences.VerifiedTokens) > MaxProfileShowcaseEntriesLimit {
        return ErrorExceedMaxProfileShowcaseVerifiedTokensLimit
    }
    if len(preferences.UnverifiedTokens) > MaxProfileShowcaseEntriesLimit {
        return ErrorExceedMaxProfileShowcaseUnverifiedTokensLimit
    }
    if len(preferences.SocialLinks) > MaxProfileShowcaseSocialLinksLimit {
        return ErrorExceedMaxProfileShowcaseSocialLinksLimit
    }

    if (len(preferences.VerifiedTokens) > 0 || len(preferences.UnverifiedTokens) > 0 || len(preferences.Collectibles) > 0) &&
        len(preferences.Accounts) == 0 {
        return ErrorNoAccountProvidedWithTokenOrCollectible
    }

    return nil
}