Skip to content

Commit 2f59702

Browse files
committed
Add Facebook Ads
1 parent 009450b commit 2f59702

File tree

6 files changed

+181
-29
lines changed

6 files changed

+181
-29
lines changed

bin/etl.php

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,13 +4,18 @@
44

55
use AdsWarehouse\ETL\AdWords;
66
use AdsWarehouse\ETL\ETL;
7+
use AdsWarehouse\ETL\FacebookAds;
8+
use FacebookAds\Api;
9+
use FacebookAds\Logger\CurlLogger;
710
use Google_Client;
811
use Google_Service_Analytics;
912
use Google_Service_AnalyticsReporting;
1013
use Monolog\Handler\ErrorLogHandler;
1114
use PDO;
1215
use Siler\Monolog as Log;
1316

17+
date_default_timezone_set(getenv('TZ'));
18+
1419
$basedir = dirname(__DIR__, 1);
1520
require_once "$basedir/vendor/autoload.php";
1621

@@ -26,9 +31,15 @@
2631
$google_client->setScopes([Google_Service_Analytics::ANALYTICS_READONLY]);
2732

2833
$analytics = new Google_Service_AnalyticsReporting($google_client);
34+
$api = Api::init(getenv('FB_APP_ID'), getenv('FB_APP_SECRET'), getenv('FB_ACCESS_TOKEN'));
35+
36+
if (getenv('APP_DEBUG') === 'true') {
37+
$api->setLogger(new CurlLogger());
38+
}
2939

3040
$elt = [
3141
new AdWords($warehouse, $analytics, getenv('GA_VIEW_ID')),
42+
new FacebookAds($warehouse, $api, getenv('FB_AD_ACCOUNT_ID')),
3243
];
3344

