Ivan - Fix authorUser/authorStaff issues, fix date, add tests for ticket events [skip ci]

This commit is contained in:
ivan 2016-11-20 19:00:39 -03:00
parent 66281df491
commit 8b3c8bf284
6 changed files with 201 additions and 46 deletions

View File

@ -5,6 +5,8 @@ DataValidator::with('CustomValidations', true);
class CloseController extends Controller {
const PATH = '/close';
private $ticket;
public function validations() {
return [
'permission' => 'user',
@ -18,34 +20,48 @@ class CloseController extends Controller {
}
public function handler() {
$ticketNumber = Controller::request('ticketNumber');
$ticket = Ticket::getByTicketNumber($ticketNumber);
$user = Controller::getLoggedUser();
$this->ticket = Ticket::getByTicketNumber(Controller::request('ticketNumber'));
if(!Controller::isStaffLogged() && $ticket->author->id !== $user->id){
if($this->shouldDenyPermission()) {
Response::respondError(ERRORS::NO_PERMISSION);
return;
}
if(Controller::isStaffLogged() && $ticket->owner && $ticket->owner->id !== $user->id){
Response::respondError(ERRORS::NO_PERMISSION);
return;
}
if(Controller::isStaffLogged()) {
$ticket->unread = true;
} else {
$ticket->unreadStaff = true;
}
$event = Ticketevent::getEvent(Ticketevent::CLOSE);
$event->setProperties(array(
'authorStaff' => Controller::getLoggedUser(),
'date' => Date::getCurrentDate()
));
$ticket->addEvent($event);
$ticket->closed = true;
$ticket->store();
$this->markAsUnread();
$this->addCloseEvent();
$this->ticket->closed = true;
$this->ticket->store();
Response::respondSuccess();
}
private function shouldDenyPermission() {
$user = Controller::getLoggedUser();
return (!Controller::isStaffLogged() && $this->ticket->author->id !== $user->id) ||
(Controller::isStaffLogged() && $this->ticket->owner && $this->ticket->owner->id !== $user->id);
}
private function markAsUnread() {
if(Controller::isStaffLogged()) {
$this->ticket->unread = true;
} else {
$this->ticket->unreadStaff = true;
}
}
private function addCloseEvent() {
$event = Ticketevent::getEvent(Ticketevent::CLOSE);
$event->setProperties(array(
'date' => Date::getCurrentDate()
));
if(Controller::isStaffLogged()) {
$event->authorStaff = Controller::getLoggedUser();
} else {
$event->authorUser = Controller::getLoggedUser();
}
$this->ticket->addEvent($event);
}
}

View File

@ -52,10 +52,12 @@ class CommentController extends Controller {
if(Controller::isStaffLogged()) {
$this->ticket->unread = true;
$comment->authorStaff = Controller::getLoggedUser();
} else {
$this->ticket->unreadStaff = true;
$comment->authorUser = Controller::getLoggedUser();
}
$comment->authorUser = Controller::getLoggedUser();
$this->ticket->addEvent($comment);
$this->ticket->store();
}

View File

@ -4,6 +4,8 @@ use Respect\Validation\Validator as DataValidator;
class ReOpenController extends Controller {
const PATH = '/re-open';
private $ticket;
public function validations() {
return [
'permission' => 'user',
@ -17,32 +19,49 @@ class ReOpenController extends Controller {
}
public function handler() {
$ticketNumber = Controller::request('ticketNumber');
$ticket = Ticket::getByTicketNumber($ticketNumber);
$user = Controller::getLoggedUser();
$this->ticket = Ticket::getByTicketNumber(Controller::request('ticketNumber'));
if(!Controller::isStaffLogged() && $ticket->author->id !== $user->id){
if($this->shouldDenyPermission()) {
Response::respondError(ERRORS::NO_PERMISSION);
return;
}
if(Controller::isStaffLogged() && $ticket->owner && $ticket->owner->id !== $user->id){
Response::respondError(ERRORS::NO_PERMISSION);
return;
}
if(Controller::isStaffLogged()) {
$ticket->unread = true;
} else {
$ticket->unreadStaff = true;
}
$event = Ticketevent::getEvent(Ticketevent::RE_OPEN);
$event->setProperties(array(
'authorUser' => Controller::getLoggedUser(),
'date' => Date::getCurrentDate()
));
$ticket->addEvent($event);
$ticket->closed = false;
$ticket->store();
$this->markAsUnread();
$this->addReopenEvent();
$this->ticket->closed = false;
$this->ticket->store();
Response::respondSuccess();
}
private function shouldDenyPermission() {
$user = Controller::getLoggedUser();
return (!Controller::isStaffLogged() && $this->ticket->author->id !== $user->id) ||
(Controller::isStaffLogged() && $this->ticket->owner && $this->ticket->owner->id !== $user->id);
}
private function markAsUnread() {
if(Controller::isStaffLogged()) {
$this->ticket->unread = true;
} else {
$this->ticket->unreadStaff = true;
}
}
private function addReopenEvent() {
$event = Ticketevent::getEvent(Ticketevent::RE_OPEN);
$event->setProperties(array(
'date' => Date::getCurrentDate()
));
if(Controller::isStaffLogged()) {
$event->authorStaff = Controller::getLoggedUser();
} else {
$event->authorUser = Controller::getLoggedUser();
}
$this->ticket->addEvent($event);
}
}

View File

@ -1,6 +1,6 @@
<?php
class Date {
public static function getCurrentDate() {
return date('F j, Y, g:i a');
return date('Ymd');
}
}

View File

@ -31,5 +31,6 @@ require './staff/un-assign-ticket.rb'
require './staff/get-tickets.rb'
require './ticket/change-priority.rb'
require './staff/get-new-tickets.rb'
require './ticket/events.rb'

117
tests/ticket/events.rb Normal file
View File

@ -0,0 +1,117 @@
describe 'Ticket Events' do
request('/user/logout')
Scripts.createUser('tyrion@opensupports.com', 'tyrionl', 'Tyrion Lannister')
it 'should add events correctly' do
Scripts.login('tyrion@opensupports.com', 'tyrionl')
response = request('/ticket/create', {
title: 'Ticket with many events',
content: 'This is a ticket with many events',
departmentId: 1,
csrf_userid: $csrf_userid,
csrf_token: $csrf_token
})
ticketNumber = response['data']['ticketNumber']
request('/user/logout')
Scripts.login($staff[:email], $staff[:password], true)
request('/staff/assign-ticket', {
ticketNumber: ticketNumber,
csrf_userid: $csrf_userid,
csrf_token: $csrf_token
})
request('/ticket/comment', {
content: 'This is a comment made by a staff',
ticketNumber: ticketNumber,
csrf_userid: $csrf_userid,
csrf_token: $csrf_token
})
request('/staff/un-assign-ticket', {
ticketNumber: ticketNumber,
csrf_userid: $csrf_userid,
csrf_token: $csrf_token
})
request('/staff/assign-ticket', {
ticketNumber: ticketNumber,
csrf_userid: $csrf_userid,
csrf_token: $csrf_token
})
request('/ticket/change-priority', {
priority: 'medium',
ticketNumber: ticketNumber,
csrf_userid: $csrf_userid,
csrf_token: $csrf_token
})
request('/ticket/change-department', {
departmentId: 2,
ticketNumber: ticketNumber,
csrf_userid: $csrf_userid,
csrf_token: $csrf_token
})
request('/ticket/close', {
ticketNumber: ticketNumber,
csrf_userid: $csrf_userid,
csrf_token: $csrf_token
})
request('/user/logout')
Scripts.login('tyrion@opensupports.com', 'tyrionl')
request('/ticket/re-open', {
ticketNumber: ticketNumber,
csrf_userid: $csrf_userid,
csrf_token: $csrf_token
})
request('/ticket/comment', {
content: 'This is a comment made by a regular user',
ticketNumber: ticketNumber,
csrf_userid: $csrf_userid,
csrf_token: $csrf_token
})
result = request('/ticket/get', {
ticketNumber: ticketNumber,
csrf_userid: $csrf_userid,
csrf_token: $csrf_token
})
(result['data']['events'][0]['type']).should.equal('ASSIGN')
(result['data']['events'][0]['author']['name']).should.equal('Emilia Clarke')
(result['data']['events'][0]['author']['staff']).should.equal(true)
(result['data']['events'][1]['type']).should.equal('COMMENT')
(result['data']['events'][1]['content']).should.equal('This is a comment made by a staff')
(result['data']['events'][1]['author']['name']).should.equal('Emilia Clarke')
(result['data']['events'][1]['author']['staff']).should.equal(true)
(result['data']['events'][2]['type']).should.equal('UN_ASSIGN')
(result['data']['events'][2]['author']['name']).should.equal('Emilia Clarke')
(result['data']['events'][2]['author']['staff']).should.equal(true)
(result['data']['events'][3]['type']).should.equal('ASSIGN')
(result['data']['events'][3]['author']['name']).should.equal('Emilia Clarke')
(result['data']['events'][3]['author']['staff']).should.equal(true)
(result['data']['events'][4]['type']).should.equal('PRIORITY_CHANGED')
(result['data']['events'][4]['content']).should.equal('medium')
(result['data']['events'][4]['author']['name']).should.equal('Emilia Clarke')
(result['data']['events'][4]['author']['staff']).should.equal(true)
(result['data']['events'][5]['type']).should.equal('DEPARTMENT_CHANGED')
(result['data']['events'][5]['content']).should.equal('Suggestions')
(result['data']['events'][5]['author']['name']).should.equal('Emilia Clarke')
(result['data']['events'][5]['author']['staff']).should.equal(true)
(result['data']['events'][6]['type']).should.equal('CLOSE')
(result['data']['events'][6]['author']['name']).should.equal('Emilia Clarke')
(result['data']['events'][6]['author']['staff']).should.equal(true)
(result['data']['events'][7]['type']).should.equal('RE_OPEN')
(result['data']['events'][7]['author']['name']).should.equal('Tyrion Lannister')
(result['data']['events'][7]['author']['staff']).should.equal(false)
(result['data']['events'][8]['type']).should.equal('COMMENT')
(result['data']['events'][8]['content']).should.equal('This is a comment made by a regular user')
(result['data']['events'][8]['author']['name']).should.equal('Tyrion Lannister')
(result['data']['events'][8]['author']['staff']).should.equal(false)
end
end