status-im/status-go

View on GitHub
protocol/communities/validator.go

Summary

Maintainability
A
0 mins
Test Coverage
C
71%
package communities

import (
    "github.com/status-im/status-go/protocol/protobuf"
    "github.com/status-im/status-go/protocol/requests"
)

func validateCommunityChat(desc *protobuf.CommunityDescription, chat *protobuf.CommunityChat) error {
    if chat == nil {
        return ErrInvalidCommunityDescription
    }
    if chat.Permissions == nil {
        return ErrInvalidCommunityDescriptionNoChatPermissions
    }
    if chat.Permissions.Access == protobuf.CommunityPermissions_UNKNOWN_ACCESS {
        return ErrInvalidCommunityDescriptionUnknownChatAccess
    }

    if len(chat.CategoryId) != 0 {
        if _, exists := desc.Categories[chat.CategoryId]; !exists {
            return ErrInvalidCommunityDescriptionUnknownChatCategory
        }
    }

    if chat.Identity == nil {
        return ErrInvalidCommunityDescriptionChatIdentity
    }

    for pk := range chat.Members {
        if desc.Members == nil {
            return ErrInvalidCommunityDescriptionMemberInChatButNotInOrg
        }
        // Check member is in the org as well
        if _, ok := desc.Members[pk]; !ok {
            return ErrInvalidCommunityDescriptionMemberInChatButNotInOrg
        }
    }

    return nil
}

func validateCommunityCategory(category *protobuf.CommunityCategory) error {
    if len(category.CategoryId) == 0 {
        return ErrInvalidCommunityDescriptionCategoryNoID
    }

    if len(category.Name) == 0 {
        return ErrInvalidCommunityDescriptionCategoryNoName
    }

    return nil
}

func ValidateCommunityDescription(desc *protobuf.CommunityDescription) error {
    if desc == nil {
        return ErrInvalidCommunityDescription
    }
    if desc.Permissions == nil {
        return ErrInvalidCommunityDescriptionNoOrgPermissions
    }
    if desc.Permissions.Access == protobuf.CommunityPermissions_UNKNOWN_ACCESS {
        return ErrInvalidCommunityDescriptionUnknownOrgAccess
    }

    valid := requests.ValidateTags(desc.Tags)
    if !valid {
        return ErrInvalidCommunityTags
    }

    for _, category := range desc.Categories {
        if err := validateCommunityCategory(category); err != nil {
            return err
        }
    }

    for _, chat := range desc.Chats {
        if err := validateCommunityChat(desc, chat); err != nil {
            return err
        }
    }

    return nil
}