import { schema } from "@slackwsh/data";
import type { Role } from "@slackwsh/contracts";
import { EmailService } from "../auth/email.service";
import { StatusService } from "./status.service";
export declare class WorkspacesService {
    private readonly email;
    private readonly statuses;
    constructor(email: EmailService, statuses: StatusService);
    createWorkspace(ownerUserId: number, input: {
        name: string;
        slug: string;
    }): Promise<{
        id: number;
        name: string;
        createdAt: Date;
        orgId: number;
        slug: string;
        iconUrl: string | null;
        settings: unknown;
        retentionDays: number | null;
    }>;
    listMyWorkspaces(userId: number): Promise<{
        role: "owner" | "admin" | "member" | "multi_channel_guest" | "single_channel_guest" | "bot";
        id: number;
        name: string;
        createdAt: Date;
        orgId: number;
        slug: string;
        iconUrl: string | null;
        settings: unknown;
        retentionDays: number | null;
    }[]>;
    getMembership(workspaceId: number, userId: number): Promise<{
        workspaceId: number;
        userId: number;
        role: "owner" | "admin" | "member" | "multi_channel_guest" | "single_channel_guest" | "bot";
        displayName: string | null;
        title: string | null;
        statusText: string | null;
        statusEmoji: string | null;
        statusExpiresAt: Date | null;
        availabilityMode: string;
        dndEnabled: boolean;
        dndUntil: Date | null;
        autoStatusConnect: boolean;
        autoStatusFocus: boolean;
        autoStatusOutsideHours: boolean;
        focusModeEnabled: boolean;
        inConnect: boolean;
        workHoursStart: string;
        workHoursEnd: string;
        workingDays: unknown;
        joinedAt: Date;
        deactivatedAt: Date | null;
    } | null>;
    listMembers(workspaceId: number, actorUserId: number): Promise<{
        member: {
            statusText: string | null;
            statusEmoji: string | null;
            statusExpiresAt: string | null;
            statusSource: "connect" | "manual" | "scheduled" | "focus" | "outside_hours" | null;
            dndActive: boolean;
            dndUntil: string | null;
            workspaceId: number;
            userId: number;
            role: "owner" | "admin" | "member" | "multi_channel_guest" | "single_channel_guest" | "bot";
            displayName: string | null;
            title: string | null;
            availabilityMode: string;
            dndEnabled: boolean;
            autoStatusConnect: boolean;
            autoStatusFocus: boolean;
            autoStatusOutsideHours: boolean;
            focusModeEnabled: boolean;
            inConnect: boolean;
            workHoursStart: string;
            workHoursEnd: string;
            workingDays: unknown;
            joinedAt: Date;
            deactivatedAt: Date | null;
        };
        user: typeof schema.users.$inferSelect;
    }[]>;
    /**
     * Invite by email. If that account already exists, create an in-app
     * notification so they can accept from their workspace picker — they are
     * not added as a member until they accept.
     */
    createInvite(workspaceId: number, actorUserId: number, input: {
        email: string;
        role: Role;
        expiresInHours: number;
        maxUses: number;
    }): Promise<{
        id: number;
        token: string | undefined;
        role: "owner" | "admin" | "member" | "multi_channel_guest" | "single_channel_guest" | "bot";
        expiresAt: Date;
        maxUses: number;
        userExists: boolean;
        notified: boolean;
    }>;
    listPendingInvitesForEmail(userId: number, userEmail: string): Promise<{
        id: number;
        workspaceId: number;
        workspaceName: string;
        workspaceSlug: string;
        role: "owner" | "admin" | "member" | "multi_channel_guest" | "single_channel_guest" | "bot";
        invitedByName: string | null;
        expiresAt: Date;
        createdAt: Date;
    }[]>;
    listNotifications(userId: number): Promise<{
        id: number;
        createdAt: Date;
        userId: number;
        title: string;
        type: string;
        body: string;
        payload: unknown;
        readAt: Date | null;
    }[]>;
    markNotificationRead(userId: number, notificationId: number): Promise<{
        read: boolean;
    }>;
    acceptInvite(token: string, userId: number, userEmail: string): Promise<{
        id: number;
        name: string;
        createdAt: Date;
        orgId: number;
        slug: string;
        iconUrl: string | null;
        settings: unknown;
        retentionDays: number | null;
    } | undefined>;
    acceptInviteById(inviteId: number, userId: number, userEmail: string): Promise<{
        id: number;
        name: string;
        createdAt: Date;
        orgId: number;
        slug: string;
        iconUrl: string | null;
        settings: unknown;
        retentionDays: number | null;
    } | undefined>;
    declineInviteById(inviteId: number, userId: number, userEmail: string): Promise<{
        declined: boolean;
    }>;
    private consumeInvite;
    private markInviteNotificationsRead;
    changeMemberRole(workspaceId: number, actorUserId: number, targetUserId: number, role: Role): Promise<void>;
    setMemberActive(workspaceId: number, actorUserId: number, targetUserId: number, active: boolean): Promise<void>;
    transferOwnership(workspaceId: number, actorUserId: number, newOwnerUserId: number): Promise<void>;
    updateSettings(workspaceId: number, actorUserId: number, input: {
        name?: string;
        retentionDays?: number | null;
    }): Promise<void>;
    adminOverview(workspaceId: number, actorUserId: number): Promise<{
        workspace: {
            id: number;
            name: string;
            createdAt: Date;
            orgId: number;
            slug: string;
            iconUrl: string | null;
            settings: unknown;
            retentionDays: number | null;
        } | undefined;
        members: {
            member: {
                workspaceId: number;
                userId: number;
                role: "owner" | "admin" | "member" | "multi_channel_guest" | "single_channel_guest" | "bot";
                displayName: string | null;
                title: string | null;
                statusText: string | null;
                statusEmoji: string | null;
                statusExpiresAt: Date | null;
                availabilityMode: string;
                dndEnabled: boolean;
                dndUntil: Date | null;
                autoStatusConnect: boolean;
                autoStatusFocus: boolean;
                autoStatusOutsideHours: boolean;
                focusModeEnabled: boolean;
                inConnect: boolean;
                workHoursStart: string;
                workHoursEnd: string;
                workingDays: unknown;
                joinedAt: Date;
                deactivatedAt: Date | null;
            };
            user: {
                id: number;
                name: string;
                createdAt: Date;
                email: string;
                emailVerifiedAt: Date | null;
                passwordHash: string;
                username: string;
                avatarUrl: string | null;
                tz: string;
                mfaSecret: string | null;
            };
        }[];
        invites: {
            id: number;
            createdAt: Date;
            email: string | null;
            workspaceId: number;
            role: "owner" | "admin" | "member" | "multi_channel_guest" | "single_channel_guest" | "bot";
            expiresAt: Date;
            invitedByUserId: number | null;
            tokenHash: string;
            usedAt: Date | null;
            maxUses: number;
            useCount: number;
        }[];
        channels: {
            id: number;
            name: string | null;
            createdAt: Date;
            workspaceId: number;
            type: "public" | "private" | "dm" | "group_dm";
            topic: string | null;
            purpose: string | null;
            createdBy: number;
            isArchived: boolean;
            lastMessageAt: Date | null;
            memberCount: number;
        }[];
    }>;
    private requireMembership;
}
//# sourceMappingURL=workspaces.service.d.ts.map