3445
array_walk($elt, function (ETL $etl): void {

composer.json

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,17 @@
11
{
22
"name": "multisolution/ads-warehouse",
3-
"description": "Data warehouse for multi-data-source ads campaings.",
3+
"description": "Data warehouse for multi-data-source ads campaigns.",
44
"type": "project",
55
"require": {
66
"ext-pdo": "*",
7+
"ext-json": "*",
78
"leocavalcante/siler": "dev-master",
89
"monolog/monolog": "^2.0",
910
"firebase/php-jwt": "^5.0",
1011
"webonyx/graphql-php": "^0.13.8",
1112
"google/apiclient": "^2.4",
12-
"ramsey/uuid": "^3.8"
13+
"ramsey/uuid": "^3.8",
14+
"facebook/php-business-sdk": "^5.0"
1315
},
1416
"require-dev": {
1517
"swoole/ide-helper": "^4.4",
@@ -28,7 +30,10 @@
2830
"AdsWarehouse\\": [
2931
"src/"
3032
]
31-
}
33+
},
34+
"files": [
35+
"src/helpers.php"
36+
]
3237
},
3338
"scripts": {
3439
"etl": "docker-compose exec -T server php bin/etl.php"

composer.lock

Lines changed: 38 additions & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

docker-compose.yml

Lines changed: 33 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -1,29 +1,37 @@
11
version: '3'
22
services:
3-
postgres:
4-
container_name: ads_warehouse_postgres
5-
image: postgres:alpine
6-
env_file: ./.env
7-
ports:
8-
- "${DOCKER_POSTGRES_PORT}:5432"
3+
postgres:
4+
container_name: ads_warehouse_postgres
5+
image: postgres:alpine
6+
env_file: ./.env
7+
ports:
8+
- "${DOCKER_POSTGRES_PORT}:5432"
99

10-
flyway:
11-
container_name: ads_warehouse_flyway
12-
image: flyway/flyway:latest-alpine
13-
command: migrate
14-
env_file: ./.env
15-
volumes:
16-
- ./src:/flyway/sql
17-
depends_on:
18-
- postgres
10+
flyway:
11+
container_name: ads_warehouse_flyway
12+
image: flyway/flyway:latest-alpine
13+
command: migrate
14+
env_file: ./.env
15+
volumes:
16+
- ./src:/flyway/sql
17+
depends_on:
18+
- postgres
1919

20-
server:
21-
container_name: ads_warehouse_server
22-
image: leocavalcante/dwoole:dev
23-
ports:
24-
- "${DOCKER_HTTP_PORT}:8000"
25-
volumes:
26-
- ./:/app
27-
env_file: ./.env
28-
environment:
29-
ENTRY_POINT_FILE: /app/bin/server.php
20+
server:
21+
container_name: ads_warehouse_server
22+
image: leocavalcante/dwoole:dev
23+
ports:
24+
- "${DOCKER_HTTP_PORT}:8000"
25+
volumes:
26+
- ./:/app
27+
env_file: ./.env
28+
environment:
29+
ENTRY_POINT_FILE: /app/bin/server.php
30+
31+
metabase:
32+
container_name: ads_warehouse_metabase
33+
image: metabase/metabase
34+
ports:
35+
- "${DOCKER_METABASE_PORT}:3000"
36+
links:
37+
- postgres

src/ETL/FacebookAds.php

Lines changed: 81 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,81 @@
1+
<?php declare(strict_types=1);
2+
3+
namespace AdsWarehouse\ETL;
4+
5+
use AdsWarehouse\Ad\Ad;
6+
use AdsWarehouse\Warehouse\Warehouse;
7+
use FacebookAds\Api;
8+
use FacebookAds\Object\AdAccount;
9+
use FacebookAds\Object\AdsInsights;
10+
use FacebookAds\Object\Values\AdsInsightsDatePresetValues;
11+
use Ramsey\Uuid\Uuid;
12+
use function AdsWarehouse\yesterday;
13+
14+
class FacebookAds extends ETL
15+
{
16+
const SOURCE = 'Facebook';
17+
18+
/** @var Api */
19+
private $api;
20+
/** @var string */
21+
private $adAccountId;
22+
23+
public function __construct(Warehouse $warehouse, Api $api, string $adAccountId)
24+
{
25+
parent::__construct($warehouse);
26+
$this->api = $api;
27+
$this->adAccountId = $adAccountId;
28+
}
29+
30+
protected function extract()
31+
{
32+
$fields = [
33+
'impressions',
34+
'spend',
35+
'cpm',
36+
'ctr',
37+
'clicks',
38+
'cpc',
39+
'campaign_name',
40+
];
41+
42+
$params = [
43+
'level' => 'campaign',
44+
'date_preset' => AdsInsightsDatePresetValues::YESTERDAY,
45+
];
46+
47+
$ad_account = new AdAccount($this->adAccountId);
48+
49+
return $ad_account->getInsights($fields, $params)->getArrayCopy();
50+
}
51+
52+
/**
53+
* @param AdsInsights[] $data
54+
* @return Ad[]
55+
*/
56+
protected function transform($data): array
57+
{
58+
return array_map(function (AdsInsights $insights): Ad {
59+
$data = $insights->getData();
60+
61+
$ad = new Ad();
62+
$ad->id = Uuid::uuid4();
63+
$ad->name = $data['campaign_name'];
64+
$ad->cost = $data['spend'];
65+
$ad->impressions = $data['impressions'];
66+
$ad->clicks = $data['clicks'];
67+
$ad->cpm = $data['cpm'];
68+
$ad->cpc = $data['cpc'];
69+
$ad->ctr = $data['ctr'];
70+
$ad->source = $this->getSource();
71+
$ad->date = yesterday();
72+
73+
return $ad;
74+
}, $data);
75+
}
76+
77+
protected function getSource(): string
78+
{
79+
return self::SOURCE;
80+
}
81+
}

src/helpers.php

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
<?php declare(strict_types=1);
2+
3+
namespace AdsWarehouse;
4+
5+
use DateTime;
6+
7+
function yesterday(): DateTime
8+
{
9+
return (new DateTime())->modify('-1 day');
10+
}

0 commit comments

Comments
 (0)