Skip to content

Commit fc9ad37

Browse files
author
epriestley
committedNov 22, 2012
Add very basic scaffolding for Pholio
Summary: I'm not going to land this until it's a bit more fleshed out since it would just confuse users, but this is probably more reviewable as a few diffs adding a couple features than one ULTRA-diff adding everything. Implement application basics for Pholio. This does more or less nothing, but adds storage, subscribe, flag, markup, indexing, query basics, PHIDs, handle loads, a couple of realy really basic controllers, etc. Basic hierarchy is: - **Moleskine**: Top-level object like a Differential Revision, like "Ponder Feed Ideas". - **Image**: Each Moleskine has one or more images, like the unexpanded / expanded / mobile / empty states of feed. - **Transaction**: Comment or edit, like Maniphest. I generally want to move most apps to a transaction model so we can log edits. - **PixelComment**: Equivalent of an inline comment. Test Plan: Created a fake object and viewed it. Reviewers: btrahan, chad Reviewed By: btrahan CC: aran, davidreuss Maniphest Tasks: T2097 Differential Revision: https://secure.phabricator.com/D3817
1 parent f4fa968 commit fc9ad37

19 files changed

+909
-1
lines changed
 

‎resources/sql/patches/pholio.sql

+74
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,74 @@
1+
CREATE TABLE {$NAMESPACE}_pholio.pholio_mock (
2+
id INT UNSIGNED NOT NULL PRIMARY KEY AUTO_INCREMENT,
3+
phid VARCHAR(64) NOT NULL COLLATE utf8_bin,
4+
name VARCHAR(128) NOT NULL COLLATE utf8_general_ci,
5+
originalName VARCHAR(128) NOT NULL COLLATE utf8_general_ci,
6+
description LONGTEXT NOT NULL COLLATE utf8_general_ci,
7+
authorPHID VARCHAR(64) NOT NULL COLLATE utf8_bin,
8+
viewPolicy VARCHAR(64) NOT NULL COLLATE utf8_bin,
9+
coverPHID VARCHAR(64) NOT NULL COLLATE utf8_bin,
10+
mailKey VARCHAR(20) NOT NULL COLLATE utf8_bin,
11+
dateCreated INT UNSIGNED NOT NULL,
12+
dateModified INT UNSIGNED NOT NULL,
13+
UNIQUE KEY (phid),
14+
KEY (authorPHID)
15+
) ENGINE=InnoDB, COLLATE utf8_general_ci;
16+
17+
CREATE TABLE {$NAMESPACE}_pholio.edge (
18+
src VARCHAR(64) NOT NULL COLLATE utf8_bin,
19+
type VARCHAR(64) NOT NULL COLLATE utf8_bin,
20+
dst VARCHAR(64) NOT NULL COLLATE utf8_bin,
21+
dateCreated INT UNSIGNED NOT NULL,
22+
seq INT UNSIGNED NOT NULL,
23+
dataID INT UNSIGNED,
24+
PRIMARY KEY (src, type, dst),
25+
KEY (src, type, dateCreated, seq)
26+
) ENGINE=InnoDB, COLLATE utf8_general_ci;
27+
28+
CREATE TABLE {$NAMESPACE}_pholio.edgedata (
29+
id INT UNSIGNED NOT NULL PRIMARY KEY AUTO_INCREMENT,
30+
data LONGTEXT NOT NULL COLLATE utf8_bin
31+
) ENGINE=InnoDB, COLLATE utf8_general_ci;
32+
33+
CREATE TABLE {$NAMESPACE}_pholio.pholio_transaction (
34+
id INT UNSIGNED NOT NULL PRIMARY KEY AUTO_INCREMENT,
35+
authorPHID VARCHAR(64) NOT NULL COLLATE utf8_bin,
36+
mockID INT UNSIGNED NOT NULL,
37+
transactionType VARCHAR(32) NOT NULL COLLATE utf8_bin,
38+
oldValue LONGTEXT NOT NULL COLLATE utf8_bin,
39+
newValue LONGTEXT NOT NULL COLLATE utf8_bin,
40+
comment LONGTEXT NOT NULL COLLATE utf8_general_ci,
41+
metadata LONGTEXT NOT NULL COLLATE utf8_bin,
42+
contentSource LONGTEXT NOT NULL COLLATE utf8_bin,
43+
dateCreated INT UNSIGNED NOT NULL,
44+
dateModified INT UNSIGNED NOT NULL
45+
) ENGINE=InnoDB, COLLATE utf8_general_ci;
46+
47+
CREATE TABLE {$NAMESPACE}_pholio.pholio_image (
48+
id INT UNSIGNED NOT NULL PRIMARY KEY AUTO_INCREMENT,
49+
mockID INT UNSIGNED NOT NULL,
50+
filePHID VARCHAR(64) NOT NULL COLLATE utf8_bin,
51+
name VARCHAR(128) NOT NULL COLLATE utf8_general_ci,
52+
description LONGTEXT NOT NULL COLLATE utf8_general_ci,
53+
sequence INT UNSIGNED NOT NULL,
54+
dateCreated INT UNSIGNED NOT NULL,
55+
dateModified INT UNSIGNED NOT NULL,
56+
KEY (mockID, sequence)
57+
) ENGINE=InnoDB, COLLATE utf8_general_ci;
58+
59+
CREATE TABLE {$NAMESPACE}_pholio.pholio_pixelcomment (
60+
id INT UNSIGNED NOT NULL PRIMARY KEY AUTO_INCREMENT,
61+
mockID INT UNSIGNED NOT NULL,
62+
imageID INT UNSIGNED NOT NULL,
63+
transactionID INT UNSIGNED,
64+
authorPHID VARCHAR(64) NOT NULL COLLATE utf8_bin,
65+
x INT UNSIGNED NOT NULL,
66+
y INT UNSIGNED NOT NULL,
67+
width INT UNSIGNED NOT NULL,
68+
height INT UNSIGNED NOT NULL,
69+
comment LONGTEXT NOT NULL COLLATE utf8_general_ci,
70+
dateCreated INT UNSIGNED NOT NULL,
71+
dateModified INT UNSIGNED NOT NULL,
72+
KEY (mockID),
73+
KEY (authorPHID, transactionID)
74+
) ENGINE=InnoDB, COLLATE utf8_general_ci;

