Add http service layer and repository service layer.
parent
225d655ff2
commit
00b5b759ff
|
@ -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)
|
|
@ -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)
|
|
@ -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) ->
|
init = (urls) ->
|
||||||
urls.update({
|
urls.update({
|
||||||
"auth": "/api/v1/auth"
|
"auth": "/api/v1/auth"
|
||||||
|
|
|
@ -115,15 +115,16 @@ class Model
|
||||||
return model
|
return model
|
||||||
|
|
||||||
|
|
||||||
provider = ($q, $http, $gmUrls, $gmStorage) ->
|
taiga = @.taiga
|
||||||
headers = ->
|
|
||||||
token = $gmStorage.get('token')
|
|
||||||
if token
|
|
||||||
return {"Authorization":"Bearer #{token}"}
|
|
||||||
return {}
|
|
||||||
|
|
||||||
|
class ModelService extends taiga.TaigaService
|
||||||
|
@.$inject = ["$q", "$tgUrls", "$tgStorage", "$tgHttp"]
|
||||||
|
|
||||||
|
constructor: (@q, @urls, @storage, @http) ->
|
||||||
|
super()
|
||||||
|
|
||||||
|
provider = ($q, $http, $gmUrls, $gmStorage) ->
|
||||||
service = {}
|
service = {}
|
||||||
service.headers = headers
|
|
||||||
service.make_model = (name, data, cls=Model, dataTypes={}) ->
|
service.make_model = (name, data, cls=Model, dataTypes={}) ->
|
||||||
return new cls(name, data, dataTypes)
|
return new cls(name, data, dataTypes)
|
||||||
|
|
||||||
|
|
|
@ -18,33 +18,20 @@
|
||||||
taiga = @.taiga
|
taiga = @.taiga
|
||||||
|
|
||||||
class RepositoryService extends taiga.TaigaService
|
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()
|
super()
|
||||||
|
|
||||||
headers: ->
|
|
||||||
token = @.storage.get('token')
|
|
||||||
if token
|
|
||||||
return {"Authorization":"Bearer #{token}"}
|
|
||||||
return {}
|
|
||||||
|
|
||||||
resolveUrlForModel: (model) ->
|
resolveUrlForModel: (model) ->
|
||||||
idAttrName = model.getIdAttrName()
|
idAttrName = model.getIdAttrName()
|
||||||
return "#{@urls.resolve(model.name)}/#{model[idAttrName]}"
|
return "#{@urls.resolve(model.name)}/#{model[idAttrName]}"
|
||||||
|
|
||||||
create: (name, data, dataTypes={}, extraParams={}) ->
|
create: (name, data, dataTypes={}, extraParams={}) ->
|
||||||
defered = @q.defer()
|
defered = @q.defer()
|
||||||
|
url = @urls.resolve(name)
|
||||||
|
|
||||||
params = {
|
promise = @http.post(url, JSON.stringify(data))
|
||||||
method: "POST"
|
|
||||||
url: @urls.resolve(name)
|
|
||||||
headers: headers()
|
|
||||||
data: JSON.stringify(data)
|
|
||||||
params: extraParams
|
|
||||||
}
|
|
||||||
|
|
||||||
promise = @http(params)
|
|
||||||
promise.success (_data, _status) =>
|
promise.success (_data, _status) =>
|
||||||
defered.resolve(@model.make_model(name, _data, null, dataTypes))
|
defered.resolve(@model.make_model(name, _data, null, dataTypes))
|
||||||
|
|
||||||
|
@ -55,14 +42,9 @@ class RepositoryService extends taiga.TaigaService
|
||||||
|
|
||||||
remove: (model) ->
|
remove: (model) ->
|
||||||
defered = $q.defer()
|
defered = $q.defer()
|
||||||
|
url = @.resolveUrlForModel(model)
|
||||||
|
|
||||||
params = {
|
promise = @http.delete(url)
|
||||||
method: "DELETE"
|
|
||||||
url: @.resolveUrlForModel(model)
|
|
||||||
headers: @.headers()
|
|
||||||
}
|
|
||||||
|
|
||||||
promise = @http(params)
|
|
||||||
promise.success (data, status) ->
|
promise.success (data, status) ->
|
||||||
defered.resolve(model)
|
defered.resolve(model)
|
||||||
|
|
||||||
|
@ -78,20 +60,14 @@ class RepositoryService extends taiga.TaigaService
|
||||||
defered.resolve(model)
|
defered.resolve(model)
|
||||||
return defered.promise
|
return defered.promise
|
||||||
|
|
||||||
params = {
|
url = @.resolveUrlForModel(model)
|
||||||
url: @.resolveUrlForModel(model)
|
data = JSON.stringify(model.getAttrs(patch))
|
||||||
headers: @.headers()
|
|
||||||
}
|
|
||||||
|
|
||||||
if patch
|
if patch
|
||||||
params.method = "PATCH"
|
promise = @http.patch(url, data)
|
||||||
else
|
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) =>
|
promise.success (data, status) =>
|
||||||
model._isModified = false
|
model._isModified = false
|
||||||
model._attrs = _.extend(model.getAttrs(), data)
|
model._attrs = _.extend(model.getAttrs(), data)
|
||||||
|
@ -107,13 +83,9 @@ class RepositoryService extends taiga.TaigaService
|
||||||
|
|
||||||
refresh: (model) ->
|
refresh: (model) ->
|
||||||
defered = $q.defer()
|
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) ->
|
promise.success (data, status) ->
|
||||||
model._modifiedAttrs = {}
|
model._modifiedAttrs = {}
|
||||||
model._attrs = data
|
model._attrs = data
|
||||||
|
@ -127,5 +99,28 @@ class RepositoryService extends taiga.TaigaService
|
||||||
return defered.promise
|
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 = angular.module("taigaResources")
|
||||||
module.service("resources", RepositoryService)
|
module.service("$tgRepo", RepositoryService)
|
||||||
|
|
Loading…
Reference in New Issue