- Added SettingsComponent for user profile management, including display name and password change functionality. - Introduced TokensComponent for managing API tokens, including creation and revocation. - Created LayoutComponent for consistent application layout with navigation and user information. - Established main application structure in index.html and main.ts. - Integrated Tailwind CSS for styling and responsive design. - Configured TypeScript settings for strict type checking and module resolution.
163 lines
4.0 KiB
TypeScript
163 lines
4.0 KiB
TypeScript
/**
|
|
* RepositoryPermission model - grants access to repositories
|
|
*/
|
|
|
|
import * as plugins from '../plugins.ts';
|
|
import type { IRepositoryPermission, TRepositoryRole } from '../interfaces/auth.interfaces.ts';
|
|
import { getDb } from './db.ts';
|
|
|
|
@plugins.smartdata.Collection(() => getDb())
|
|
export class RepositoryPermission
|
|
extends plugins.smartdata.SmartDataDbDoc<RepositoryPermission, RepositoryPermission>
|
|
implements IRepositoryPermission
|
|
{
|
|
@plugins.smartdata.unI()
|
|
public id: string = '';
|
|
|
|
@plugins.smartdata.svDb()
|
|
@plugins.smartdata.index()
|
|
public repositoryId: string = '';
|
|
|
|
@plugins.smartdata.svDb()
|
|
@plugins.smartdata.index()
|
|
public teamId?: string;
|
|
|
|
@plugins.smartdata.svDb()
|
|
@plugins.smartdata.index()
|
|
public userId?: string;
|
|
|
|
@plugins.smartdata.svDb()
|
|
public role: TRepositoryRole = 'reader';
|
|
|
|
@plugins.smartdata.svDb()
|
|
@plugins.smartdata.index()
|
|
public createdAt: Date = new Date();
|
|
|
|
@plugins.smartdata.svDb()
|
|
public grantedById: string = '';
|
|
|
|
/**
|
|
* Grant permission to a user
|
|
*/
|
|
public static async grantToUser(data: {
|
|
repositoryId: string;
|
|
userId: string;
|
|
role: TRepositoryRole;
|
|
grantedById: string;
|
|
}): Promise<RepositoryPermission> {
|
|
// Check for existing permission
|
|
const existing = await RepositoryPermission.getInstance({
|
|
repositoryId: data.repositoryId,
|
|
userId: data.userId,
|
|
});
|
|
|
|
if (existing) {
|
|
// Update existing permission
|
|
existing.role = data.role;
|
|
await existing.save();
|
|
return existing;
|
|
}
|
|
|
|
const perm = new RepositoryPermission();
|
|
perm.id = await RepositoryPermission.getNewId();
|
|
perm.repositoryId = data.repositoryId;
|
|
perm.userId = data.userId;
|
|
perm.role = data.role;
|
|
perm.grantedById = data.grantedById;
|
|
perm.createdAt = new Date();
|
|
await perm.save();
|
|
return perm;
|
|
}
|
|
|
|
/**
|
|
* Grant permission to a team
|
|
*/
|
|
public static async grantToTeam(data: {
|
|
repositoryId: string;
|
|
teamId: string;
|
|
role: TRepositoryRole;
|
|
grantedById: string;
|
|
}): Promise<RepositoryPermission> {
|
|
// Check for existing permission
|
|
const existing = await RepositoryPermission.getInstance({
|
|
repositoryId: data.repositoryId,
|
|
teamId: data.teamId,
|
|
});
|
|
|
|
if (existing) {
|
|
// Update existing permission
|
|
existing.role = data.role;
|
|
await existing.save();
|
|
return existing;
|
|
}
|
|
|
|
const perm = new RepositoryPermission();
|
|
perm.id = await RepositoryPermission.getNewId();
|
|
perm.repositoryId = data.repositoryId;
|
|
perm.teamId = data.teamId;
|
|
perm.role = data.role;
|
|
perm.grantedById = data.grantedById;
|
|
perm.createdAt = new Date();
|
|
await perm.save();
|
|
return perm;
|
|
}
|
|
|
|
/**
|
|
* Get user's direct permission on repository
|
|
*/
|
|
public static async getUserPermission(
|
|
repositoryId: string,
|
|
userId: string
|
|
): Promise<RepositoryPermission | null> {
|
|
return await RepositoryPermission.getInstance({
|
|
repositoryId,
|
|
userId,
|
|
});
|
|
}
|
|
|
|
/**
|
|
* Get team's permission on repository
|
|
*/
|
|
public static async getTeamPermission(
|
|
repositoryId: string,
|
|
teamId: string
|
|
): Promise<RepositoryPermission | null> {
|
|
return await RepositoryPermission.getInstance({
|
|
repositoryId,
|
|
teamId,
|
|
});
|
|
}
|
|
|
|
/**
|
|
* Get all permissions for a repository
|
|
*/
|
|
public static async getRepoPermissions(repositoryId: string): Promise<RepositoryPermission[]> {
|
|
return await RepositoryPermission.getInstances({
|
|
repositoryId,
|
|
});
|
|
}
|
|
|
|
/**
|
|
* Get all permissions for user's teams on a repository
|
|
*/
|
|
public static async getTeamPermissionsForRepo(
|
|
repositoryId: string,
|
|
teamIds: string[]
|
|
): Promise<RepositoryPermission[]> {
|
|
if (teamIds.length === 0) return [];
|
|
return await RepositoryPermission.getInstances({
|
|
repositoryId,
|
|
teamId: { $in: teamIds } as unknown as string,
|
|
});
|
|
}
|
|
|
|
/**
|
|
* Lifecycle hook
|
|
*/
|
|
public async beforeSave(): Promise<void> {
|
|
if (!this.id) {
|
|
this.id = await RepositoryPermission.getNewId();
|
|
}
|
|
}
|
|
}
|