update to pc

This commit is contained in:
silas 2018-10-17 20:12:06 +02:00
parent 7fc54547c4
commit 56d17ca07d
18 changed files with 31223 additions and 9 deletions

1
.idea/php.xml generated
View File

@ -91,4 +91,5 @@
<path value="$PROJECT_DIR$/vendor/ainias/pwa-zf-core" />
</include_path>
</component>
<component name="PhpProjectSharedConfiguration" php_language_level="7" />
</project>

View File

@ -41,7 +41,8 @@
"ainias/pwa-zf-core":"dev-es6 as 0.0.10",
"ainias/pwa-zf-contact": "dev-master as 0.0.10",
"ainias/pwa-lib": "dev-es6 as 0.0.10",
"ainias/pwa-assets": "dev-es6 as 0.0.10"
"ainias/pwa-assets": "dev-es6 as 0.0.10",
"ext-json": "*"
},
"autoload": {
"psr-4": {

30890
orga/Word.sql Normal file

File diff suppressed because it is too large Load Diff

View File

@ -50,3 +50,8 @@ INSERT INTO RoleAccess(RoleId, AccessId) VALUES (1,3); -- gast - default
INSERT INTO RoleAccess(RoleId, AccessId) VALUES (2,2); -- user - online
INSERT INTO RoleAccess(RoleId, AccessId) VALUES (2,3); -- user - default
INSERT INTO `RoleAccess` (`RoleId`, `AccessId`) VALUES (3, 4); -- admin - admin
--------------
ALTER TABLE Word ADD used TINYINT(1) NOT NULL;

View File

@ -53,6 +53,7 @@ ALTER TABLE UserAccess ADD CONSTRAINT FK_26623A76A1A046DD FOREIGN KEY (AccessId)
ALTER TABLE RequestNewPasswordCode ADD CONSTRAINT FK_27CF9C8BBF396750 FOREIGN KEY (id) REFERENCES Code (id) ON DELETE CASCADE;
ALTER TABLE Rating ADD CONSTRAINT FK_D1189E24D9801611 FOREIGN KEY (levelId) REFERENCES Level (id);
ALTER TABLE Rating ADD CONSTRAINT FK_D1189E24A1F3197E FOREIGN KEY (authTokenId) REFERENCES AuthToken (id);
ALTER TABLE Word ADD used TINYINT(1) NOT NULL;
INSERT INTO Role (name, beschreibung) VALUES ('gast', 'Kein aktives oder eingeloggtes Mitglied'); -- 1
@ -72,6 +73,7 @@ INSERT INTO RoleAccess(RoleId, AccessId) VALUES (2,3); -- user - default
INSERT INTO `RoleAccess` (`RoleId`, `AccessId`) VALUES (3, 4); -- admin - admin
INSERT INTO `Level` (`id`, `words`, `positions`, `renderer`, `lastUpdated`, `lang`, `deleted`, `difficulty`) VALUES
(15, '["ARCHIV","CHARME"]', '[1,1,3]', 20, '2018-07-14 17:01:18', 1, 0, 2),
(26, '["BODENSEE","ALARMRUF"]', '[3,2,0,3]', 40, '2018-07-14 17:01:18', 1, 0, 40),

View File

@ -0,0 +1 @@
UPDATE Word SET Word.used = 1 WHERE (SELECT count(*) FROM Level WHERE words LIKE CONCAT("%", Word.word, "%") AND deleted = 0) > 0

View File

@ -7069,6 +7069,62 @@ InitPromise.addPromise(app => {
}, null, null, "admin"));
});
class DeleteWordsSite extends UserSite {
constructor(siteManager) {
super(siteManager, "version/1/html/deleteLevels.html", null, "admin");
}
async onConstruct(args) {
let res = super.onConstruct(args);
this.words = (await DataManager.load("getDoubleUsedWordsAction"))["result"];
return res;
}
onFirstStart() {
super.onFirstStart();
let levelTemplate = this.findBy("#level-template");
let wordTemplate = this.findBy("#word-template");
let wordContainer = this.findBy("#word-container");
levelTemplate.id = null;
levelTemplate.remove();
wordTemplate.id = null;
wordTemplate.remove();
for (let k in this.words) {
let wordElem = Helper.cloneNode(wordTemplate);
wordElem.querySelector(".name").appendChild(document.createTextNode(k));
let levelContainer = wordElem.querySelector(".level-container");
for (let j = 0; j < this.words[k].length; j++) {
let level = this.words[k][j];
let levelElem = Helper.cloneNode(levelTemplate);
levelElem.querySelector(".id").appendChild(document.createTextNode(level["id"]));
levelElem.querySelector(".words").appendChild(document.createTextNode(level["words"]));
levelElem.querySelector(".positions").appendChild(document.createTextNode(level["rotations"]));
levelElem.querySelector(".delete-button").addEventListener("click", async () => {
let res = await DataManager.send("deleteLevel", {"levelId": level["id"]});
if (res["success"]){
levelElem.remove();
}
});
levelContainer.appendChild(levelElem);
}
wordContainer.appendChild(wordElem);
}
}
}
InitPromise.addPromise(app => {
app.addDefaultAction(new UserAction("delete-levels", () => {
app.startSite(DeleteWordsSite);
},null, null, "admin"));
});
let basePath = "/pwa/wordRotator/public/";
if (window.location.pathname.includes("publicTest/"))
{

View File

@ -0,0 +1 @@
<div><div id=level-template class=row><div class="columns small-3">id:</div><div class="column small-6 id"></div><div class="column small-3"><button class="clickable margin-0 delete-button">X</button></div><div class="columns small-3">words:</div><div class="column small-9 words"></div><div class="columns small-3">rotations:</div><div class="column small-9 positions"></div><div class="columns small-12" style="border-bottom: 1px solid black">&nbsp;</div></div><div id=word-template style="margin-bottom: 1.5rem"><span class=name></span>:<br><div class=level-container></div></div><div id=word-container></div></div>

View File

@ -26,6 +26,7 @@ import {WordRotatorSettingFragment} from "../module/Application/pwa/js/Fragment/
import {PrivacyPolicySite} from "../module/Application/pwa/js/site/PrivacyPolicySite";
import {CreditsSite} from "../module/Application/pwa/js/site/CreditsSite";
import {SelectWordsSite} from "../module/Application/pwa/js/site/SelectWordsSite";
import {DeleteWordsSite} from "../module/Application/pwa/js/site/DeleteWordsSite";
applyPolyfills();

View File

@ -32,6 +32,28 @@ return array(
],
],
],
'getDoubleWords' => [
'type' => Segment::class,
'options' => [
'route' => '/getDoubleUsedWordsAction',
'defaults' => [
'controller' => IndexController::class,
'action' => 'getDoubleUsedWords',
'resource' => 'admin',
],
],
],
'deleteLevel' => [
'type' => Segment::class,
'options' => [
'route' => '/deleteLevel',
'defaults' => [
'controller' => IndexController::class,
'action' => 'deleteLevel',
'resource' => 'admin',
],
],
],
],
],
],

