Skip to content

Commit

Permalink
Merge pull request #38 from patrickjaja/feature/projektron-activity-p…
Browse files Browse the repository at this point in the history
…lugin

WIP: started adding projektron activity plugin
  • Loading branch information
patrickjaja authored Sep 19, 2024
2 parents e0c95c7 + fd5828d commit ecb0acf
Show file tree
Hide file tree
Showing 38 changed files with 480 additions and 261 deletions.
8 changes: 7 additions & 1 deletion .env.dist
Original file line number Diff line number Diff line change
Expand Up @@ -14,19 +14,21 @@ FORECAST_PROJECT_ID=94336
FORECAST_PERSON_ID=211932
FORECAST_FALLBACK_TASK_ID=2306965

GITLAB_TOKEN=xxxx
GITLAB_TOKEN=xxxx # read_api access
GITLAB_URL=https://gitlab.com
GITLAB_PATTERN=ticketnrpattern

MATTERMOST_PATTERN=pow
MATTERMOST_HOST=https://mattermost.nxs360.com
MATTERMOST_USER_ID=xxxx
MATTERMOST_PASSWORD=xxxxx
# https://mattermost.xxxx.com/api/v4/teams + bearer src/ForecastAutomation/MattermostClient/Business/MattermostApi.php:102
MATTERMOST_TEAM_ID=xxxxx

LOGGLY_CUSTOMER_TOKEN=xxxxx

PERIODICAL_ACTIVITY_CONFIG=[{"note":"Daily","duration":30,"project_id":"94336","frequency":"1,2,3,4,5,6,7"},{"note":"TeamMeeting","duration":30,"project_id":"94336","frequency":"1,2,3,4,5,6,7"}]
#PERIODICAL_ACTIVITY_CONFIG=[{"note":"Daily","duration":15,"project_id":"1701894153411_JTask","frequency":"1,2,3,4,5"},{"note":"Daily","duration":15,"project_id":"1684267402625_JTask","frequency":"1,2,3,4,5"},{"note":"Refinement","duration":60,"project_id":"1684267402625_JTask","frequency":"1"},{"note":"Refinement","duration":60,"project_id":"1701894153411_JTask","frequency":"1"},{"note":"Weekly","duration":60,"project_id":"1684267402625_JTask","frequency":"1"},{"note":"Offene Fragen","duration":60,"project_id":"1722812861432_JTask","frequency":"4"},{"note":"Abstimmung Projekte <> Dennis","duration":30,"project_id":"1650658262819_JTask","frequency":"4"}]

KAFKA_BROKER_LIST=localhost:9092

Expand All @@ -35,3 +37,7 @@ AMQP_PORT=5672
AMQP_VHOST=/
AMQP_USER=guest
AMQP_PASS=guest

