parent
							
								
									f10e671c0e
								
							
						
					
					
						commit
						5b6d393693
					
				@ -0,0 +1,92 @@ | 
				
			|||||||
 | 
					<template> | 
				
			||||||
 | 
					  <q-form> | 
				
			||||||
 | 
					    <q-input | 
				
			||||||
 | 
					        id="item_title" | 
				
			||||||
 | 
					        v-model="item.title" | 
				
			||||||
 | 
					        :placeholder="$t('Title')" | 
				
			||||||
 | 
					        :error="v$.item.title.$error" | 
				
			||||||
 | 
					        @input="v$.item.title.$touch()" | 
				
			||||||
 | 
					        @blur="v$.item.title.$touch()" | 
				
			||||||
 | 
					        :error-message="titleErrors" | 
				
			||||||
 | 
					    /> | 
				
			||||||
 | 
					    <slot></slot> | 
				
			||||||
 | 
					  </q-form> | 
				
			||||||
 | 
					</template> | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					<script> | 
				
			||||||
 | 
					import has from 'lodash/has'; | 
				
			||||||
 | 
					import useVuelidate from '@vuelidate/core'; | 
				
			||||||
 | 
					import { required } from '@vuelidate/validators'; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					export default { | 
				
			||||||
 | 
					  name: 'MessageForm', | 
				
			||||||
 | 
					  setup () { | 
				
			||||||
 | 
					    return { v$: useVuelidate() } | 
				
			||||||
 | 
					  }, | 
				
			||||||
 | 
					  props: { | 
				
			||||||
 | 
					    values: { | 
				
			||||||
 | 
					      type: Object, | 
				
			||||||
 | 
					      required: true | 
				
			||||||
 | 
					    }, | 
				
			||||||
 | 
					    errors: { | 
				
			||||||
 | 
					      type: Object, | 
				
			||||||
 | 
					      default: () => {} | 
				
			||||||
 | 
					    }, | 
				
			||||||
 | 
					    initialValues: { | 
				
			||||||
 | 
					      type: Object, | 
				
			||||||
 | 
					      default: () => {} | 
				
			||||||
 | 
					    }, | 
				
			||||||
 | 
					  }, | 
				
			||||||
 | 
					  data() { | 
				
			||||||
 | 
					    return { | 
				
			||||||
 | 
					      title: null, | 
				
			||||||
 | 
					      parentResourceNodeId: null, | 
				
			||||||
 | 
					      receivers: [] | 
				
			||||||
 | 
					    }; | 
				
			||||||
 | 
					  }, | 
				
			||||||
 | 
					  computed: { | 
				
			||||||
 | 
					    item() { | 
				
			||||||
 | 
					      return this.initialValues || this.values; | 
				
			||||||
 | 
					    }, | 
				
			||||||
 | 
					    receiversErrors() { | 
				
			||||||
 | 
					      const errors = []; | 
				
			||||||
 | 
					      if (!this.v$.item.receivers.$dirty) return errors; | 
				
			||||||
 | 
					      has(this.violations, 'receivers') && errors.push(this.violations.receivers); | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      if (this.v$.item.receivers.required) { | 
				
			||||||
 | 
					        return this.$t('Field is required') | 
				
			||||||
 | 
					      } | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      return errors; | 
				
			||||||
 | 
					    }, | 
				
			||||||
 | 
					    titleErrors() { | 
				
			||||||
 | 
					      const errors = []; | 
				
			||||||
 | 
					      if (!this.v$.item.title.$dirty) return errors; | 
				
			||||||
 | 
					      has(this.violations, 'title') && errors.push(this.violations.title); | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      if (this.v$.item.title.required) { | 
				
			||||||
 | 
					        return this.$t('Field is required') | 
				
			||||||
 | 
					      } | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      return errors; | 
				
			||||||
 | 
					    }, | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    violations() { | 
				
			||||||
 | 
					      return this.errors || {}; | 
				
			||||||
 | 
					    } | 
				
			||||||
 | 
					  }, | 
				
			||||||
 | 
					  validations: { | 
				
			||||||
 | 
					    item: { | 
				
			||||||
 | 
					      title: { | 
				
			||||||
 | 
					        required, | 
				
			||||||
 | 
					      }, | 
				
			||||||
 | 
					      receivers: { | 
				
			||||||
 | 
					        required, | 
				
			||||||
 | 
					      }, | 
				
			||||||
 | 
					      content: { | 
				
			||||||
 | 
					        required, | 
				
			||||||
 | 
					      }, | 
				
			||||||
 | 
					    } | 
				
			||||||
 | 
					  } | 
				
			||||||
 | 
					}; | 
				
			||||||
 | 
					</script> | 
				
			||||||
