268 lines
4.9 KiB
JavaScript
268 lines
4.9 KiB
JavaScript
'use strict'
|
|
|
|
// Dependencies
|
|
let paths = require( '../utils/paths.class.js' ),
|
|
util = require( 'util' ),
|
|
slug = require( 'slug' ),
|
|
File = require( './file.class.js' )
|
|
|
|
class Project
|
|
{
|
|
constructor( options )
|
|
{
|
|
this.name = options.name
|
|
this.slug = slug( this.name )
|
|
this.folders = {
|
|
'.':
|
|
{
|
|
name : '.',
|
|
files : {},
|
|
folders: {}
|
|
}
|
|
}
|
|
|
|
this.set_socket( options.socket )
|
|
}
|
|
|
|
set_socket( socket )
|
|
{
|
|
// Set up
|
|
this.original_socket = socket
|
|
this.socket = this.original_socket.of( '/project/' + this.slug )
|
|
|
|
// Connection event
|
|
this.socket.on( 'connection', ( socket ) =>
|
|
{
|
|
console.log( 'socket projects'.green.bold + ' - ' + 'connect'.cyan + ' - ' + socket.id.cyan )
|
|
|
|
this.socket.emit( 'update_project', this.describe() )
|
|
} );
|
|
}
|
|
|
|
create_file( _path, _content )
|
|
{
|
|
// Set up
|
|
let normalized_path = paths.normalize( _path ),
|
|
parsed_path = paths.parse( normalized_path )
|
|
|
|
// Retrieve file
|
|
let file = this.get_file( normalized_path )
|
|
|
|
// File already exist
|
|
if( file )
|
|
return false
|
|
|
|
// Retrieve folder (force creation)
|
|
let folder = this.get_folder( parsed_path.dir, true )
|
|
|
|
// Create
|
|
file = new File( parsed_path.base )
|
|
folder.files[ file.name ] = file
|
|
|
|
// Has content
|
|
if( _content )
|
|
file.create_version( _content )
|
|
|
|
// Emit
|
|
this.socket.emit( 'update_project', this.describe() )
|
|
|
|
return file
|
|
}
|
|
|
|
get_file( _path, _force_creation )
|
|
{
|
|
// Params
|
|
if( typeof _force_creation === 'undefined' )
|
|
_force_creation = false
|
|
|
|
// Set up
|
|
let normalized_path = paths.normalize( _path ),
|
|
parsed_path = paths.parse( normalized_path )
|
|
|
|
// Retrieve folder
|
|
let folder = this.get_folder( parsed_path.dir, _force_creation )
|
|
|
|
// Folder not found
|
|
if( !folder )
|
|
return false
|
|
|
|
// Retrieve file
|
|
let file = folder.files[ parsed_path.base ]
|
|
|
|
// File found
|
|
if( file )
|
|
return file
|
|
|
|
// Force creation
|
|
if( _force_creation )
|
|
{
|
|
// Create folders
|
|
file = this.create_file( normalized_path )
|
|
|
|
return file
|
|
}
|
|
|
|
// Not found
|
|
return false
|
|
}
|
|
|
|
update_file( _path, _content )
|
|
{
|
|
// Set up
|
|
let normalized_path = paths.normalize( _path )
|
|
|
|
// Retrieve file
|
|
let file = this.get_file( normalized_path, true )
|
|
|
|
// Create version
|
|
file.create_version( _content )
|
|
|
|
// Emit
|
|
this.socket.emit( 'update_project', this.describe() )
|
|
}
|
|
|
|
delete_file( _path )
|
|
{
|
|
// Set up
|
|
let parsed_path = paths.parse( _path )
|
|
|
|
// Retrieve folder
|
|
let folder = this.get_folder( parsed_path.dir )
|
|
|
|
// Folder found
|
|
if( folder )
|
|
{
|
|
let file = folder.files[ parsed_path.base ]
|
|
|
|
// File found
|
|
if( file )
|
|
{
|
|
// Delete file
|
|
file.destructor()
|
|
delete folder.files[ parsed_path.base ]
|
|
|
|
// Emit
|
|
this.socket.emit( 'update_project', this.describe() )
|
|
}
|
|
}
|
|
}
|
|
|
|
create_folder( _path )
|
|
{
|
|
// Set up
|
|
let normalized_path = paths.normalize( _path ),
|
|
path_folders = normalized_path.split( paths.separator ),
|
|
folder = this
|
|
|
|
for( let _path_folder of path_folders )
|
|
{
|
|
// Temporary folder
|
|
let _folder = folder.folders[ _path_folder ]
|
|
|
|
// Folder doesn't exist
|
|
if( typeof _folder === 'undefined' )
|
|
{
|
|
_folder = {}
|
|
_folder.name = _path_folder
|
|
_folder.files = {}
|
|
_folder.folders = {}
|
|
|
|
folder.folders[ _path_folder ] = _folder
|
|
}
|
|
|
|
folder = _folder
|
|
}
|
|
|
|
// Emit
|
|
this.socket.emit( 'update_project', this.describe() )
|
|
|
|
return folder
|
|
}
|
|
|
|
get_folder( _path, _force_creation )
|
|
{
|
|
// Params
|
|
if( typeof _force_creation === 'undefined' )
|
|
_force_creation = false
|
|
|
|
let normalized_path = paths.normalize( _path ),
|
|
path_folders = normalized_path.split( paths.separator ),
|
|
folder = this,
|
|
found = true
|
|
|
|
for( let _path_folder of path_folders )
|
|
{
|
|
folder = folder.folders[ _path_folder ]
|
|
|
|
// Folder not found
|
|
if(typeof folder === 'undefined')
|
|
{
|
|
found = false
|
|
break
|
|
}
|
|
}
|
|
|
|
// Folder found
|
|
if( found )
|
|
return folder
|
|
|
|
// Force creation
|
|
if( _force_creation )
|
|
{
|
|
// Create folders
|
|
folder = this.create_folder( normalized_path )
|
|
|
|
return folder
|
|
}
|
|
|
|
// Not found
|
|
return false
|
|
}
|
|
|
|
delete_folder( _path )
|
|
{
|
|
// Set up
|
|
let normalized_path = paths.normalize( _path ),
|
|
folder = this.get_folder( normalized_path )
|
|
|
|
// Folder not found
|
|
if( !folder )
|
|
return false
|
|
|
|
// Recursive callback
|
|
let delete_folder = function( folder )
|
|
{
|
|
for( let _folder_name in folder.folders )
|
|
{
|
|
delete_folder( folder.folders[ _folder_name ] )
|
|
}
|
|
|
|
for( let _file_name in folder.files )
|
|
{
|
|
let file = folder.files[ _file_name ]
|
|
|
|
file.destructor()
|
|
delete folder.files[ _file_name ]
|
|
}
|
|
}
|
|
|
|
delete_folder( folder )
|
|
|
|
// Emit
|
|
this.socket.emit( 'update_project', this.describe() )
|
|
|
|
return true
|
|
}
|
|
|
|
describe()
|
|
{
|
|
let result = {}
|
|
result.name = this.name
|
|
result.folders = this.folders
|
|
|
|
return result
|
|
}
|
|
}
|
|
|
|
module.exports = Project
|