View File

@ -0,0 +1,59 @@
import {UserAction, UserSite} from "../../../../../js/lib/pwa-user-management";
import {Helper, InitPromise} from "../../../../../js/lib/pwa-lib";
import {DataManager} from "../../../../../js/lib/pwa-core";
export class DeleteWordsSite extends UserSite {
constructor(siteManager) {
super(siteManager, "version/1/html/deleteLevels.html", null, "admin");
}
async onConstruct(args) {
let res = super.onConstruct(args);
this.words = (await DataManager.load("getDoubleUsedWordsAction"))["result"];
return res;
}
onFirstStart() {
super.onFirstStart();
let levelTemplate = this.findBy("#level-template");
let wordTemplate = this.findBy("#word-template");
let wordContainer = this.findBy("#word-container");
levelTemplate.id = null;
levelTemplate.remove();
wordTemplate.id = null;
wordTemplate.remove();
for (let k in this.words) {
let wordElem = Helper.cloneNode(wordTemplate);
wordElem.querySelector(".name").appendChild(document.createTextNode(k));
let levelContainer = wordElem.querySelector(".level-container");
for (let j = 0; j < this.words[k].length; j++) {
let level = this.words[k][j];
let levelElem = Helper.cloneNode(levelTemplate);
levelElem.querySelector(".id").appendChild(document.createTextNode(level["id"]));
levelElem.querySelector(".words").appendChild(document.createTextNode(level["words"]));
levelElem.querySelector(".positions").appendChild(document.createTextNode(level["rotations"]));
levelElem.querySelector(".delete-button").addEventListener("click", async () => {
let res = await DataManager.send("deleteLevel", {"levelId": level["id"]});
if (res["success"]){
levelElem.remove();
}
});
levelContainer.appendChild(levelElem);
}
wordContainer.appendChild(wordElem);
}
}
}
InitPromise.addPromise(app => {
app.addDefaultAction(new UserAction("delete-levels", () => {
app.startSite(DeleteWordsSite);
},null, null, "admin"))
});

