mirror of
https://github.com/yu-i-i/overleaf-cep.git
synced 2026-11-14 22:23:42 +01:00
Merge pull request #1187 from sharelatex/ta-publisher-membership
Add Publisher Entity for UserMemberships GitOrigin-RevId: 862b1e4fe6d33b63ddfdaef47c02809c4558f9cc
This commit is contained in:
committed by
sharelatex
parent
be6950292d
commit
dffb6bc7a2
@@ -18,6 +18,9 @@ module.exports =
|
|||||||
requireInstitutionAccess: (req, res, next) ->
|
requireInstitutionAccess: (req, res, next) ->
|
||||||
requireAccessToEntity('institution', req.params.id, req, res, next)
|
requireAccessToEntity('institution', req.params.id, req, res, next)
|
||||||
|
|
||||||
|
requirePublisherAccess: (req, res, next) ->
|
||||||
|
requireAccessToEntity('publisher', req.params.id, req, res, next)
|
||||||
|
|
||||||
requireGraphAccess: (req, res, next) ->
|
requireGraphAccess: (req, res, next) ->
|
||||||
requireAccessToEntity(
|
requireAccessToEntity(
|
||||||
req.query.resource_type, req.query.resource_id, req, res, next
|
req.query.resource_type, req.query.resource_id, req, res, next
|
||||||
|
|||||||
@@ -62,3 +62,19 @@ module.exports =
|
|||||||
pathsFor: (id) ->
|
pathsFor: (id) ->
|
||||||
addMember: "/manage/institutions/#{id}/managers"
|
addMember: "/manage/institutions/#{id}/managers"
|
||||||
removeMember: "/manage/institutions/#{id}/managers"
|
removeMember: "/manage/institutions/#{id}/managers"
|
||||||
|
|
||||||
|
publisher:
|
||||||
|
modelName: 'Publisher'
|
||||||
|
fields:
|
||||||
|
primaryKey: 'slug'
|
||||||
|
read: ['managerIds']
|
||||||
|
write: 'managerIds'
|
||||||
|
access: 'managerIds'
|
||||||
|
name: 'name'
|
||||||
|
translations:
|
||||||
|
title: 'publisher_account'
|
||||||
|
subtitle: 'managers_management'
|
||||||
|
remove: 'remove_manager'
|
||||||
|
pathsFor: (id) ->
|
||||||
|
addMember: "/manage/publishers/#{id}/managers"
|
||||||
|
removeMember: "/manage/publishers/#{id}/managers"
|
||||||
|
|||||||
@@ -4,6 +4,7 @@ Errors = require('../Errors/Errors')
|
|||||||
EntityModels =
|
EntityModels =
|
||||||
Institution: require('../../models/Institution').Institution
|
Institution: require('../../models/Institution').Institution
|
||||||
Subscription: require('../../models/Subscription').Subscription
|
Subscription: require('../../models/Subscription').Subscription
|
||||||
|
Publisher: require('../../models/Publisher').Publisher
|
||||||
UserMembershipViewModel = require('./UserMembershipViewModel')
|
UserMembershipViewModel = require('./UserMembershipViewModel')
|
||||||
UserGetter = require('../User/UserGetter')
|
UserGetter = require('../User/UserGetter')
|
||||||
logger = require('logger-sharelatex')
|
logger = require('logger-sharelatex')
|
||||||
|
|||||||
@@ -43,3 +43,14 @@ module.exports =
|
|||||||
webRouter.delete "/manage/institutions/:id/managers/:userId",
|
webRouter.delete "/manage/institutions/:id/managers/:userId",
|
||||||
UserMembershipAuthorization.requireInstitutionAccess,
|
UserMembershipAuthorization.requireInstitutionAccess,
|
||||||
UserMembershipController.remove
|
UserMembershipController.remove
|
||||||
|
|
||||||
|
# publisher members routes
|
||||||
|
webRouter.get "/manage/publishers/:id/managers",
|
||||||
|
UserMembershipAuthorization.requirePublisherAccess,
|
||||||
|
UserMembershipController.index
|
||||||
|
webRouter.post "/manage/publishers/:id/managers",
|
||||||
|
UserMembershipAuthorization.requirePublisherAccess,
|
||||||
|
UserMembershipController.add
|
||||||
|
webRouter.delete "/manage/publishers/:id/managers/:userId",
|
||||||
|
UserMembershipAuthorization.requirePublisherAccess,
|
||||||
|
UserMembershipController.remove
|
||||||
|
|||||||
@@ -0,0 +1,34 @@
|
|||||||
|
mongoose = require 'mongoose'
|
||||||
|
Schema = mongoose.Schema
|
||||||
|
ObjectId = Schema.ObjectId
|
||||||
|
settings = require 'settings-sharelatex'
|
||||||
|
request = require 'request'
|
||||||
|
|
||||||
|
PublisherSchema = new Schema
|
||||||
|
slug: { type: String, required: true }
|
||||||
|
managerIds: [ type:ObjectId, ref:'User' ]
|
||||||
|
|
||||||
|
# fetch publisher's (brand on v1) data from v1 API. Errors are ignored
|
||||||
|
PublisherSchema.method 'fetchV1Data', (callback = (error, publisher)->) ->
|
||||||
|
request {
|
||||||
|
baseUrl: settings.apis.v1.url
|
||||||
|
url: "/api/v2/brands/#{this.slug}"
|
||||||
|
method: 'GET'
|
||||||
|
auth:
|
||||||
|
user: settings.apis.v1.user
|
||||||
|
pass: settings.apis.v1.pass
|
||||||
|
sendImmediately: true
|
||||||
|
}, (error, response, body) =>
|
||||||
|
try parsedBody = JSON.parse(body) catch e
|
||||||
|
this.name = parsedBody?.name
|
||||||
|
this.partner = parsedBody?.partner
|
||||||
|
callback(null, this)
|
||||||
|
|
||||||
|
conn = mongoose.createConnection(settings.mongo.url, {
|
||||||
|
server: {poolSize: settings.mongo.poolSize || 10},
|
||||||
|
config: {autoIndex: false}
|
||||||
|
})
|
||||||
|
|
||||||
|
Publisher = conn.model 'Publisher', PublisherSchema
|
||||||
|
exports.Publisher = Publisher
|
||||||
|
exports.PublisherSchema = PublisherSchema
|
||||||
@@ -29,6 +29,11 @@ describe 'UserMembershipHandler', ->
|
|||||||
v1Id: 123
|
v1Id: 123
|
||||||
managerIds: [ObjectId(), ObjectId(), ObjectId()]
|
managerIds: [ObjectId(), ObjectId(), ObjectId()]
|
||||||
update: sinon.stub().yields(null)
|
update: sinon.stub().yields(null)
|
||||||
|
@publisher =
|
||||||
|
_id: 'mock-publisher-id'
|
||||||
|
slug: 'slug'
|
||||||
|
managerIds: [ObjectId(), ObjectId()]
|
||||||
|
update: sinon.stub().yields(null)
|
||||||
|
|
||||||
@UserMembershipViewModel =
|
@UserMembershipViewModel =
|
||||||
buildAsync: sinon.stub().yields(null, { _id: 'mock-member-id'})
|
buildAsync: sinon.stub().yields(null, { _id: 'mock-member-id'})
|
||||||
@@ -39,12 +44,15 @@ describe 'UserMembershipHandler', ->
|
|||||||
findOne: sinon.stub().yields(null, @institution)
|
findOne: sinon.stub().yields(null, @institution)
|
||||||
@Subscription =
|
@Subscription =
|
||||||
findOne: sinon.stub().yields(null, @subscription)
|
findOne: sinon.stub().yields(null, @subscription)
|
||||||
|
@Publisher =
|
||||||
|
findOne: sinon.stub().yields(null, @publisher)
|
||||||
@UserMembershipHandler = SandboxedModule.require modulePath, requires:
|
@UserMembershipHandler = SandboxedModule.require modulePath, requires:
|
||||||
'./UserMembershipViewModel': @UserMembershipViewModel
|
'./UserMembershipViewModel': @UserMembershipViewModel
|
||||||
'../User/UserGetter': @UserGetter
|
'../User/UserGetter': @UserGetter
|
||||||
'../Errors/Errors': Errors
|
'../Errors/Errors': Errors
|
||||||
'../../models/Institution': Institution: @Institution
|
'../../models/Institution': Institution: @Institution
|
||||||
'../../models/Subscription': Subscription: @Subscription
|
'../../models/Subscription': Subscription: @Subscription
|
||||||
|
'../../models/Publisher': Publisher: @Publisher
|
||||||
'logger-sharelatex':
|
'logger-sharelatex':
|
||||||
log: ->
|
log: ->
|
||||||
err: ->
|
err: ->
|
||||||
@@ -94,6 +102,15 @@ describe 'UserMembershipHandler', ->
|
|||||||
expect(error).to.not.be.an.instanceof(Errors.NotFoundError)
|
expect(error).to.not.be.an.instanceof(Errors.NotFoundError)
|
||||||
done()
|
done()
|
||||||
|
|
||||||
|
describe 'publishers', ->
|
||||||
|
it 'get publisher', (done) ->
|
||||||
|
@UserMembershipHandler.getEntity @publisher.slug, EntityConfigs.publisher, @user, (error, institution) =>
|
||||||
|
should.not.exist(error)
|
||||||
|
expectedQuery = slug: @publisher.slug, managerIds: ObjectId(@user._id)
|
||||||
|
assertCalledWith(@Publisher.findOne, expectedQuery)
|
||||||
|
expect(institution).to.equal @publisher
|
||||||
|
done()
|
||||||
|
|
||||||
describe 'getUsers', ->
|
describe 'getUsers', ->
|
||||||
describe 'group', ->
|
describe 'group', ->
|
||||||
it 'build view model for all users', (done) ->
|
it 'build view model for all users', (done) ->
|
||||||
|
|||||||
Reference in New Issue
Block a user