@ -0,0 +1,15 @@ | 
				
			|||||||
 | 
					framework: | 
				
			||||||
 | 
					    messenger: | 
				
			||||||
 | 
					        # Uncomment this (and the failed transport below) to send failed messages to this transport for later handling. | 
				
			||||||
 | 
					        # failure_transport: failed | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        transports: | 
				
			||||||
 | 
					            # https://symfony.com/doc/current/messenger.html#transport-configuration | 
				
			||||||
 | 
					#            async: '%env(MESSENGER_TRANSPORT_DSN)%' | 
				
			||||||
 | 
					            sync_priority_high: 'sync://' | 
				
			||||||
 | 
					            # failed: 'doctrine://default?queue_name=failed' | 
				
			||||||
 | 
					            # sync: 'sync://' | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        routing: | 
				
			||||||
 | 
					            # Route your messages to the transports | 
				
			||||||
 | 
					            'Chamilo\CoreBundle\Entity\Message': sync_priority_high | 
				
			||||||
@ -0,0 +1,4 @@ | 
				
			|||||||
 | 
					framework: | 
				
			||||||
 | 
					    messenger: | 
				
			||||||
 | 
					        transports: | 
				
			||||||
 | 
					            sync_priority_high: 'in-memory://' | 
				
			||||||
@ -0,0 +1,74 @@ | 
				
			|||||||
 | 
					<?php | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					declare(strict_types=1); | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* For licensing terms, see /license.txt */ | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					namespace Chamilo\CoreBundle\DataPersister; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					use ApiPlatform\Core\DataPersister\ContextAwareDataPersisterInterface; | 
				
			||||||
 | 
					use ApiPlatform\Core\DataPersister\ResumableDataPersisterInterface; | 
				
			||||||
 | 
					use Chamilo\CoreBundle\Entity\Message; | 
				
			||||||
 | 
					use Doctrine\ORM\EntityManager; | 
				
			||||||
 | 
					use Symfony\Component\Messenger\MessageBusInterface; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					class MessageDataPersister implements ContextAwareDataPersisterInterface, ResumableDataPersisterInterface | 
				
			||||||
 | 
					{ | 
				
			||||||
 | 
					    private EntityManager $entityManager; | 
				
			||||||
 | 
					    private ContextAwareDataPersisterInterface $decorated; | 
				
			||||||
 | 
					    private MessageBusInterface $bus; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public function __construct(ContextAwareDataPersisterInterface $decorated, EntityManager $entityManager, MessageBusInterface $bus) | 
				
			||||||
 | 
					    { | 
				
			||||||
 | 
					        $this->decorated = $decorated; | 
				
			||||||
 | 
					        $this->entityManager = $entityManager; | 
				
			||||||
 | 
					        $this->bus = $bus; | 
				
			||||||
 | 
					    } | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public function supports($data, array $context = []): bool | 
				
			||||||
 | 
					    { | 
				
			||||||
 | 
					        return $this->decorated->supports($data, $context); | 
				
			||||||
 | 
					    } | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public function persist($data, array $context = []) | 
				
			||||||
 | 
					    { | 
				
			||||||
 | 
					        $result = $this->decorated->persist($data, $context); | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        if ($data instanceof Message && ( | 
				
			||||||
 | 
					            ($context['collection_operation_name'] ?? null) === 'post' || | 
				
			||||||
 | 
					                ($context['graphql_operation_name'] ?? null) === 'create' | 
				
			||||||
 | 
					                //($context['item_operation_name'] ?? null) === 'put' // on update | 
				
			||||||
 | 
					        ) | 
				
			||||||
 | 
					        ) { | 
				
			||||||
 | 
					            /*if (Message::MESSAGE_TYPE_INBOX === $result->getMsgType()) { | 
				
			||||||
 | 
					                $messageSent = clone $result; | 
				
			||||||
 | 
					                $messageSent | 
				
			||||||
 | 
					                    ->setMsgType(Message::MESSAGE_TYPE_OUTBOX) | 
				
			||||||
 | 
					                    //->setRead(true) | 
				
			||||||
 | 
					                ; | 
				
			||||||
 | 
					                $this->entityManager->persist($messageSent); | 
				
			||||||
 | 
					                $this->entityManager->flush(); | 
				
			||||||
 | 
					                echo 'send11'; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                // Send message. | 
				
			||||||
 | 
					                $this->bus->dispatch($data); | 
				
			||||||
 | 
					            }*/ | 
				
			||||||
 | 
					        } | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        /*$this->entityManager->persist($data); | 
				
			||||||
 | 
					        $this->entityManager->flush();*/ | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        return $result; | 
				
			||||||
 | 
					    } | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public function remove($data, array $context = []): void | 
				
			||||||
 | 
					    { | 
				
			||||||
 | 
					        $this->entityManager->remove($data); | 
				
			||||||
 | 
					        $this->entityManager->flush(); | 
				
			||||||
 | 
					    } | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public function resumable(array $context = []): bool | 
				
			||||||
 | 
					    { | 
				
			||||||
 | 
					        return true; | 
				
			||||||
 | 
					    } | 
				
			||||||
 | 
					} | 
				
			||||||
