-
Notifications
You must be signed in to change notification settings - Fork 82
/
short.js
150 lines (133 loc) · 3.99 KB
/
short.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
/**
* Core Modules
*/
var mongoose = require('mongoose')
, ShortURL;
/**
* @method hasher
* @param {String} URL URL to be hashed
* @returns {String} hash Base 62 hash representation of the URL
*/
var hasher = exports.hasher = function(URL, length) {
if (!length) length = 6;
var AUID = [],
CHARS = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'.split('');
for (var i = 0; i < length; i++) {
AUID.push(CHARS[Math.floor(Math.random()*62)]);
}
return AUID.join('');
};
/**
* @method connect
* @param {String} mongdb Mongo DB String to connect to
*/
var connect = exports.connect = function(mongodb) {
mongoose.connect(mongodb);
// expose connection object
exports.connection = mongoose.connection;
createModel();
};
/**
* @expose createConnection
* This will create a connection, instead of using the global mongo connection.
*/
exports.createConnection = function createConnection(MongoURI) {
var connection = exports.connection = mongoose.createConnection(MongoURI, function(error) {
if (error) {
console.log('connection error: ' + require('util').inspect(error));
}
});
// Event when the db is connected
connection.once('open', function() {
console.log('short package opened connection to mongo db: ' + MongoURI);
});
createModel();
}
/**
* @method createModel
* Connect after a connection has been declared
* it is OK if not connected yet, mongoose buffers request
*/
function createModel() {
ShortURL = exports.ShortURL = require('../models/ShortURL');
}
/**
* @method generate
* @param {String} URL URL to create a Short URL of
* @param {Functon} callback Callback to execute on completion
*/
var generate = exports.generate = function(URL, options, callback) {
var hashedURL,
customData;
// options takes an optional object literal
// right now it only supports an options.length argument
if (arguments.length === 2 && arguments[1] instanceof Function) {
callback = arguments[1];
hashedURL = hasher(URL);
}
else if (arguments.length === 3 && arguments[1] instanceof Object && arguments[2] instanceof Function) {
hashedURL = (options.length) ? hasher(URL, options.length) : hasher(URL);
customData = (options.data) ? options.data : null;
}
else {
throw new Error("generate requires a URL and callback function!");
}
var item = new ShortURL({
URL : URL,
hash : hashedURL
});
if(customData) item.data = customData; // If we have custom data for the URl add it
item.save(function(error, item){
// tries to save to mongodb, if it exists it retries
if (error && error.code === 11000) {
console.log(hashedURL + ' already exists! retrying!');
if (options) {
generate(URL, options, callback);
} else {
generate(URL, callback);
}
} else {
callback(null, item);
}
});
};
/**
* @method retrieve
* @param {String} hash Hashed Base 62 URL to retrieve
* @param {Functon} callback Callback to execute on completion
*/
var retrieve = exports.retrieve = function(hash, options, callback) {
if (arguments.length === 2 && arguments[1] instanceof Function) {
callback = arguments[1];
options = {};
} else if (arguments.length === 3 && arguments[1] instanceof Object && arguments[2] instanceof Function) {
// options takes an optional object literal
// right now it only supports an options.visitor argument
} else {
throw new Error("retrieve requires a hash and callback function!");
}
ShortURL.findByHash(hash, options, function(error, shortenedURLObject) {
if (error) {
callback(error, null);
} else if (shortenedURLObject) {
callback(null, shortenedURLObject);
} else {
callback(null, null);
}
});
};
/**
* @method list
* @param {Function} callback
* List all Shortened URLs
*/
var list = exports.list = function(callback) {
ShortURL.find({}, function(error, urls) {
if (error) {
callback(error, null);
} else {
callback(null, urls);
}
});
};
/* EOF */