View File

@ -0,0 +1,13 @@
<div>
<div id = "level-template" class = "row">
<div class = "columns small-3">id:</div><div class="column small-6 id"></div><div class = 'column small-3'><button class = 'clickable margin-0 delete-button'>X</button></div>
<div class = "columns small-3">words:</div><div class="column small-9 words"></div>
<div class = "columns small-3">rotations:</div><div class="column small-9 positions"></div>
<div class = "columns small-12" style = 'border-bottom: 1px solid black'>&nbsp;</div>
</div>
<div id = "word-template" style="margin-bottom: 1.5rem">
<span class = "name"></span>:<br/>
<div class = "level-container"></div>
</div>
<div id = "word-container"></div>
</div>

View File

@ -3,6 +3,7 @@
namespace Application\Controller;
use Ainias\Core\Controller\OnlineController;
use Application\Model\Manager\LevelManager;
use Application\Model\Manager\WordManager;
use Application\Model\Word;
use Zend\View\Model\ViewModel;
@ -75,4 +76,36 @@ class IndexController extends OnlineController
WordManager::wordToArray($randomWordNotChecked),
];
}
public function getDoubleUsedWordsAction(){
/** @var LevelManager $levelManager */
$levelManager = $this->get(LevelManager::class);
return $levelManager->getDoubleUsedWords();
}
public function deleteLevelAction(){
$request = $this->getRequest();
if (!$request->isPost()) {
return $this->triggerDispatchError(403);
}
$levelId = $request->getPost("levelId", "");
/** @var LevelManager $levelManager */
$levelManager = $this->get(LevelManager::class);
$level = $levelManager->getEntityById($levelId);
$level->setDeleted(true);
$level->setLastUpdated(new \DateTime());
$levelManager->save($level);
return [];
}
public function generateLevelsAction(){
/** @var LevelManager $levelManager */
$levelManager = $this->get(LevelManager::class);
$levelManager->generateLevels();
}
}

View File

@ -0,0 +1,31 @@
<?php
/**
* Created by PhpStorm.
* User: silas
* Date: 17.10.18
* Time: 16:47
*/
namespace Application\Factory\Model\Manager;
use Application\Model\Level;
use Application\Model\Manager\LevelManager;
use Application\Model\Manager\WordManager;
use Interop\Container\ContainerInterface;
use Zend\ServiceManager\Factory\FactoryInterface;
class LevelManagerFactory implements FactoryInterface
{
public function __invoke(ContainerInterface $container, $requestedName, array $options = null)
{
return $this->createService($container, $requestedName);
}
public function createService(ContainerInterface $serviceLocator, $managerName)
{
$em = $serviceLocator->get('doctrine.entitymanager.orm_default');
/** @var WordManager $wordManager */
$wordManager = $serviceLocator->get(WordManager::class);
return new LevelManager($em->getRepository(Level::class), $wordManager);
}
}

View File