@ -0,0 +1,67 @@ | 
				
			|||||||
 | 
					<?php | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* For licensing terms, see /license.txt */ | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					declare(strict_types=1); | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					namespace Chamilo\CoreBundle\DataProvider\Extension; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					use ApiPlatform\Core\Bridge\Doctrine\Orm\Extension\QueryCollectionExtensionInterface; | 
				
			||||||
 | 
					//use ApiPlatform\Core\Bridge\Doctrine\Orm\Extension\QueryItemExtensionInterface; | 
				
			||||||
 | 
					use ApiPlatform\Core\Bridge\Doctrine\Orm\Util\QueryNameGeneratorInterface; | 
				
			||||||
 | 
					use Chamilo\CoreBundle\Entity\Message; | 
				
			||||||
 | 
					use Doctrine\ORM\QueryBuilder; | 
				
			||||||
 | 
					use Symfony\Component\Security\Core\Security; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					final class UserRelUserExtension implements QueryCollectionExtensionInterface //, QueryItemExtensionInterface | 
				
			||||||
 | 
					{ | 
				
			||||||
 | 
					    private Security $security; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public function __construct(Security $security) | 
				
			||||||
 | 
					    { | 
				
			||||||
 | 
					        $this->security = $security; | 
				
			||||||
 | 
					    } | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public function applyToCollection(QueryBuilder $queryBuilder, QueryNameGeneratorInterface $queryNameGenerator, string $resourceClass, string $operationName = null): void | 
				
			||||||
 | 
					    { | 
				
			||||||
 | 
					        $this->addWhere($queryBuilder, $resourceClass); | 
				
			||||||
 | 
					    } | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public function applyToItem(QueryBuilder $queryBuilder, QueryNameGeneratorInterface $queryNameGenerator, string $resourceClass, array $identifiers, string $operationName = null, array $context = []): void | 
				
			||||||
 | 
					    { | 
				
			||||||
 | 
					        //error_log('applyToItem'); | 
				
			||||||
 | 
					        //$this->addWhere($queryBuilder, $resourceClass); | 
				
			||||||
 | 
					    } | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    private function addWhere(QueryBuilder $queryBuilder, string $resourceClass): void | 
				
			||||||
 | 
					    { | 
				
			||||||
 | 
					        if (Message::class !== $resourceClass) { | 
				
			||||||
 | 
					            return; | 
				
			||||||
 | 
					        } | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        /*if ($this->security->isGranted('ROLE_ADMIN')) { | 
				
			||||||
 | 
					            return; | 
				
			||||||
 | 
					        }*/ | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        /*$user = $this->security->getUser(); | 
				
			||||||
 | 
					        $alias = $queryBuilder->getRootAliases()[0]; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        $queryBuilder->andWhere(" | 
				
			||||||
 | 
					            ($alias.userSender = :current AND $alias.msgType = :outbox) OR | 
				
			||||||
 | 
					            ($alias.userReceiver = :current AND $alias.msgType = :inbox) OR | 
				
			||||||
 | 
					            ($alias.userReceiver = :current AND $alias.msgType = :invitation) OR | 
				
			||||||
 | 
					            ($alias.userReceiver = :current AND $alias.msgType = :promoted) OR | 
				
			||||||
 | 
					            ($alias.userReceiver = :current AND $alias.msgType = :wallPost) OR | 
				
			||||||
 | 
					            ($alias.userReceiver = :current AND $alias.msgType = :conversation) | 
				
			||||||
 | 
					        "); | 
				
			||||||
 | 
					        $queryBuilder->setParameters([ | 
				
			||||||
 | 
					            'current' => $user, | 
				
			||||||
 | 
					            'inbox' => Message::MESSAGE_TYPE_INBOX, | 
				
			||||||
 | 
					            'outbox' => Message::MESSAGE_TYPE_OUTBOX, | 
				
			||||||
 | 
					            'invitation' => Message::MESSAGE_TYPE_INVITATION, | 
				
			||||||
 | 
					            'promoted' => Message::MESSAGE_TYPE_PROMOTED, | 
				
			||||||
 | 
					            'wallPost' => Message::MESSAGE_TYPE_WALL, | 
				
			||||||
 | 
					            'conversation' => Message::MESSAGE_STATUS_CONVERSATION, | 
				
			||||||
 | 
					        ]);*/ | 
				
			||||||
 | 
					    } | 
				
			||||||
 | 
					} | 
				
			||||||
