Add http service layer and repository service layer.

stable
Andrey Antukh 2014-06-11 17:05:42 +02:00
parent 225d655ff2
commit 00b5b759ff
5 changed files with 195 additions and 48 deletions

View File

@ -0,0 +1,67 @@
# Copyright (C) 2014 Andrey Antukh <niwi@niwi.be>
# Copyright (C) 2014 Jesús Espino Garcia <jespinog@gmail.com>
# Copyright (C) 2014 David Barragán Merino <bameda@dbarragan.com>
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU Affero General Public License as
# published by the Free Software Foundation, either version 3 of the
# License, or (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU Affero General Public License for more details.
#
# You should have received a copy of the GNU Affero General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
taiga = @.taiga
class AuthService extends taiga.TaigaService
@.$inject = ["$rootScope", "$tgStorage", "$tgModel", "$tgHttp"]
constructor: (@rootScope, @storage, @model, @http) ->
super()
getUser: ->
userData = @storage.get("userInfo")
if userData
return @model.make_model("users", userData)
return null
setUser: (user) ->
@rootScope.auth = user
@rootScope.$broadcast("i18n:change", user.default_language)
@gmStorage.set("userInfo", user.getAttrs())
clear: ->
@rootScope.auth = null
@gmStorage.remove("userInfo")
setToken: (token) ->
@storage.set("token", token)
getToken: ->
return @storage.get("token")
login: (username, password) ->
url = @urls.resolve("auth")
data = {
username: username
password: password
}
return @http.post(url, data).then (data, status) =>
user = @model.make_model("users", data)
@.setToken(data["auth_token"])
@.setUser(user)
return user
isAuthenticated: ->
if @.getUser() != null
return true
return false
module = angular.module("taigaAuth", ["taigaResources"])
module.service("$tgAuth", AuthService)

View File

@ -0,0 +1,67 @@
# Copyright (C) 2014 Andrey Antukh <niwi@niwi.be>
# Copyright (C) 2014 Jesús Espino Garcia <jespinog@gmail.com>
# Copyright (C) 2014 David Barragán Merino <bameda@dbarragan.com>
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU Affero General Public License as
# published by the Free Software Foundation, either version 3 of the
# License, or (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU Affero General Public License for more details.
#
# You should have received a copy of the GNU Affero General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
taiga = @.taiga
class HttpService extends taiga.TaigaService
@.$inject = ["$http", "$q", "$tgStorage"]
headers: ->
token = @storage.get('token')
if token
return {"Authorization":"Bearer #{token}"}
return {}
constructor: (@http, @q, @storage) ->
super()
request: (options) ->
options.headers = _.merge({}, options.headers or {}, @.headers())
if _.isPlainObject(options.data)
options.data = JSON.stringify(options.data)
return @http(options)
get: (url, params) ->
return @.request({
method: "GET",
params: params
})
post: (url, data, params) ->
options = {method: "POST"}
options.data = data if data
options.params = params if params
return @.request(options)
put: (url, data, params) ->
options = {method: "PUT"}
options.data = data if data
options.params = params if params
return @.request(options)
patch: (url, data, params) ->
options = {method: "PATCH"}
options.data = data if data
options.params = params if params
return @.request(options)
delete: (url, data, params) ->
options = {method: "DELETE"}
options.data = data if data
options.params = params if params
return @.request(options)

View File

