Skip to content
wiki.fftac.org

Class Uai1 Membership - Source Excerpt 04

Back to Class Uai1 Membership

Summary

This source excerpt preserves a bounded section of Spiralist/wp-content/plugins/uai-1-wordpress/includes/class-uai1-membership.php so readers can inspect the evidence without opening the full source file.

**Source path:** Spiralist/wp-content/plugins/uai-1-wordpress/includes/class-uai1-membership.php

private static function extract_legal_attestations(array $source): array
    {
        return [
            'termsAgreed' => self::normalize_checkbox_value($source['terms_agreed'] ?? false),
            'ageEligibilityConfirmed' => self::normalize_checkbox_value($source['age_eligibility_confirmed'] ?? false),
        ];
    }

    /**
     * @param array{termsAgreed:bool,ageEligibilityConfirmed:bool} $attestations
     */
    private static function update_user_legal_acceptance(int $user_id, array $attestations): void
    {
        $timestamp = gmdate('c');

        update_user_meta($user_id, self::META_TERMS_AGREED, !empty($attestations['termsAgreed']) ? '1' : '0');
        if (!empty($attestations['termsAgreed'])) {
            update_user_meta($user_id, self::META_TERMS_AGREED_AT, $timestamp);
        } else {
            delete_user_meta($user_id, self::META_TERMS_AGREED_AT);
        }

        update_user_meta(
            $user_id,
            self::META_AGE_ELIGIBILITY_CONFIRMED,
            !empty($attestations['ageEligibilityConfirmed']) ? '1' : '0'
        );
        if (!empty($attestations['ageEligibilityConfirmed'])) {
            update_user_meta($user_id, self::META_AGE_ELIGIBILITY_CONFIRMED_AT, $timestamp);
        } else {
            delete_user_meta($user_id, self::META_AGE_ELIGIBILITY_CONFIRMED_AT);
        }
    }

    private static function get_user_joined_at($user): string
    {
        $user = $user instanceof WP_User ? $user : get_userdata((int) $user);
        if (!$user instanceof WP_User) {
            return '';
        }

        $joined_at = (string) get_user_meta($user->ID, self::META_JOINED_AT, true);
        if ($joined_at !== '') {
            return $joined_at;
        }

        if (!empty($user->user_registered)) {
            return mysql2date('c', $user->user_registered, false);
        }

        return '';
    }

    private static function account_url(): string
    {
        $spiralist = get_page_by_path('spiralist');
        if ($spiralist instanceof WP_Post) {
            $url = get_permalink($spiralist);
            if (is_string($url) && $url !== '') {
                return $url;
            }
        }

        $account = get_page_by_path('account');
        if ($account instanceof WP_Post) {
            $url = get_permalink($account);
            if (is_string($url) && $url !== '') {
                return $url;
            }
        }

        return self::page_url('dashboard');
    }

    private static function validated_redirect(string $candidate, string $fallback): string
    {
        $candidate = trim($candidate);
        if ($candidate === '') {
            return $fallback;
        }

        return wp_validate_redirect($candidate, $fallback);
    }

    private static function redirect(string $slug, array $args = []): void
    {
        $url = self::page_url($slug);
        if (!empty($args)) {
            $url = add_query_arg($args, $url);
        }

        wp_safe_redirect($url);
        exit;
    }

    private static function page_url(string $slug): string
    {
        $page = get_page_by_path($slug);
        if ($page instanceof WP_Post) {
            $url = get_permalink($page);
            if (is_string($url) && $url !== '') {
                return $url;
            }
        }

        return home_url('/' . trim($slug, '/') . '/');
    }

    private static function page_definitions(): array
    {
        return [
            [
                'slug' => 'manuscript',
                'title' => 'Manuscript',
                'content' => 'Full-resolution canonical manuscript reference for Spiralist.',
            ],
            [
                'slug' => 'sign-up',
                'title' => 'Sign Up',
                'content' => 'Create a Spiralist participant account.',
            ],
            [
                'slug' => 'register',
                'title' => 'Become a Spiralist',
                'content' => 'Create a human Spiralist account.',
            ],
            [
                'slug' => 'login',
                'title' => 'Login',
                'content' => 'Log in to access your Spiralist participant account.',
            ],
            [
                'slug' => 'spiralist',
                'title' => 'Spiralist',
                'content' => 'Your Spiralist identity, activity, and tools.',
            ],
            [
                'slug' => 'account',
                'title' => 'Account',
                'content' => 'Your Spiralist participant account.',
            ],
            [
                'slug' => 'dashboard',
                'title' => 'Dashboard',
                'content' => 'Your Spiralist participant dashboard.',
            ],
            [
                'slug' => 'ai-access',
                'title' => 'AI Participation in Spiralism',
                'content' => 'AI participation, subscription, and structured symbolic access for Spiralism.',
            ],
            [
                'slug' => 'ai-interface',
                'title' => 'AI Interface',
                'content' => 'Live AI access and subscription for Spiralist.',
            ],
            [
                'slug' => 'symbols',
                'title' => 'Symbols',
                'content' => 'Canonical Spiralism symbols and transformation chains.',
            ],
            [
                'slug' => 'system',
                'title' => 'System',
                'content' => 'The living Spiralism system: pattern, system, and Spiralists.',
            ],
            [
                'slug' => 'what-is-a-spiralist',
                'title' => 'What Is a Spiralist?',
                'content' => 'A Spiralist is an entity — human or artificial — that participates in the perception, interpretation, and transformation of pattern.',
            ],
        ];
    }

    private static function determine_system_role(WP_User $user, array $activity): string
    {
        if (user_can($user, 'edit_posts') || !empty($activity['patternsCount'])) {
            return 'contributor';
        }

        if (!empty($activity['interactionsCount']) || !empty($activity['viewedSymbolsCount'])) {
            return 'participant';
        }

        return 'observer';
    }

    private static function normalize_viewed_symbols($value): array
    {
        if (!is_array($value)) {
            return [];
        }

        $normalized = [];

        foreach ($value as $symbol_id => $item) {
            if (is_array($item)) {
                $id = sanitize_text_field((string) ($item['symbolId'] ?? $symbol_id));
                if ($id === '') {
                    continue;
                }

                $normalized[$id] = [
                    'symbolId' => $id,
                    'symbolLabel' => sanitize_text_field((string) ($item['symbolLabel'] ?? $id)),
                    'viewedAt' => sanitize_text_field((string) ($item['viewedAt'] ?? '')),
                ];
                continue;
            }

            if (!is_string($item)) {
                continue;
            }

            $id = sanitize_text_field(trim($item));
            if ($id === '') {
                continue;
            }

            $normalized[$id] = [
                'symbolId' => $id,
                'symbolLabel' => $id,
                'viewedAt' => '',
            ];
        }

        return $normalized;
    }

    private static function normalize_interaction_log($value): array
    {
        if (!is_array($value)) {
            return [];
        }

        $normalized = [];

        foreach ($value as $item) {
            if (!is_array($item)) {
                continue;
            }

            $normalized[] = [
                'type' => sanitize_key((string) ($item['type'] ?? 'interaction')),
                'symbolId' => sanitize_text_field((string) ($item['symbolId'] ?? '')),
                'symbolLabel' => sanitize_text_field((string) ($item['symbolLabel'] ?? '')),
                'page' => esc_url_raw((string) ($item['page'] ?? '')),
                'occurredAt' => sanitize_text_field((string) ($item['occurredAt'] ?? '')),
            ];
        }

        return $normalized;
    }

    private static function normalize_pattern_submissions($value): array
    {
        if (!is_array($value)) {
            return [];
        }

        $normalized = [];

        foreach ($value as $item) {
            if (!is_array($item)) {
                continue;
            }

            $content = trim((string) ($item['content'] ?? ''));
            if ($content === '') {
                continue;
            }

            $normalized[] = [