@ -0,0 +1,55 @@ | 
				
			|||||||
 | 
					<?php | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					declare(strict_types=1); | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* For licensing terms, see /license.txt */ | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					namespace Chamilo\CoreBundle\MessageHandler; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					use Chamilo\CoreBundle\Entity\Message; | 
				
			||||||
 | 
					use Chamilo\CoreBundle\Repository\MessageRepository; | 
				
			||||||
 | 
					use Symfony\Bridge\Twig\Mime\TemplatedEmail; | 
				
			||||||
 | 
					use Symfony\Component\Mailer\Mailer; | 
				
			||||||
 | 
					use Symfony\Component\Messenger\Handler\MessageHandlerInterface; | 
				
			||||||
 | 
					use Symfony\Component\Mime\Address; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					class MessageHandler implements MessageHandlerInterface | 
				
			||||||
 | 
					{ | 
				
			||||||
 | 
					    private Mailer $mailer; | 
				
			||||||
 | 
					    private MessageRepository $repo; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public function __construct(Mailer $mailer, MessageRepository $repo) | 
				
			||||||
 | 
					    { | 
				
			||||||
 | 
					        $this->mailer = $mailer; | 
				
			||||||
 | 
					        $this->repo = $repo; | 
				
			||||||
 | 
					    } | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public function __invoke(Message $message): void | 
				
			||||||
 | 
					    { | 
				
			||||||
 | 
					        if (Message::MESSAGE_TYPE_INBOX !== $message->getMsgType()) { | 
				
			||||||
 | 
					            // Only send messages to the inbox. | 
				
			||||||
 | 
					            return; | 
				
			||||||
 | 
					        } | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        $email = (new TemplatedEmail()) | 
				
			||||||
 | 
					            ->subject($message->getTitle()) | 
				
			||||||
 | 
					            ->from(new Address($message->getSender()->getEmail(), $message->getSender()->getFirstname())) | 
				
			||||||
 | 
					            ->htmlTemplate('@ChamiloCore/Mailer/Default/default.html.twig') | 
				
			||||||
 | 
					            ->textTemplate('@ChamiloCore/Mailer/Default/default.text.twig') | 
				
			||||||
 | 
					        ; | 
				
			||||||
 | 
					        foreach ($message->getReceivers() as $receiver) { | 
				
			||||||
 | 
					            $address = new Address($receiver->getEmail(), $receiver->getFirstname()); | 
				
			||||||
 | 
					            $email->addBcc($address); | 
				
			||||||
 | 
					        } | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        $params = [ | 
				
			||||||
 | 
					            'content' => $message->getContent(), | 
				
			||||||
 | 
					            'automatic_email_text' => '', | 
				
			||||||
 | 
					            'mail_header_style' => '', | 
				
			||||||
 | 
					            'mail_content_style' => '', | 
				
			||||||
 | 
					            'theme' => '', | 
				
			||||||
 | 
					        ]; | 
				
			||||||
 | 
					        $email->context($params); | 
				
			||||||
 | 
					        $this->mailer->send($email); | 
				
			||||||
 | 
					    } | 
				
			||||||
 | 
					} | 
				
			||||||
					Loading…
					
					
				
		Reference in new issue