‎src/__phutil_library_map__.php

+42
Original file line numberDiff line numberDiff line change
@@ -582,6 +582,7 @@
582582
'PhabricatorApplicationPaste' => 'applications/paste/application/PhabricatorApplicationPaste.php',
583583
'PhabricatorApplicationPeople' => 'applications/people/application/PhabricatorApplicationPeople.php',
584584
'PhabricatorApplicationPhame' => 'applications/phame/application/PhabricatorApplicationPhame.php',
585+
'PhabricatorApplicationPholio' => 'applications/pholio/application/PhabricatorApplicationPholio.php',
585586
'PhabricatorApplicationPhriction' => 'applications/phriction/application/PhabricatorApplicationPhriction.php',
586587
'PhabricatorApplicationPonder' => 'applications/ponder/application/PhabricatorApplicationPonder.php',
587588
'PhabricatorApplicationProject' => 'applications/project/application/PhabricatorApplicationProject.php',
@@ -1199,6 +1200,17 @@
11991200
'PhamePostViewController' => 'applications/phame/controller/post/PhamePostViewController.php',
12001201
'PhameResourceController' => 'applications/phame/controller/PhameResourceController.php',
12011202
'PhameSkinSpecification' => 'applications/phame/skins/PhameSkinSpecification.php',
1203+
'PholioController' => 'applications/pholio/controller/PholioController.php',
1204+
'PholioDAO' => 'applications/pholio/storage/PholioDAO.php',
1205+
'PholioImage' => 'applications/pholio/storage/PholioImage.php',
1206+
'PholioIndexer' => 'applications/pholio/indexer/PholioIndexer.php',
1207+
'PholioMock' => 'applications/pholio/storage/PholioMock.php',
1208+
'PholioMockEditor' => 'applications/pholio/editor/PholioMockEditor.php',
1209+
'PholioMockListController' => 'applications/pholio/controller/PholioMockListController.php',
1210+
'PholioMockQuery' => 'applications/pholio/query/PholioMockQuery.php',
1211+
'PholioMockViewController' => 'applications/pholio/controller/PholioMockViewController.php',
1212+
'PholioPixelComment' => 'applications/pholio/storage/PholioPixelComment.php',
1213+
'PholioTransaction' => 'applications/pholio/storage/PholioTransaction.php',
12021214
'PhortuneMonthYearExpiryControl' => 'applications/phortune/control/PhortuneMonthYearExpiryControl.php',
12031215
'PhortuneStripeBaseController' => 'applications/phortune/stripe/controller/PhortuneStripeBaseController.php',
12041216
'PhortuneStripePaymentFormView' => 'applications/phortune/stripe/view/PhortuneStripePaymentFormView.php',
@@ -1799,6 +1811,7 @@
17991811
'PhabricatorApplicationPaste' => 'PhabricatorApplication',
18001812
'PhabricatorApplicationPeople' => 'PhabricatorApplication',
18011813
'PhabricatorApplicationPhame' => 'PhabricatorApplication',
1814+
'PhabricatorApplicationPholio' => 'PhabricatorApplication',
18021815
'PhabricatorApplicationPhriction' => 'PhabricatorApplication',
18031816
'PhabricatorApplicationPonder' => 'PhabricatorApplication',
18041817
'PhabricatorApplicationProject' => 'PhabricatorApplication',
@@ -2377,6 +2390,35 @@
23772390
'PhamePostView' => 'AphrontView',
23782391
'PhamePostViewController' => 'PhameController',
23792392
'PhameResourceController' => 'CelerityResourceController',
2393+
'PholioController' => 'PhabricatorController',
2394+
'PholioDAO' => 'PhabricatorLiskDAO',
2395+
'PholioImage' =>
2396+
array(
2397+
0 => 'PholioDAO',
2398+
1 => 'PhabricatorMarkupInterface',
2399+
),
2400+
'PholioIndexer' => 'PhabricatorSearchDocumentIndexer',
2401+
'PholioMock' =>
2402+
array(
2403+
0 => 'PholioDAO',
2404+
1 => 'PhabricatorMarkupInterface',
2405+
2 => 'PhabricatorPolicyInterface',
2406+
3 => 'PhabricatorSubscribableInterface',
2407+
),
2408+
'PholioMockEditor' => 'PhabricatorEditor',
2409+
'PholioMockListController' => 'PholioController',
2410+
'PholioMockQuery' => 'PhabricatorCursorPagedPolicyAwareQuery',
2411+
'PholioMockViewController' => 'PholioController',
2412+
'PholioPixelComment' =>
2413+
array(
2414+
0 => 'PholioDAO',
2415+
1 => 'PhabricatorMarkupInterface',
2416+
),
2417+
'PholioTransaction' =>
2418+
array(
2419+
0 => 'PholioDAO',
2420+
1 => 'PhabricatorMarkupInterface',
2421+
),
23802422
'PhortuneMonthYearExpiryControl' => 'AphrontFormControl',
23812423
'PhortuneStripeBaseController' => 'PhabricatorController',
23822424
'PhortuneStripePaymentFormView' => 'AphrontView',