PROJEKTRON_API_ENDPOINT=https://projektxxxxxxxxom/bcs/taskdetail/effortrecording/edit
PROJEKTRON_USERNAME=Patxxxxxeld@cexxxxxxxc.com
PROJEKTRON_COOKIE_HEADER_VALUE="_gcl_au=1.1.1981414287.1723202755; __qca=P0-1366456151-1723202755461; TABLET=false; COLOR_SCHEME=Light; BROWSER_ENCRYPTION_KEY=vtzQfWGcFnlGthQeytSHMA4JK7KsRufo88WdH+Wq0WQ=; OAuthCSRFState=ON37WtPOoO2RHsmEH1-UUzQTYfbcek8awCA2Z414eDk; JSESSIONID=2A5D40360E279xxxxxxx; CSRF_Token=ui81iqm7pLqSpxxxxxxx"
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@ With this application, you can automate your time accounting and have clear fair
(will create an activity if you [comment or approve](src/ForecastAutomation/GitlabClient/Shared/Plugin/GitlabActivityPlugin.php#L25) a MR by consuming gitlab event api)
- [mattermost](src/ForecastAutomation/MattermostClient/Shared/Plugin/MattermostActivityPlugin.php)
(will create an activity if you [direct message](src/ForecastAutomation/MattermostClient/Business/MattermostApi.php#L112) a text that [contains a ticketnumber](src/ForecastAutomation/MattermostClient/Shared/Plugin/MattermostActivityPlugin.php#L53))
- [periodical activity](src/ForecastAutomation/PeriodicalActivityDataImport/Shared/Plugin/PeriodicalActivityDataImportConsoleCommandPlugin.php)
- [periodical activity](src/ForecastAutomation/PeriodicalActivity/Shared/Plugin/PeriodicalActivityDataImportConsoleCommandPlugin.php)
(will create weekly repeating activities based on [configuration](.env.dist#L29))
### ✨ How to use
- run `composer run import` at the end of the day (date('Y-m-d 00:00') used by default) to fill your forecast.it timesheet with your [enabled activity plugins](src/ForecastAutomation/Activity/ActivityDependencyProvider.php)
Expand Down
6 changes: 5 additions & 1 deletion composer.json
Original file line number Diff line number Diff line change
Expand Up @@ -6,10 +6,14 @@
"platform": {
"php": "8.0",
"ext-amqp": "1.11.0beta"
},
"allow-plugins": {
"dealerdirect/phpcodesniffer-composer-installer": true,
"infection/extension-installer": true
}
},
"require": {
"lesstif/php-jira-rest-client": "^2.5",
"lesstif/php-jira-rest-client": "^5.8",
"guzzlehttp/guzzle": "^7.3",
"symfony/dotenv": "^5.3",
"vlucas/phpdotenv": "^5.3",
Expand Down
85 changes: 45 additions & 40 deletions composer.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Original file line number Diff line number Diff line change
Expand Up @@ -19,19 +19,24 @@
use ForecastAutomation\MattermostClient\Shared\Plugin\Filter\HasMessageChannelFilter;
use ForecastAutomation\MattermostClient\Shared\Plugin\Filter\IsDirectChannelFilter;
use ForecastAutomation\MattermostClient\Shared\Plugin\MattermostActivityPlugin;
use ForecastAutomation\PeriodicalActivity\Shared\Plugin\PeriodicalActivityPlugin;
use ForecastAutomation\QueueClient\QueueClientFacade;

class ActivityDependencyProvider extends AbstractDependencyProvider
{
public const ACTIVITY_PLUGINS = 'ACTIVITY_PLUGINS';
public const QUEUE_CLIENT_FACADE = 'QUEUE_CLIENT_FACADE';

public function provideDependencies(Locator $locator): void
{
$this->set(self::ACTIVITY_PLUGINS, $this->getActivityPlugins());
$this->set(self::QUEUE_CLIENT_FACADE, new QueueClientFacade());
}

public function getActivityPlugins(): ActivityPluginCollection
{
return new ActivityPluginCollection(
new PeriodicalActivityPlugin(),
new JiraActivityPlugin(),
new MattermostActivityPlugin(
new HasMessageChannelFilter(new \DateTime(date('Y-m-d'))),
Expand All @@ -42,4 +47,6 @@ public function getActivityPlugins(): ActivityPluginCollection

;
}

//ToDo getActivityOutputPlugins -> queueActivityOutputPlugin
}
5 changes: 5 additions & 0 deletions src/ForecastAutomation/Activity/ActivityFacade.php
Original file line number Diff line number Diff line change
Expand Up @@ -23,4 +23,9 @@ public function collect(): ActivityDtoCollection
{
return $this->getFactory()->createActivityCollector()->collect();
}

public function send(ActivityDtoCollection $activityDtoCollection): int
{
return $this->getFactory()->createActivitySendQueueProcess()->send($activityDtoCollection);
}
}
15 changes: 15 additions & 0 deletions src/ForecastAutomation/Activity/ActivityFactory.php
Original file line number Diff line number Diff line change
Expand Up @@ -12,8 +12,11 @@
namespace ForecastAutomation\Activity;

use ForecastAutomation\Activity\Business\ActivityCollector;
use ForecastAutomation\Activity\Business\ActivitySendQueueProcess;
use ForecastAutomation\Activity\Shared\Plugin\ActivityPluginCollection;
use ForecastAutomation\ForecastDataImport\ForecastDataImportDependencyProvider;
use ForecastAutomation\Kernel\AbstractFactory;
use ForecastAutomation\QueueClient\QueueClientFacade;

class ActivityFactory extends AbstractFactory
{
Expand All @@ -26,4 +29,16 @@ public function createActivityCollector(): ActivityCollector
{
return new ActivityCollector($this->getActivityPlugins());
}

public function createActivitySendQueueProcess(): ActivitySendQueueProcess
{
return new ActivitySendQueueProcess(
$this->getQueueClientFacade(),
);
}

public function getQueueClientFacade(): QueueClientFacade
{
return $this->getProvidedDependency(ActivityDependencyProvider::QUEUE_CLIENT_FACADE);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,7 @@ private function mergeActivityDtoCollections(array $activityDtoCollections): Act
{
$mergedActivityDtoCollection = new ActivityDtoCollection();
foreach ($activityDtoCollections as $activityDtoCollection) {
$mergedActivityDtoCollection->merge($activityDtoCollection);
$mergedActivityDtoCollection->mergeFreedom($activityDtoCollection);
}

return $mergedActivityDtoCollection;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,28 +9,25 @@
* with this source code in the file LICENSE.
*/

namespace ForecastAutomation\ForecastDataImport\Business;
namespace ForecastAutomation\Activity\Business;

use ForecastAutomation\Activity\ActivityFacade;
use ForecastAutomation\Activity\Shared\Dto\ActivityDtoCollection;
use ForecastAutomation\ForecastClient\Shared\Config\ForecastClientQueueConstants;
use ForecastAutomation\ProjektronClient\Shared\Config\ProjektronClientQueueConstants;
use ForecastAutomation\QueueClient\QueueClientFacade;
use ForecastAutomation\QueueClient\Shared\Dto\MessageCollectionDto;
use ForecastAutomation\QueueClient\Shared\Dto\MessageDto;

class ForecastDataImportProcess
class ActivitySendQueueProcess
{
public function __construct(
private ActivityFacade $activityFacade,
private QueueClientFacade $queueClientFacade,
) {
}

public function start(): int
public function send(ActivityDtoCollection $activityDtoCollection): int
{
$activityDtoCollection = $this->activityFacade->collect();
$this->queueClientFacade->sendMessages(
ForecastClientQueueConstants::QUEUE_NAME,
ProjektronClientQueueConstants::QUEUE_NAME,
$this->createMessageCollectionDto($activityDtoCollection)
);

Expand All @@ -44,8 +41,8 @@ private function createMessageCollectionDto(ActivityDtoCollection $activityDtoCo
$messages[] =
new MessageDto(
['created' => $activityDto->created->format('c')] + (array) $activityDto,
ForecastClientQueueConstants::QUEUE_NAME,
ForecastClientQueueConstants::IMPORT_EVENT
ProjektronClientQueueConstants::QUEUE_NAME, // ToDo: Move to output plugin
ProjektronClientQueueConstants::IMPORT_EVENT
);
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -89,6 +89,15 @@ public function merge(self $activityDtoCollection): self
return $this;
}

public function mergeFreedom(self $activityDtoCollection): self
{
foreach ($activityDtoCollection as $activityDto) {
$this->activityDtos[] = $activityDto;
}

return $this;
}

private function sumDurationIfExist(ActivityDto $activityDto): bool
{
$exist = false;
Expand Down
Loading

0 comments on commit ecb0acf

Please sign in to comment.