@ -8,12 +8,16 @@ use Application\Model\Level;
class LevelManager extends StandardManager
{
/** @var LevelRepository */
/** @var LevelRepository */
protected $repository;
public function __construct(LevelRepository $repository, Level $entity = null)
/** @var WordManager */
protected $wordManager;
public function __construct(LevelRepository $repository, WordManager $wordManager, Level $entity = null)
{
$this->repository = $repository;
$this->wordManager = $wordManager;
parent::__construct($repository, $entity);
}
@ -51,12 +55,12 @@ class LevelManager extends StandardManager
return $this->repository->countNewerThanDate($dateTime);
}
public function levelToArray(Level $level)
static function levelToArray(Level $level)
{
return [
"id" => $level->getId(),
"words" => json_decode($level->getWords()),
"rotations"=> json_decode($level->getPositions()),
"rotations" => json_decode($level->getPositions()),
"lastUpdated" => $level->getLastUpdated()->format("Y-m-d"),
"language" => $level->getLang(),
"rendererType" => $level->getRenderer(),
@ -65,14 +69,68 @@ class LevelManager extends StandardManager
];
}
public function levelsToArray($levels)
static function levelsToArray($levels)
{
$returnArray = [];
/** @var Level $level */
foreach ($levels as $level)
{
$returnArray[] = $this->levelToArray($level);
foreach ($levels as $level) {
$returnArray[] = LevelManager::levelToArray($level);
}
return $returnArray;
}
public function getDoubleUsedWords()
{
$words = [];
$sameWords = [];
/** @var Level[] $level */
$level = $this->findBy(["deleted" => 0]);
$levelNumber = count($level);
for ($i = 0; $i < $levelNumber; $i++) {
$words[$i] = $words[$i] ?? json_decode($level[$i]->getWords());
$wordLength = count($words[$i]);
for ($j = $i + 1; $j < $levelNumber; $j++) {
$words[$j] = $words[$j] ?? json_decode($level[$j]->getWords());
for ($k = 0; $k < $wordLength; $k++){
if (in_array($words[$i][$k], $words[$j])){
$sameWords[$words[$i][$k]] = ($sameWords[$words[$i][$k]] ?? []);
$sameWords[$words[$i][$k]][] = $level[$i];
$sameWords[$words[$i][$k]][] = $level[$j];
}
}
}
}
foreach ($sameWords as $key => &$levels){
$sameWords[$key] = array_unique(LevelManager::levelsToArray($levels), SORT_REGULAR);
}
return $sameWords;
}
public function generateLevels()
{
$levelsToGenerate = [
[
"wordLength" => 12,
"numWords" => 6,
"numPositions" => 21
],
[
"wordLength" => 12,
"numWords" => 4,
"numPositions" => 15
],
];
$words = [];
do {
$currentIndex = rand(0, count($levelsToGenerate) -1);
$words[$levelsToGenerate[$currentIndex]] = $words[$levelsToGenerate[$currentIndex]] ?? $this->wordManager->findWordsForLength($levelsToGenerate[$currentIndex]["wordLength"]);
}while(1 == 2);
}
}

View File

@ -125,4 +125,9 @@ class WordManager extends StandardManager
{
return $this->repository->countUnsure($minLength, $maxLength);
}
public function findWordsForLength($length)
{
$this->repository->findWordsForLength($length);
}
}

View File

@ -128,4 +128,16 @@ class WordRepository extends StandardRepository
$queryBuilder->setMaxResults(1);
return $queryBuilder->getQuery()->getSingleScalarResult();
}
public function findWordsForLength($length)
{
$queryBuilder = $this->_em->createQueryBuilder();
$queryBuilder->select("w")->from(Word::class, "w");
$queryBuilder->andWhere($queryBuilder->expr()->eq("w.checked", "1"));
$queryBuilder->andWhere($queryBuilder->expr()->eq("w.deleted", "0"));
$queryBuilder->andWhere($queryBuilder->expr()->eq($queryBuilder->expr()->length("w.word"), ":length"));
$queryBuilder->setParameter("length", $length);
return $queryBuilder->getQuery()->getResult();
}
}

View File

@ -60,6 +60,12 @@ class Word extends StandardModel
*/
protected $checked;
/**
* @ORM\Column(type="boolean")
* @var bool
*/
protected $used;
/**
* Word constructor.
*/
@ -72,6 +78,7 @@ class Word extends StandardModel
$this->lang = self::LANGUAGE_DE;
$this->word = "";
$this->checked = -1;
$this->used = false;
}
/**
@ -185,4 +192,20 @@ class Word extends StandardModel
{
$this->checked = $checked;
}
/**
* @return bool
*/
public function isUsed()
{
return $this->used;
}
/**
* @param bool $used
*/
public function setUsed($used)
{
$this->used = $used;
}
}