‎src/applications/phid/PhabricatorPHIDConstants.php

+2
Original file line numberDiff line numberDiff line change
@@ -28,4 +28,6 @@ final class PhabricatorPHIDConstants {
2828
const PHID_TYPE_BLOG = 'BLOG';
2929
const PHID_TYPE_QUES = 'QUES';
3030
const PHID_TYPE_ANSW = 'ANSW';
31+
const PHID_TYPE_MOCK = 'MOCK';
32+
3133
}

‎src/applications/phid/handle/PhabricatorObjectHandleData.php

+33
Original file line numberDiff line numberDiff line change
@@ -88,12 +88,22 @@ public function loadObjects() {
8888
break;
8989
case PhabricatorPHIDConstants::PHID_TYPE_QUES:
9090
$questions = id(new PonderQuestionQuery())
91+
->setViewer($this->viewer)
9192
->withPHIDs($phids)
9293
->execute();
9394
foreach ($questions as $question) {
9495
$objects[$question->getPHID()] = $question;
9596
}
9697
break;
98+
case PhabricatorPHIDConstants::PHID_TYPE_MOCK:
99+
$mocks = id(new PholioMockQuery())
100+
->setViewer($this->viewer)
101+
->withPHIDs($phids)
102+
->execute();
103+
foreach ($mocks as $mock) {
104+
$objects[$mock->getPHID()] = $mock;
105+
}
106+
break;
97107
}
98108
}
99109

