const { v4: uuidv4 } = require('uuid'); const database = require('../config/database'); class CommitFilesModel { constructor() { this.db = database; } async createCommitFile(fileData) { const { commit_id, change_type, file_path } = fileData; const query = ` INSERT INTO repository_commit_files ( id, commit_id, change_type, file_path, created_at ) VALUES ($1, $2, $3, $4, NOW()) RETURNING * `; const values = [ uuidv4(), commit_id, change_type, file_path ]; const result = await this.db.query(query, values); return result.rows[0]; } async createMultipleCommitFiles(commit_id, files) { if (!files || files.length === 0) return []; const values = []; const placeholders = []; files.forEach((file, index) => { const baseIndex = index * 4; placeholders.push(`($${baseIndex + 1}, $${baseIndex + 2}, $${baseIndex + 3}, $${baseIndex + 4}, NOW())`); values.push(uuidv4(), commit_id, file.change_type, file.file_path); }); const query = ` INSERT INTO repository_commit_files ( id, commit_id, change_type, file_path, created_at ) VALUES ${placeholders.join(', ')} RETURNING * `; const result = await this.db.query(query, values); return result.rows; } async getFilesByCommit(commit_id) { const query = ` SELECT * FROM repository_commit_files WHERE commit_id = $1 ORDER BY file_path `; const result = await this.db.query(query, [commit_id]); return result.rows; } async getFilesByRepository(repository_id, limit = 100, offset = 0) { const query = ` SELECT rcf.*, rcd.commit_sha, rcd.committed_at FROM repository_commit_files rcf JOIN repository_commit_details rcd ON rcf.commit_id = rcd.id WHERE rcd.repository_id = $1 ORDER BY rcd.committed_at DESC, rcf.file_path LIMIT $2 OFFSET $3 `; const result = await this.db.query(query, [repository_id, limit, offset]); return result.rows; } async getFileChangesByPath(repository_id, file_path) { const query = ` SELECT rcf.*, rcd.commit_sha, rcd.committed_at, rcd.author_name FROM repository_commit_files rcf JOIN repository_commit_details rcd ON rcf.commit_id = rcd.id WHERE rcd.repository_id = $1 AND rcf.file_path = $2 ORDER BY rcd.committed_at DESC `; const result = await this.db.query(query, [repository_id, file_path]); return result.rows; } async deleteFilesByCommit(commit_id) { const query = `DELETE FROM repository_commit_files WHERE commit_id = $1`; const result = await this.db.query(query, [commit_id]); return result.rowCount; } } module.exports = CommitFilesModel;