Skip to content
This repository was archived by the owner on Sep 19, 2018. It is now read-only.

Commit 624169f

Browse files
author
William Espindola
committed
Merge pull request #41 from PHPSP/develop
Atualizando master com a tela de contato
2 parents 5680c9d + 0c497e1 commit 624169f

File tree

12 files changed

+309
-2
lines changed

12 files changed

+309
-2
lines changed

Wireframe.jpg

78.8 KB
Loading

composer.json

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,8 @@
66
"respect/relational": "dev-master",
77
"respect/rest": "dev-master",
88
"respect/validation": "dev-master",
9-
"twig/twig": "1.*"
9+
"twig/twig": "1.*",
10+
"swiftmailer/swiftmailer" : "v5.0.2"
1011
},
1112
"require-dev": {
1213
"phpunit/phpunit": "3.7.*@dev",

config/config.ini.dist

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -50,4 +50,16 @@ paths = [view_path]
5050

5151
[twig Twig_Environment]
5252
loader = [loader]
53-
options = [options]
53+
options = [options]
54+
55+
; mailer parameters
56+
57+
[mailer]
58+
smtp = smtp.gmail.com
59+
port = 465
60+
ssl = true
61+
username =
62+
password =
63+
receiver_mail =
64+
receiver_name = PHPSP + Liga
65+
subject = Informativo Liga

public/index.php

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313

1414
$r->any('/upload', 'LigaSolidariaStorage\Storage\Controller\ArtefatoUploadController');
1515

16+
$r->any('/contact', 'LigaSolidariaStorage\Storage\Controller\ContactController', array($c->mailer));
1617

1718
$r->always(
1819
'Accept',
Lines changed: 83 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,83 @@
1+
<?php
2+
3+
namespace LigaSolidariaStorage\Storage\Controller;
4+
5+
use Respect\Rest\Routable;
6+
use LigaSolidariaStorage\Storage\Mailer\Sender;
7+
use LigaSolidariaStorage\Storage\Mailer\Message;
8+
use LigaSolidariaStorage\Storage\Exception\InvalidMessageException;
9+
10+
class ContactController implements Routable
11+
{
12+
const TEMPLATE = 'contact.html.twig';
13+
14+
protected $sender;
15+
16+
protected $receiverMail;
17+
18+
protected $receiverName;
19+
20+
protected $subject;
21+
22+
public function __construct($config)
23+
{
24+
$smtp = $config['smtp'];
25+
$port = $config['port'];
26+
$ssl = $config['ssl'] ? 'ssl' : null;
27+
$swiftTransport = \Swift_SmtpTransport::newInstance($smtp, $port, $ssl);
28+
$swiftTransport->setUsername($config['username']);
29+
$swiftTransport->setPassword($config['password']);
30+
$swiftSender = \Swift_Mailer::newInstance($swiftTransport);
31+
32+
$this->receiverMail = $config['receiver_mail'];
33+
$this->receiverName = $config['receiver_name'];
34+
$this->subject = $config['subject'];
35+
$this->sender = new Sender($swiftSender);
36+
}
37+
38+
public function get()
39+
{
40+
return array(
41+
'_view' => self::TEMPLATE
42+
);
43+
}
44+
45+
public function post()
46+
{
47+
$message = new Message();
48+
try {
49+
50+
$message->setSubject($this->subject.' : '.$_POST['reason']);
51+
$message->setFrom(array($_POST['email'] => $_POST['name']));
52+
$message->setTo(array($this->receiverMail));
53+
$message->setBody($_POST['message']);
54+
55+
$sent = $this->sender->send($message);
56+
} catch (\Swift_SwiftException $e) {
57+
return $this->getErrorResponse(array($e->getMessage()));
58+
} catch (InvalidMessageException $e) {
59+
return $this->getErrorResponse(array($e->getMessage()));
60+
}
61+
62+
if (!$sent) {
63+
return $this->getErrorResponse(array('E-mail não enviado'));
64+
}
65+
$response = array(
66+
'_view' => self::TEMPLATE,
67+
'success' => 'Email enviado com sucesso!',
68+
);
69+
70+
return $response;
71+
}
72+
73+
protected function getErrorResponse($messages)
74+
{
75+
header('HTTP/1.1 406');
76+
$response = array(
77+
'_view' => self::TEMPLATE ,
78+
'errors' => $messages
79+
);
80+
81+
return $response;
82+
}
83+
}
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
<?php
2+
3+
namespace LigaSolidariaStorage\Storage\Exception;
4+
5+
class InvalidMessageException extends \Exception{}
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
<?php
2+
3+
namespace LigaSolidariaStorage\Storage\Mailer;
4+
5+
class Message extends \Swift_Message implements MessageInterface
6+
{
7+
8+
}
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
<?php
2+
3+
namespace LigaSolidariaStorage\Storage\Mailer;
4+
5+
interface MessageInterface
6+
{
7+
public function setFrom($addresses, $name = null);
8+
9+
public function setBody($body);
10+
11+
public function setTo($addresses, $name = null);
12+
13+
public function setSubject($subject);
14+
}
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
<?php
2+
3+
namespace LigaSolidariaStorage\Storage\Mailer;
4+
5+
use LigaSolidariaStorage\Storage\Exception\InvalidMessageException;
6+
use Respect\Validation\Validator as v;
7+
8+
class Sender
9+
{
10+
protected $swiftSender;
11+
12+
public function __construct($sender)
13+
{
14+
$this->swiftSender = $sender;
15+
}
16+
17+
public function send(MessageInterface $message)
18+
{
19+
$this->validateMessage($message);
20+
return $this->swiftSender->send($message);
21+
}
22+
23+
protected function validateMessage(MessageInterface $message)
24+
{
25+
if (!$message->getFrom()) {
26+
throw new InvalidMessageException('E-mail de contato vazio');
27+
}
28+
29+
$text = trim($message->getBody());
30+
$bodyValidation = v::string()->notEmpty();
31+
if (!$bodyValidation->validate($text)) {
32+
throw new InvalidMessageException('Mensagem vazia');
33+
}
34+
}
35+
}

templates/contact.html.twig

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
{% extends "layouts/layout.html.twig" %}
2+
3+
{% block title %}Contato{% endblock %}
4+
5+
{% block content %}
6+
7+
{% if errors is defined and errors %}
8+
{% for error in errors%}
9+
<div class="alert alert-danger">{{ error|raw }}</div>
10+
{% endfor %}
11+
{% elseif success is defined and success %}
12+
<div class="alert alert-success">{{ success|raw }}</div>
13+
{% endif %}
14+
<form method="post" action="" role="form">
15+
<div class="form-group">
16+
<label for="name">Nome</label>
17+
<input type="text" class="form-control" id="name" name="name" required>
18+
</div>
19+
<div class="form-group">
20+
<label for="email">E-mail</label>
21+
<input type="email" class="form-control" id="email" name="email" required>
22+
</div>
23+
<div class="form-group">
24+
<label for="reason">Motivo</label>
25+
<select class="form-control" id="reason" name="reason">
26+
<option>Atrasos</option>
27+
<option>Outros</option>
28+
</select>
29+
</div>
30+
<div class="form-group">
31+
<label for="message">Mensagem</label>
32+
<textarea class='form-control' name="message" required>
33+
34+
</textarea>
35+
</div>
36+
<button type="submit" class="btn btn-default">Submit</button>
37+
</form>
38+
{% endblock %}

templates/elements/navbar.html.twig

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,9 @@
1414
<li>
1515
<a href="/list/">Arquivos</a>
1616
</li>
17+
<li>
18+
<a href="/contact/">Contato</a>
19+
</li>
1720
</ul>
1821
</div><!--/.nav -->
1922
</div>
Lines changed: 107 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,107 @@
1+
<?php
2+
3+
namespace LigaSolidariaStorage\Storage\Mailer;
4+
5+
class SenderTest extends \PHPUnit_Framework_TestCase
6+
{
7+
/**
8+
* @test
9+
* @expectedException \LigaSolidariaStorage\Storage\Exception\InvalidMessageException
10+
*/
11+
public function shouldNotSendEmailWithoutBody()
12+
{
13+
$transportSender = $this->getMockBuilder('\Swift_Sender')
14+
->disableOriginalConstructor()
15+
->getMock();
16+
$sender = new Sender($transportSender);
17+
$message = new Message();
18+
$message->setSubject('PHPSP rocks!');
19+
$message->setFrom(array('[email protected]' => 'foo bar'));
20+
$message->setTo(array('[email protected]'));
21+
// without body: $message->setBody('');
22+
23+
$sender->send($message);
24+
}
25+
26+
/**
27+
* @test
28+
* @expectedException \LigaSolidariaStorage\Storage\Exception\InvalidMessageException
29+
*/
30+
public function shouldNotSendEmailWithBodyOnlySpaces()
31+
{
32+
$transportSender = $this->getMockBuilder('\Swift_Sender')
33+
->disableOriginalConstructor()
34+
->getMock();
35+
$sender = new Sender($transportSender);
36+
$message = new Message();
37+
$message->setSubject('PHPSP rocks!');
38+
$message->setFrom(array('[email protected]' => 'foo bar'));
39+
$message->setTo(array('[email protected]'));
40+
$message->setBody(' ');
41+
42+
$sender->send($message);
43+
}
44+
45+
/**
46+
* @test
47+
* @expectedException \Swift_SwiftException
48+
*/
49+
public function shouldNotSendEmailWithoutFromEmail()
50+
{
51+
$transportSender = $this->getMockBuilder('\Swift_Sender')
52+
->disableOriginalConstructor()
53+
->getMock();
54+
$sender = new Sender($transportSender);
55+
$message = new Message();
56+
$message->setSubject('PHPSP rocks!');
57+
$message->setFrom(array('foo' => 'foo bar'));
58+
$message->setTo(array('[email protected]'));
59+
$message->setBody(' ');
60+
61+
$sender->send($message);
62+
}
63+
64+
/**
65+
* @test
66+
* @expectedException \Swift_SwiftException
67+
*/
68+
public function shouldNotSendEmailWithoutToEmail()
69+
{
70+
$transportSender = $this->getMockBuilder('\Swift_Sender')
71+
->disableOriginalConstructor()
72+
->getMock();
73+
$sender = new Sender($transportSender);
74+
$message = new Message();
75+
$message->setSubject('PHPSP rocks!');
76+
$message->setFrom(array('[email protected]' => 'foo bar'));
77+
$message->setTo(array('foo'));
78+
$message->setBody(' ');
79+
80+
$sender->send($message);
81+
}
82+
83+
/**
84+
* @test
85+
*/
86+
public function shouldSendEmail()
87+
{
88+
$transportSender = $this->getMockBuilder('\Swift_Sender')
89+
->disableOriginalConstructor()
90+
->setMethods(array('send'))
91+
->getMock();
92+
93+
$transportSender->expects($this->once())
94+
->method('send')
95+
->will($this->returnValue(true));
96+
97+
$sender = new Sender($transportSender);
98+
$message = new Message();
99+
$message->setSubject('PHPSP rocks!');
100+
$message->setFrom(array('[email protected]' => 'foo bar'));
101+
$message->setTo(array('[email protected]'));
102+
$message->setBody('foobar');
103+
104+
$this->assertTrue($sender->send($message));
105+
}
106+
107+
}

0 commit comments

Comments
 (0)