@@ -546,6 +556,29 @@ public function loadHandles() {
546556
$handles[$phid] = $handle;
547557
}
548558
break;
559+
case PhabricatorPHIDConstants::PHID_TYPE_MOCK:
560+
$mocks = id(new PholioMockQuery())
561+
->withPHIDs($phids)
562+
->setViewer($this->viewer)
563+
->execute();
564+
$mocks = mpull($mocks, null, 'getPHID');
565+
566+
foreach ($phids as $phid) {
567+
$handle = new PhabricatorObjectHandle();
568+
$handle->setPHID($phid);
569+
$handle->setType($type);
570+
if (empty($mocks[$phid])) {
571+
$handle->setName('Unknown Mock');
572+
} else {
573+
$mock = $mocks[$phid];
574+
$handle->setName($mock->getName());
575+
$handle->setFullName($mock->getName());
576+
$handle->setURI('/M'.$mock->getID());
577+
$handle->setComplete(true);
578+
}
579+
$handles[$phid] = $handle;
580+
}
581+
break;
549582
default:
550583
$loader = null;
551584
if (isset($external_loaders[$type])) {
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,63 @@
1+
<?php
2+
3+
/*
4+
* Copyright 2012 Facebook, Inc.
5+
*
6+
* Licensed under the Apache License, Version 2.0 (the "License");
7+
* you may not use this file except in compliance with the License.
8+
* You may obtain a copy of the License at
9+
*
10+
* http://www.apache.org/licenses/LICENSE-2.0
11+
*
12+
* Unless required by applicable law or agreed to in writing, software
13+
* distributed under the License is distributed on an "AS IS" BASIS,
14+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15+
* See the License for the specific language governing permissions and
16+
* limitations under the License.
17+
*/
18+
19+
/**
20+
* @group pholio
21+
*/
22+
final class PhabricatorApplicationPholio extends PhabricatorApplication {
23+
24+
public function shouldAppearInLaunchView() {
25+
// TODO: See getApplicationGroup().
26+
return false;
27+
}
28+
29+
public function getBaseURI() {
30+
return '/pholio/';
31+
}
32+
33+
public function getShortDescription() {
34+
return 'Design Review';
35+
}
36+
37+
public function getAutospriteName() {
38+
return 'pholio';
39+
}
40+
41+
public function getTitleGlyph() {
42+
return "\xE2\x9D\xA6";
43+
}
44+
45+
public function getFlavorText() {
46+
return pht('Things before they were cool.');
47+
}
48+
49+
public function getApplicationGroup() {
50+
// TODO: Move to CORE, this just keeps it out of the side menu.
51+
return self::GROUP_COMMUNICATION;
52+
}
53+
54+
public function getRoutes() {
55+
return array(
56+
'/M(?P<id>[1-9]\d*)' => 'PholioMockViewController',
57+
'/pholio/' => array(
58+
'' => 'PholioMockListController',
59+
),
60+
);
61+
}
62+
63+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
<?php
2+
3+
/*
4+
* Copyright 2012 Facebook, Inc.
5+
*
6+
* Licensed under the Apache License, Version 2.0 (the "License");
7+
* you may not use this file except in compliance with the License.
8+
* You may obtain a copy of the License at
9+
*
10+
* http://www.apache.org/licenses/LICENSE-2.0
11+
*
12+
* Unless required by applicable law or agreed to in writing, software
13+
* distributed under the License is distributed on an "AS IS" BASIS,
14+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15+
* See the License for the specific language governing permissions and
16+
* limitations under the License.
17+
*/
18+
19+
/**
20+
* @group pholio
21+
*/
22+
abstract class PholioController extends PhabricatorController {
23+
24+
25+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,62 @@
1+
<?php
2+
3+
/*
4+
* Copyright 2012 Facebook, Inc.
5+
*
6+
* Licensed under the Apache License, Version 2.0 (the "License");
7+
* you may not use this file except in compliance with the License.
8+
* You may obtain a copy of the License at
9+
*
10+
* http://www.apache.org/licenses/LICENSE-2.0
11+
*
12+
* Unless required by applicable law or agreed to in writing, software
13+
* distributed under the License is distributed on an "AS IS" BASIS,
14+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15+
* See the License for the specific language governing permissions and
16+
* limitations under the License.
17+
*/
18+
19+
/**
20+
* @group pholio
21+
*/
22+
final class PholioMockListController extends PholioController {
23+
24+
public function processRequest() {
25+
$request = $this->getRequest();
26+
$user = $request->getUser();
27+
28+
$query = id(new PholioMockQuery())
29+
->setViewer($user);
30+
31+
$title = 'All Mocks';
32+
33+
$pager = new AphrontCursorPagerView();
34+
$pager->readFromRequest($request);
35+
36+
$mocks = $query->executeWithCursorPager($pager);
37+
38+
$board = new PhabricatorPinboardView();
39+
foreach ($mocks as $mock) {
40+
$board->addItem(
41+
id(new PhabricatorPinboardItemView())
42+
->setHeader($mock->getName())
43+
->setURI('/M'.$mock->getID()));
44+
}
45+
46+
$header = id(new PhabricatorHeaderView())
47+
->setHeader($title);
48+
49+
$content = array(
50+
$header,
51+
$board,
52+
$pager,
53+
);
54+
55+
return $this->buildApplicationPage(
56+
$content,
57+
array(
58+
'title' => $title,
59+
));
60+
}
61+
62+
}

0 commit comments

Comments
 (0)
Failed to load comments.