@ -1,3 +1,20 @@
# Copyright (C) 2014 Andrey Antukh <niwi@niwi.be>
# Copyright (C) 2014 Jesús Espino Garcia <jespinog@gmail.com>
# Copyright (C) 2014 David Barragán Merino <bameda@dbarragan.com>
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU Affero General Public License as
# published by the Free Software Foundation, either version 3 of the
# License, or (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU Affero General Public License for more details.
#
# You should have received a copy of the GNU Affero General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
init = (urls) ->
urls.update({
"auth": "/api/v1/auth"

View File

@ -115,15 +115,16 @@ class Model
return model
provider = ($q, $http, $gmUrls, $gmStorage) ->
headers = ->
token = $gmStorage.get('token')
if token
return {"Authorization":"Bearer #{token}"}
return {}
taiga = @.taiga
class ModelService extends taiga.TaigaService
@.$inject = ["$q", "$tgUrls", "$tgStorage", "$tgHttp"]
constructor: (@q, @urls, @storage, @http) ->
super()
provider = ($q, $http, $gmUrls, $gmStorage) ->
service = {}
service.headers = headers
service.make_model = (name, data, cls=Model, dataTypes={}) ->
return new cls(name, data, dataTypes)

View File

@ -18,33 +18,20 @@
taiga = @.taiga
class RepositoryService extends taiga.TaigaService
@.$inject = ["$http", "$q", "$tgModel", "$tgStorage"]
@.$inject = ["$q", "$tgModel", "$tgStorage", "$tgHttp"]
constructor: (@http, @q, @model, @storage) ->
constructor: (@q, @model, @storage, @http) ->
super()
headers: ->
token = @.storage.get('token')
if token
return {"Authorization":"Bearer #{token}"}
return {}
resolveUrlForModel: (model) ->
idAttrName = model.getIdAttrName()
return "#{@urls.resolve(model.name)}/#{model[idAttrName]}"
create: (name, data, dataTypes={}, extraParams={}) ->
defered = @q.defer()
url = @urls.resolve(name)
params = {
method: "POST"
url: @urls.resolve(name)
headers: headers()
data: JSON.stringify(data)
params: extraParams
}
promise = @http(params)
promise = @http.post(url, JSON.stringify(data))
promise.success (_data, _status) =>
defered.resolve(@model.make_model(name, _data, null, dataTypes))
@ -55,14 +42,9 @@ class RepositoryService extends taiga.TaigaService
remove: (model) ->
defered = $q.defer()
url = @.resolveUrlForModel(model)
params = {
method: "DELETE"
url: @.resolveUrlForModel(model)
headers: @.headers()
}
promise = @http(params)
promise = @http.delete(url)
promise.success (data, status) ->
defered.resolve(model)
@ -78,20 +60,14 @@ class RepositoryService extends taiga.TaigaService
defered.resolve(model)
return defered.promise
params = {
url: @.resolveUrlForModel(model)
headers: @.headers()
}
url = @.resolveUrlForModel(model)
data = JSON.stringify(model.getAttrs(patch))
if patch
params.method = "PATCH"
promise = @http.patch(url, data)
else
params.method = "PUT"
promise = @http.put(url, data)
params.data = JSON.stringify(model.getAttrs(patch))
params = _.extend({}, params, extraParams)
promise = @http(params)
promise.success (data, status) =>
model._isModified = false
model._attrs = _.extend(model.getAttrs(), data)
@ -107,13 +83,9 @@ class RepositoryService extends taiga.TaigaService
refresh: (model) ->
defered = $q.defer()
params = {
method: "GET",
url: @.resolveUrlForModel(model)
headers: @.headers()
}
promise = @http(params)
url = @.resolveUrlForModel(model)
promise = @http.get(url)
promise.success (data, status) ->
model._modifiedAttrs = {}
model._attrs = data
@ -127,5 +99,28 @@ class RepositoryService extends taiga.TaigaService
return defered.promise
queryMany: (name, params) ->
url = @urls.resolve(name)
return @http.get(url, params).then (data, status) ->
return _.map(data, (x) -> @model.make_model(name, x))
queryOne: (name, id, params) ->
url = @urls.resolve(name)
url = "#{url}/#{id}" if id
return @http.get(url, params).then (data, status) ->
return @model.make_model(name, data)
queryPaginated: (name, params) ->
url = @urls.resolve(name)
return @http.get(url, params).then (data, status, headers) ->
headers = headers()
result = {}
result.models = _.map(data, (x) -> @model.make_model(name, x))
result.count = parseInt(headers["x-pagination-count"], 10)
result.current = parseInt(headers["x-pagination-current"] or 1, 10)
result.paginatedBy = parseInt(headers["x-paginated-by"], 10)
return result
module = angular.module("taigaResources")
module.service("resources", RepositoryService)
module.service("$tgRepo", RepositoryService)