├── .gitignore ├── LICENSE ├── README.md ├── api ├── .gitkeep ├── initiative │ ├── config │ │ └── routes.json │ ├── controllers │ │ └── Initiative.js │ ├── models │ │ ├── Initiative.js │ │ └── Initiative.settings.json │ └── services │ │ └── Initiative.js ├── metric │ ├── config │ │ └── routes.json │ ├── controllers │ │ └── Metric.js │ ├── models │ │ ├── Metric.js │ │ └── Metric.settings.json │ └── services │ │ └── Metric.js ├── objective │ ├── config │ │ └── routes.json │ ├── controllers │ │ └── Objective.js │ ├── models │ │ ├── Objective.js │ │ └── Objective.settings.json │ └── services │ │ └── Objective.js └── resource │ ├── config │ └── routes.json │ ├── controllers │ └── Resource.js │ ├── models │ ├── Resource.js │ └── Resource.settings.json │ └── services │ └── Resource.js ├── config ├── application.json ├── custom.json ├── environments │ ├── development │ │ ├── custom.json │ │ ├── database.json │ │ ├── request.json │ │ ├── response.json │ │ ├── security.json │ │ └── server.json │ ├── production │ │ ├── custom.json │ │ ├── database.json │ │ ├── request.json │ │ ├── response.json │ │ ├── security.json │ │ └── server.json │ └── staging │ │ ├── custom.json │ │ ├── database.json │ │ ├── request.json │ │ ├── response.json │ │ ├── security.json │ │ └── server.json ├── functions │ ├── bootstrap.js │ ├── cron.js │ └── responses │ │ └── 404.js ├── hook.json ├── language.json ├── locales │ ├── de_de.json │ ├── en_us.json │ ├── es_es.json │ ├── fr_fr.json │ ├── it_it.json │ ├── ja_jp.json │ ├── ru_ru.json │ └── tr_tr.json └── middleware.json ├── extensions ├── .gitkeep └── users-permissions │ └── config │ └── jwt.json ├── favicon.ico ├── groups ├── activity.json ├── log.json └── result.json ├── package-lock.json ├── package.json ├── public ├── index.html ├── robots.txt └── uploads │ └── .gitkeep └── yarn.lock /.gitignore: -------------------------------------------------------------------------------- 1 | ############################ 2 | # OS X 3 | ############################ 4 | 5 | .DS_Store 6 | .AppleDouble 7 | .LSOverride 8 | Icon 9 | .Spotlight-V100 10 | .Trashes 11 | ._* 12 | 13 | 14 | ############################ 15 | # Linux 16 | ############################ 17 | 18 | *~ 19 | 20 | 21 | ############################ 22 | # Windows 23 | ############################ 24 | 25 | Thumbs.db 26 | ehthumbs.db 27 | Desktop.ini 28 | $RECYCLE.BIN/ 29 | *.cab 30 | *.msi 31 | *.msm 32 | *.msp 33 | 34 | 35 | ############################ 36 | # Packages 37 | ############################ 38 | 39 | *.7z 40 | *.csv 41 | *.dat 42 | *.dmg 43 | *.gz 44 | *.iso 45 | *.jar 46 | *.rar 47 | *.tar 48 | *.zip 49 | *.com 50 | *.class 51 | *.dll 52 | *.exe 53 | *.o 54 | *.seed 55 | *.so 56 | *.swo 57 | *.swp 58 | *.swn 59 | *.swm 60 | *.out 61 | *.pid 62 | 63 | 64 | ############################ 65 | # Logs and databases 66 | ############################ 67 | 68 | .tmp 69 | *.log 70 | *.sql 71 | *.sqlite 72 | *.sqlite3 73 | 74 | 75 | ############################ 76 | # Misc. 77 | ############################ 78 | 79 | *# 80 | ssl 81 | .idea 82 | nbproject 83 | public/uploads/* 84 | !public/uploads/.gitkeep 85 | 86 | ############################ 87 | # Node.js 88 | ############################ 89 | 90 | lib-cov 91 | lcov.info 92 | pids 93 | logs 94 | results 95 | node_modules 96 | .node_history 97 | 98 | 99 | ############################ 100 | # Tests 101 | ############################ 102 | 103 | testApp 104 | coverage 105 | 106 | ############################ 107 | # Strapi 108 | ############################ 109 | 110 | exports 111 | .cache 112 | build 113 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2020 OKRIA 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # OKRIA API 2 | An open-source API solution for managing and integrating OKRs, initiatives and activities into your applications. 3 | 4 | Created by [OKRIA](https://okria.io): we help organizations set goals and achieve them with our open source tools and coaching solutions designed to better the OKR practice. 5 | 6 | ## Table of contents 7 | - [Introduction](#introduction) 8 | - [Getting started](#getting-started) 9 | - [Appendix](#appendix) 10 | 11 | ## Introduction 12 | 13 | ### What is OKRIA? 14 | OKR is a goal setting and strategic planning model designed to better the objectives and key results model popularized by John Doerr. 15 | 16 | If you’re familiar with OKR, it’s pretty easy to summarize OKRIA (it’s in our name). OKRIA stands for Objectives and Key Results, Initiatives and Activities. 17 | 18 | In the OKRIA model, we have explicitly delineated the (often compounded) process of planning initiatives and activities from that of setting objectives and key results. In doing so we have worked to define a more holistic strategic planning model. Following the OKR example, we’ve defined simple (but opinionated) rules for initiatives and activities planning: 19 | 20 | #### Initiatives 21 | Initiatives are the projects, products, or product features that will be undertaken to increase, decrease or maintain key results. Initiatives are: 22 | - **Clear in scope:** i.e. specific in terms of channel, activity and feature. 23 | - **Segmented:** i.e. specific in terms of audience. 24 | - **Deadlined:** i.e. time-bound; completed for a specific date. 25 | - **Completable:** i.e. they can be completed; done. 26 | 27 | #### Activities 28 | Activities are the actions we take towards completing initiatives. Activities are: 29 | - **Action-oriented:** i.e. defined by the specific work performed. 30 | - **Resourced** i.e. identifying the specific team, or _resource_ responsible. 31 | - **Atelic** i.e. represent an ongoing activity of business (one without a specific end in and of itself) 32 | 33 | Put simply, we’ve extended OKR to help connect the dots (and ensure a clear separation) between the goals companies set and the work teams do to achieve them. 34 | 35 | ### What is OKRIA API? 36 | OKRIA is committed to offering free tools to help support the adoption of the model. You can learn more about OKRIA [here](https://okria.io/). To help companies adopt the model in software applications, We've created this open-source Strapi based OKRIA management solution. 37 | 38 | #### Use case 39 | OKRIA API provides an API first CMS to help product managers and developers: 40 | 1. Create and manage OKRs 41 | 2. Plan initiatives and activities 42 | 3. Integrate these concepts with custom apps, or third-party tools 43 | 44 | #### Features 45 | OKRIA API has everything you need to get started: 46 | - Strapi based CMS interface for product managers 47 | - RESTful (or GraphQL) API for developers 48 | - Authentication, User management, plugins, and more... 49 | 50 | Learn more about the powerful Strapi CMS [here](https://strapi.io/documentation/3.0.0-beta.x/getting-started/quick-start.html) for full documentation and features. 51 | 52 | ## Getting started 53 | Follow these step by step instructions to get started running OKRIA API in your local development environment: 54 | 55 | ### 1. Install 56 | First, we'll install the required dependencies: 57 | 58 | #### 1.1. Install Strapi 59 | First, install Strapi globally using npm. 60 | ``` 61 | npm i strapi -g 62 | ``` 63 | #### 1.2 Install OKRIA API 64 | The OKRIA API repo contains a `package.json` file with additional application dependencies as well as Strapi configuration files specific to the OKRIA API. 65 | 66 | Clone the repo and install the dependencies as follows: 67 | 68 | ``` 69 | git clone git@github.com:okria/okria-strapi.git 70 | cd okria-strapi 71 | npm install 72 | ``` 73 | 74 | **Note:** If you intend to use OKRIA API in production (and develop it further) you may wish to fork the repo instead. 75 | 76 | ### 2. Run the application 77 | Strapi includes a cli and a user interface to be accessed in the browser. 78 | 79 | #### 2.1 Run in development 80 | To run Strapi and ORKIA API in development mode: 81 | 82 | ``` 83 | strapi develop 84 | ``` 85 | 86 | **Note:** To review all commands enter `strapi`. 87 | 88 | ### 2.2 Login as Administrator 89 | You will then be provided with a URL as follows to access the interface in the browser http://localhost:1337. 90 | 91 | Visit this URL in the browser, and follow the provided link to navigate to http://localhost:1337/admin to create an administrative account and access the interface for the first time. 92 | 93 | ### 3. Create and Manage 94 | Once you've logged in you will be presented with the Strapi interface. You'll find 4 content types that will allow you to create OKR, initiatives and activities. Let's walk through the complete process so you can see how the OKRIA API works: 95 | 96 | #### 3.1 Create an initiative 97 | The first thing we will do is create a master initiative. This typically is a project, product, product feature or another company initiative. We will use this to organize objectives and key results, and plan activities: 98 | 99 | 1. Click `Initiatives` in the sidebar and click the `Add New Initiative` button 100 | 2. Add an initiative name in the `Initiatives` field 101 | - e.g. `Redesign of customer on-boarding experience` 102 | 3. Set a date for the completion of this initiative (typically an annual or quarterly interval) 103 | 4. Initiatives also have `Activities` for now, let's leave this field array blank for now 104 | 5. Save your initiative by clicking the `Save` button 105 | 6. You can now access this and other initiatives by clicking `Initiatives` in the sidebar 106 | 107 | #### 3.2 Create an objective 108 | Second, we'll create an objective for the initiative. An objective is a qualitative goal to give purpose to our initiative. 109 | 110 | 1. Click `Objectives` in the sidebar and click the `Add New Objective` button 111 | 2. Add an objective name in the `Objective` field 112 | - e.g. `Release a more delightful onboarding experience` 113 | 3. Set a goal date for the completion of this objective (corresponding the initiative date) 114 | 4. Select your previously created initiative using the `Initiative` field 115 | 5. Objectives also have `Results` (key results). Leave this field blank for now 116 | 6. Save your objective by clicking the `Save` button 117 | 7. You can now access this and other objectives by clicking `Objectives` in the sidebar 118 | 119 | #### 3.3 Create a metric 120 | Before creating a key result we'll want to identify the key metrics which we'll use to measure our objective. A key metric is a quantitative measure which we will increase, decrease, or maintain through our activities and which will be used to measure achievement of our objective (as a key result). 121 | 122 | 1. Click `Metrics` in the sidebar and click the `Add New Metric` button 123 | 2. Add a metric name in the `Metric` field 124 | - e.g. `customer onboarding support requests` or `customer onboarding completion rate` 125 | 3. Add a unit in the `Unit` field 126 | - i.e. the unit name used for the type of metric 127 | - e.g. `count` or `percentage` 128 | 4. As relevant, add a unit symbol in the `Symbol` field 129 | - e.g. `$`, `%` or `kg`, etc. 130 | 5. If a symbol has been identified, we can also configure positioning for the symbol: 131 | 1. Add a symbol `Position` i.e. `before` or `After` 132 | 2. Indicate if the symbol requires a space between the metric value i.e. `10 kg` or `23.4%` 133 | 6. Once you have completed all the required fields, save the metric. 134 | 7. You can now access the metric by clicking `Metrics` in the sidebar 135 | 136 | #### 3.4 Create key results 137 | Once an objective and one or many key metrics have been created you can begin to define key results. Key results allow you to define the quantitative evidence that an objective has been achieved. 138 | 139 | 1. Click `Objectives` in the sidebar and navigate to edit your previously created objective 140 | 2. Under `Result` click `Add new entry` to add a key result 141 | 3. Select a `Direction` for your key metric 142 | - e.g. `increase`, `decrease`, or `maintain` 143 | 4. Select a `Metric` you created in the previous step 144 | 5. Identify the `Start` value and a `Goal` value used to grade achievement 145 | 6. Set a `Date` for the key result (considering the goal date of the objective) 146 | 7. Add additional key metrics (typical 2-3) by clicking `Add new entry` 147 | 8. Save the objective to save your key results 148 | 149 | #### 3.5 Log metrics 150 | In order to grade our objectives our results need to be measured, and so we need to log metrics. The key metric content type allows you to add dated logs. These logs can be used to calculate the actual (or final) value of a key result (e.g. comparing the actual result to the goal result considering the start result, goal date, and log date). 151 | 152 | 1. Click `Metric` in the sidebar to navigate to access your previous `Metric` 153 | 2. Under `Log` click `Add new entry` to add a log 154 | 3. Set the `Date` for the log (current date or date of measurement) 155 | 4. In the `Value` field enter the current state value of the metric 156 | 5. Multiple logs can be added to allow measurement for key results at different intervals 157 | 6. Save the metric to save your logs 158 | 159 | #### 3.6 Create resources 160 | To complete planning our initiative activities we will have to engage team teams or team members (our key resources). 161 | 162 | 1. Click `Resources` in the sidebar and click the `Add New Resource` button 163 | 2. Add a resource name in the `Resource` field 164 | - e.g. `marketing team`, `product team`, or `sales team` 165 | 3. Save your resource 166 | 167 | #### 3.7 Create activities 168 | Now we will return to our initiative to define the activities that will be required to complete the initiative. 169 | 170 | 1. Click `Initiatives` in the sidebar and navigate to edit your previously created initiative 171 | 2. Under `Activity` click `Add new entry` to add an activity 172 | 3. Select a previously created `Resource` from the list 173 | e.g. `design team` 174 | 4. Identify a `Task` that the selected resource must do to complete this initiative 175 | - e.g. `wireframe a new onboarding experience` 176 | 5. Estimate the amount of time the task will take by identifying: 177 | 1. The activity `Cadence` 178 | - i.e. the time interval typically used to estimate this type of task 179 | - e.g. `day`,`week`,`sprint`, etc. 180 | 2. An `Estimate` corresponding to the cadence 181 | - e.g. `2 days` or `2 sprints`, etc. 182 | 6. Save your initiative to save your activities. 183 | 184 | ### 4. API 185 | Now that you have created example objectives, key results, initiatives and activities you will be able to interact with this content via a RESTful API. This will allow you to integrate the content in front-end or third-party applications. 186 | 187 | #### 4.1 Manage permissions 188 | In production, it will be important to ensure proper authentication of the API endpoint to ensure the security of critical data. While testing in our local environment, however, we'll use a public endpoint as a proof of concept. 189 | 190 | To configure access to the various endpoints, we'll use the administrative interface: 191 | 192 | 1. In the sidebar click `Roles & Permissions` 193 | 2. Navigate to `Public` to manage public user role access 194 | 3. In the permissions section of the page, we'll activate the `find` permission for the resource endpoints we wish to access. In this case: 195 | - Initiative 196 | - Metric 197 | - Objective 198 | - Resource 199 | 4. Once the `find` permissions have been selected, click `Save` 200 | 201 | #### 5.1 Test endpoints 202 | We can now access endpoints for each of our content types in the browser or using an API tool (e.g. Postman) to consume the input content, via any front-end or third-party application. 203 | - Find all metrics via a `GET` request to `http://localhost:1337/metrics` 204 | - Find all objectives via a `GET` request to `http://localhost:1337/objectives` 205 | - Find all initiatives via a `GET` request to `http://localhost:1337/intiatives` 206 | - Find all resources via a `GET` request to `http://localhost:1337/resources` 207 | 208 | ## Appendix 209 | OKRIA API is new, but we will continue to enhance the offering with further customization to the Strapi interface, documentation, and use case example (including code). For now, please feel free to [reach out](http://localhost:4000/sales) with comments or questions and to browse the resources below to explore further. 210 | 211 | ### Additional documentation 212 | 1. [Strapi documentation](https://strapi.io/documentation/3.0.0-beta.x/getting-started/introduction.html) 213 | 2. [Introduction to OKRIA concepts using the OKRIA canvas](https://okria.io/blog/introducing-okr-initiatives-activities-canvas) 214 | 215 | ### Authentication 216 | To access the API securely, you'll want to set up authentication using one of the recommended authentication [methods](https://strapi.io/documentation/3.0.0-alpha.x/guides/authentication.html#authentication). 217 | 218 | The process is (at a high level) as follows: 219 | 220 | 1. Navigate to the `Roles & Permissions` page and set authenticated user permissions. 221 | 2. Create a user with the authenticated user role 222 | 3. Retrieve PWT token with `POST` request passing user `identifier` and `password` to the `http://localhost:1337/auth/local` endpoint (note: parameters should be passed in the request body) 223 | 4. Access content endpoints with token in header (bearer token) 224 | 225 | ### Deployment and database 226 | Deploying Strapi to production can be achieved with a range of possible [hosting](https://strapi.io/documentation/3.0.0-alpha.x/guides/deployment.html) and [database](https://strapi.io/documentation/3.0.0-alpha.x/guides/databases.html) configurations. 227 | 228 | ### Additional users and roles 229 | Before on-boarding product managers or other user roles to the OKRIA API, you should create a safe permission set that ensures users can create content, but not manage other administrative functions. 230 | 231 | We recommend creating a `manager` role, restricting access to the following permission categories: 232 | 233 | - **CONTENT-MANAGER** 234 | - Contenttypes 235 | - Generalsettings 236 | - Groups 237 | - **CONTENT-TYPE-BUILDER** 238 | - Contenttypebuilder 239 | - Groups 240 | - **EMAIL** 241 | - All 242 | - **USER-PERMISSIONS** 243 | - User (all except `me`) 244 | - Userpermissions (all except `init`) 245 | -------------------------------------------------------------------------------- /api/.gitkeep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/seanrioux/strapi-okria-api/e29e26046b2c8291674bf18a88405826acd6697d/api/.gitkeep -------------------------------------------------------------------------------- /api/initiative/config/routes.json: -------------------------------------------------------------------------------- 1 | { 2 | "routes": [ 3 | { 4 | "method": "GET", 5 | "path": "/initiatives", 6 | "handler": "Initiative.find", 7 | "config": { 8 | "policies": [] 9 | } 10 | }, 11 | { 12 | "method": "GET", 13 | "path": "/initiatives/count", 14 | "handler": "Initiative.count", 15 | "config": { 16 | "policies": [] 17 | } 18 | }, 19 | { 20 | "method": "GET", 21 | "path": "/initiatives/:id", 22 | "handler": "Initiative.findOne", 23 | "config": { 24 | "policies": [] 25 | } 26 | }, 27 | { 28 | "method": "POST", 29 | "path": "/initiatives", 30 | "handler": "Initiative.create", 31 | "config": { 32 | "policies": [] 33 | } 34 | }, 35 | { 36 | "method": "PUT", 37 | "path": "/initiatives/:id", 38 | "handler": "Initiative.update", 39 | "config": { 40 | "policies": [] 41 | } 42 | }, 43 | { 44 | "method": "DELETE", 45 | "path": "/initiatives/:id", 46 | "handler": "Initiative.delete", 47 | "config": { 48 | "policies": [] 49 | } 50 | } 51 | ] 52 | } 53 | -------------------------------------------------------------------------------- /api/initiative/controllers/Initiative.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | /** 4 | * Read the documentation (https://strapi.io/documentation/3.0.0-beta.x/concepts/controllers.html#core-controllers) 5 | * to customize this controller 6 | */ 7 | 8 | module.exports = {}; 9 | -------------------------------------------------------------------------------- /api/initiative/models/Initiative.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | /** 4 | * Lifecycle callbacks for the `Initiative` model. 5 | */ 6 | 7 | module.exports = { 8 | // Before saving a value. 9 | // Fired before an `insert` or `update` query. 10 | // beforeSave: async (model, attrs, options) => {}, 11 | 12 | // After saving a value. 13 | // Fired after an `insert` or `update` query. 14 | // afterSave: async (model, response, options) => {}, 15 | 16 | // Before fetching a value. 17 | // Fired before a `fetch` operation. 18 | // beforeFetch: async (model, columns, options) => {}, 19 | 20 | // After fetching a value. 21 | // Fired after a `fetch` operation. 22 | // afterFetch: async (model, response, options) => {}, 23 | 24 | // Before fetching all values. 25 | // Fired before a `fetchAll` operation. 26 | // beforeFetchAll: async (model, columns, options) => {}, 27 | 28 | // After fetching all values. 29 | // Fired after a `fetchAll` operation. 30 | // afterFetchAll: async (model, response, options) => {}, 31 | 32 | // Before creating a value. 33 | // Fired before an `insert` query. 34 | // beforeCreate: async (model, attrs, options) => {}, 35 | 36 | // After creating a value. 37 | // Fired after an `insert` query. 38 | // afterCreate: async (model, attrs, options) => {}, 39 | 40 | // Before updating a value. 41 | // Fired before an `update` query. 42 | // beforeUpdate: async (model, attrs, options) => {}, 43 | 44 | // After updating a value. 45 | // Fired after an `update` query. 46 | // afterUpdate: async (model, attrs, options) => {}, 47 | 48 | // Before destroying a value. 49 | // Fired before a `delete` query. 50 | // beforeDestroy: async (model, attrs, options) => {}, 51 | 52 | // After destroying a value. 53 | // Fired after a `delete` query. 54 | // afterDestroy: async (model, attrs, options) => {} 55 | }; 56 | -------------------------------------------------------------------------------- /api/initiative/models/Initiative.settings.json: -------------------------------------------------------------------------------- 1 | { 2 | "connection": "default", 3 | "collectionName": "initiatives", 4 | "info": { 5 | "name": "initiative", 6 | "description": "Initiatives are projects that drive key results" 7 | }, 8 | "options": { 9 | "increments": true, 10 | "timestamps": [ 11 | "created_at", 12 | "updated_at" 13 | ], 14 | "comment": "" 15 | }, 16 | "attributes": { 17 | "name": { 18 | "type": "string" 19 | }, 20 | "date": { 21 | "type": "date" 22 | }, 23 | "activity": { 24 | "group": "activity", 25 | "repeatable": true, 26 | "type": "group" 27 | }, 28 | "complete": { 29 | "type": "boolean", 30 | "default": false 31 | } 32 | } 33 | } 34 | -------------------------------------------------------------------------------- /api/initiative/services/Initiative.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | /** 4 | * Read the documentation (https://strapi.io/documentation/3.0.0-beta.x/concepts/services.html#core-services) 5 | * to customize this service 6 | */ 7 | 8 | module.exports = {}; 9 | -------------------------------------------------------------------------------- /api/metric/config/routes.json: -------------------------------------------------------------------------------- 1 | { 2 | "routes": [ 3 | { 4 | "method": "GET", 5 | "path": "/metrics", 6 | "handler": "Metric.find", 7 | "config": { 8 | "policies": [] 9 | } 10 | }, 11 | { 12 | "method": "GET", 13 | "path": "/metrics/count", 14 | "handler": "Metric.count", 15 | "config": { 16 | "policies": [] 17 | } 18 | }, 19 | { 20 | "method": "GET", 21 | "path": "/metrics/:id", 22 | "handler": "Metric.findOne", 23 | "config": { 24 | "policies": [] 25 | } 26 | }, 27 | { 28 | "method": "POST", 29 | "path": "/metrics", 30 | "handler": "Metric.create", 31 | "config": { 32 | "policies": [] 33 | } 34 | }, 35 | { 36 | "method": "PUT", 37 | "path": "/metrics/:id", 38 | "handler": "Metric.update", 39 | "config": { 40 | "policies": [] 41 | } 42 | }, 43 | { 44 | "method": "DELETE", 45 | "path": "/metrics/:id", 46 | "handler": "Metric.delete", 47 | "config": { 48 | "policies": [] 49 | } 50 | } 51 | ] 52 | } 53 | -------------------------------------------------------------------------------- /api/metric/controllers/Metric.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | /** 4 | * Read the documentation (https://strapi.io/documentation/3.0.0-beta.x/concepts/controllers.html#core-controllers) 5 | * to customize this controller 6 | */ 7 | 8 | module.exports = {}; 9 | -------------------------------------------------------------------------------- /api/metric/models/Metric.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | /** 4 | * Lifecycle callbacks for the `Metric` model. 5 | */ 6 | 7 | module.exports = { 8 | // Before saving a value. 9 | // Fired before an `insert` or `update` query. 10 | // beforeSave: async (model, attrs, options) => {}, 11 | 12 | // After saving a value. 13 | // Fired after an `insert` or `update` query. 14 | // afterSave: async (model, response, options) => {}, 15 | 16 | // Before fetching a value. 17 | // Fired before a `fetch` operation. 18 | // beforeFetch: async (model, columns, options) => {}, 19 | 20 | // After fetching a value. 21 | // Fired after a `fetch` operation. 22 | // afterFetch: async (model, response, options) => {}, 23 | 24 | // Before fetching all values. 25 | // Fired before a `fetchAll` operation. 26 | // beforeFetchAll: async (model, columns, options) => {}, 27 | 28 | // After fetching all values. 29 | // Fired after a `fetchAll` operation. 30 | // afterFetchAll: async (model, response, options) => {}, 31 | 32 | // Before creating a value. 33 | // Fired before an `insert` query. 34 | // beforeCreate: async (model, attrs, options) => {}, 35 | 36 | // After creating a value. 37 | // Fired after an `insert` query. 38 | // afterCreate: async (model, attrs, options) => {}, 39 | 40 | // Before updating a value. 41 | // Fired before an `update` query. 42 | // beforeUpdate: async (model, attrs, options) => {}, 43 | 44 | // After updating a value. 45 | // Fired after an `update` query. 46 | // afterUpdate: async (model, attrs, options) => {}, 47 | 48 | // Before destroying a value. 49 | // Fired before a `delete` query. 50 | // beforeDestroy: async (model, attrs, options) => {}, 51 | 52 | // After destroying a value. 53 | // Fired after a `delete` query. 54 | // afterDestroy: async (model, attrs, options) => {} 55 | }; 56 | -------------------------------------------------------------------------------- /api/metric/models/Metric.settings.json: -------------------------------------------------------------------------------- 1 | { 2 | "connection": "default", 3 | "collectionName": "metrics", 4 | "info": { 5 | "name": "metric", 6 | "description": "Metrics are the quantitative measures used to define key results" 7 | }, 8 | "options": { 9 | "increments": true, 10 | "timestamps": [ 11 | "created_at", 12 | "updated_at" 13 | ], 14 | "comment": "" 15 | }, 16 | "attributes": { 17 | "metric": { 18 | "type": "string", 19 | "required": true, 20 | "unique": true 21 | }, 22 | "unit": { 23 | "type": "string", 24 | "required": true 25 | }, 26 | "symbol": { 27 | "type": "string" 28 | }, 29 | "placement": { 30 | "enum": [ 31 | "before", 32 | "after" 33 | ], 34 | "type": "enumeration" 35 | }, 36 | "space": { 37 | "type": "boolean", 38 | "default": true 39 | }, 40 | "log": { 41 | "group": "log", 42 | "repeatable": true, 43 | "type": "group" 44 | } 45 | } 46 | } 47 | -------------------------------------------------------------------------------- /api/metric/services/Metric.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | /** 4 | * Read the documentation (https://strapi.io/documentation/3.0.0-beta.x/concepts/services.html#core-services) 5 | * to customize this service 6 | */ 7 | 8 | module.exports = {}; 9 | -------------------------------------------------------------------------------- /api/objective/config/routes.json: -------------------------------------------------------------------------------- 1 | { 2 | "routes": [ 3 | { 4 | "method": "GET", 5 | "path": "/objectives", 6 | "handler": "Objective.find", 7 | "config": { 8 | "policies": [] 9 | } 10 | }, 11 | { 12 | "method": "GET", 13 | "path": "/objectives/count", 14 | "handler": "Objective.count", 15 | "config": { 16 | "policies": [] 17 | } 18 | }, 19 | { 20 | "method": "GET", 21 | "path": "/objectives/:id", 22 | "handler": "Objective.findOne", 23 | "config": { 24 | "policies": [] 25 | } 26 | }, 27 | { 28 | "method": "POST", 29 | "path": "/objectives", 30 | "handler": "Objective.create", 31 | "config": { 32 | "policies": [] 33 | } 34 | }, 35 | { 36 | "method": "PUT", 37 | "path": "/objectives/:id", 38 | "handler": "Objective.update", 39 | "config": { 40 | "policies": [] 41 | } 42 | }, 43 | { 44 | "method": "DELETE", 45 | "path": "/objectives/:id", 46 | "handler": "Objective.delete", 47 | "config": { 48 | "policies": [] 49 | } 50 | } 51 | ] 52 | } 53 | -------------------------------------------------------------------------------- /api/objective/controllers/Objective.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | /** 4 | * Read the documentation (https://strapi.io/documentation/3.0.0-beta.x/concepts/controllers.html#core-controllers) 5 | * to customize this controller 6 | */ 7 | 8 | module.exports = {}; 9 | -------------------------------------------------------------------------------- /api/objective/models/Objective.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | /** 4 | * Lifecycle callbacks for the `Objective` model. 5 | */ 6 | 7 | module.exports = { 8 | // Before saving a value. 9 | // Fired before an `insert` or `update` query. 10 | // beforeSave: async (model, attrs, options) => {}, 11 | 12 | // After saving a value. 13 | // Fired after an `insert` or `update` query. 14 | // afterSave: async (model, response, options) => {}, 15 | 16 | // Before fetching a value. 17 | // Fired before a `fetch` operation. 18 | // beforeFetch: async (model, columns, options) => {}, 19 | 20 | // After fetching a value. 21 | // Fired after a `fetch` operation. 22 | // afterFetch: async (model, response, options) => {}, 23 | 24 | // Before fetching all values. 25 | // Fired before a `fetchAll` operation. 26 | // beforeFetchAll: async (model, columns, options) => {}, 27 | 28 | // After fetching all values. 29 | // Fired after a `fetchAll` operation. 30 | // afterFetchAll: async (model, response, options) => {}, 31 | 32 | // Before creating a value. 33 | // Fired before an `insert` query. 34 | // beforeCreate: async (model, attrs, options) => {}, 35 | 36 | // After creating a value. 37 | // Fired after an `insert` query. 38 | // afterCreate: async (model, attrs, options) => {}, 39 | 40 | // Before updating a value. 41 | // Fired before an `update` query. 42 | // beforeUpdate: async (model, attrs, options) => {}, 43 | 44 | // After updating a value. 45 | // Fired after an `update` query. 46 | // afterUpdate: async (model, attrs, options) => {}, 47 | 48 | // Before destroying a value. 49 | // Fired before a `delete` query. 50 | // beforeDestroy: async (model, attrs, options) => {}, 51 | 52 | // After destroying a value. 53 | // Fired after a `delete` query. 54 | // afterDestroy: async (model, attrs, options) => {} 55 | }; 56 | -------------------------------------------------------------------------------- /api/objective/models/Objective.settings.json: -------------------------------------------------------------------------------- 1 | { 2 | "connection": "default", 3 | "collectionName": "objectives", 4 | "info": { 5 | "name": "objective", 6 | "description": "Objectives are qualitative goals towards achieving an initiative and/or vision" 7 | }, 8 | "options": { 9 | "increments": true, 10 | "timestamps": [ 11 | "created_at", 12 | "updated_at" 13 | ], 14 | "comment": "" 15 | }, 16 | "attributes": { 17 | "objective": { 18 | "type": "string", 19 | "unique": true, 20 | "required": true 21 | }, 22 | "date": { 23 | "type": "date" 24 | }, 25 | "result": { 26 | "group": "result", 27 | "repeatable": true, 28 | "type": "group" 29 | }, 30 | "initiative": { 31 | "model": "initiative" 32 | }, 33 | "achieved": { 34 | "type": "boolean", 35 | "default": false 36 | } 37 | } 38 | } 39 | -------------------------------------------------------------------------------- /api/objective/services/Objective.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | /** 4 | * Read the documentation (https://strapi.io/documentation/3.0.0-beta.x/concepts/services.html#core-services) 5 | * to customize this service 6 | */ 7 | 8 | module.exports = {}; 9 | -------------------------------------------------------------------------------- /api/resource/config/routes.json: -------------------------------------------------------------------------------- 1 | { 2 | "routes": [ 3 | { 4 | "method": "GET", 5 | "path": "/resources", 6 | "handler": "Resource.find", 7 | "config": { 8 | "policies": [] 9 | } 10 | }, 11 | { 12 | "method": "GET", 13 | "path": "/resources/count", 14 | "handler": "Resource.count", 15 | "config": { 16 | "policies": [] 17 | } 18 | }, 19 | { 20 | "method": "GET", 21 | "path": "/resources/:id", 22 | "handler": "Resource.findOne", 23 | "config": { 24 | "policies": [] 25 | } 26 | }, 27 | { 28 | "method": "POST", 29 | "path": "/resources", 30 | "handler": "Resource.create", 31 | "config": { 32 | "policies": [] 33 | } 34 | }, 35 | { 36 | "method": "PUT", 37 | "path": "/resources/:id", 38 | "handler": "Resource.update", 39 | "config": { 40 | "policies": [] 41 | } 42 | }, 43 | { 44 | "method": "DELETE", 45 | "path": "/resources/:id", 46 | "handler": "Resource.delete", 47 | "config": { 48 | "policies": [] 49 | } 50 | } 51 | ] 52 | } 53 | -------------------------------------------------------------------------------- /api/resource/controllers/Resource.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | /** 4 | * Read the documentation (https://strapi.io/documentation/3.0.0-beta.x/concepts/controllers.html#core-controllers) 5 | * to customize this controller 6 | */ 7 | 8 | module.exports = {}; 9 | -------------------------------------------------------------------------------- /api/resource/models/Resource.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | /** 4 | * Lifecycle callbacks for the `Resource` model. 5 | */ 6 | 7 | module.exports = { 8 | // Before saving a value. 9 | // Fired before an `insert` or `update` query. 10 | // beforeSave: async (model, attrs, options) => {}, 11 | 12 | // After saving a value. 13 | // Fired after an `insert` or `update` query. 14 | // afterSave: async (model, response, options) => {}, 15 | 16 | // Before fetching a value. 17 | // Fired before a `fetch` operation. 18 | // beforeFetch: async (model, columns, options) => {}, 19 | 20 | // After fetching a value. 21 | // Fired after a `fetch` operation. 22 | // afterFetch: async (model, response, options) => {}, 23 | 24 | // Before fetching all values. 25 | // Fired before a `fetchAll` operation. 26 | // beforeFetchAll: async (model, columns, options) => {}, 27 | 28 | // After fetching all values. 29 | // Fired after a `fetchAll` operation. 30 | // afterFetchAll: async (model, response, options) => {}, 31 | 32 | // Before creating a value. 33 | // Fired before an `insert` query. 34 | // beforeCreate: async (model, attrs, options) => {}, 35 | 36 | // After creating a value. 37 | // Fired after an `insert` query. 38 | // afterCreate: async (model, attrs, options) => {}, 39 | 40 | // Before updating a value. 41 | // Fired before an `update` query. 42 | // beforeUpdate: async (model, attrs, options) => {}, 43 | 44 | // After updating a value. 45 | // Fired after an `update` query. 46 | // afterUpdate: async (model, attrs, options) => {}, 47 | 48 | // Before destroying a value. 49 | // Fired before a `delete` query. 50 | // beforeDestroy: async (model, attrs, options) => {}, 51 | 52 | // After destroying a value. 53 | // Fired after a `delete` query. 54 | // afterDestroy: async (model, attrs, options) => {} 55 | }; 56 | -------------------------------------------------------------------------------- /api/resource/models/Resource.settings.json: -------------------------------------------------------------------------------- 1 | { 2 | "connection": "default", 3 | "collectionName": "resources", 4 | "info": { 5 | "name": "resource", 6 | "description": "Resources are teams or team members responsible for activities" 7 | }, 8 | "options": { 9 | "increments": true, 10 | "timestamps": true, 11 | "comment": "" 12 | }, 13 | "attributes": { 14 | "resource": { 15 | "type": "string" 16 | } 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /api/resource/services/Resource.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | /** 4 | * Read the documentation (https://strapi.io/documentation/3.0.0-beta.x/concepts/services.html#core-services) 5 | * to customize this service 6 | */ 7 | 8 | module.exports = {}; 9 | -------------------------------------------------------------------------------- /config/application.json: -------------------------------------------------------------------------------- 1 | { 2 | "favicon": { 3 | "path": "favicon.ico", 4 | "maxAge": 86400000 5 | }, 6 | "public": { 7 | "path": "./public", 8 | "maxAge": 60000 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /config/custom.json: -------------------------------------------------------------------------------- 1 | { 2 | "myCustomConfiguration": "This configuration is accessible through strapi.config.myCustomConfiguration" 3 | } 4 | -------------------------------------------------------------------------------- /config/environments/development/custom.json: -------------------------------------------------------------------------------- 1 | { 2 | "myCustomConfiguration": "This configuration is accessible through strapi.config.environments.development.myCustomConfiguration" 3 | } 4 | -------------------------------------------------------------------------------- /config/environments/development/database.json: -------------------------------------------------------------------------------- 1 | { 2 | "defaultConnection": "default", 3 | "connections": { 4 | "default": { 5 | "connector": "strapi-hook-bookshelf", 6 | "settings": { 7 | "client": "sqlite", 8 | "filename": ".tmp/data.db" 9 | }, 10 | "options": { 11 | "useNullAsDefault": true 12 | } 13 | } 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /config/environments/development/request.json: -------------------------------------------------------------------------------- 1 | { 2 | "session": { 3 | "enabled": true, 4 | "client": "cookie", 5 | "key": "strapi.sid", 6 | "prefix": "strapi:sess:", 7 | "secretKeys": ["mySecretKey1", "mySecretKey2"], 8 | "httpOnly": true, 9 | "maxAge": 86400000, 10 | "overwrite": true, 11 | "signed": false, 12 | "rolling": false 13 | }, 14 | "logger": { 15 | "level": "debug", 16 | "exposeInContext": true, 17 | "requests": true 18 | }, 19 | "parser": { 20 | "enabled": true, 21 | "multipart": true 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /config/environments/development/response.json: -------------------------------------------------------------------------------- 1 | { 2 | "gzip": { 3 | "enabled": false 4 | }, 5 | "responseTime": { 6 | "enabled": false 7 | }, 8 | "poweredBy": { 9 | "enabled": true, 10 | "value": "Strapi " 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /config/environments/development/security.json: -------------------------------------------------------------------------------- 1 | { 2 | "csp": { 3 | "enabled": true, 4 | "policy": [ 5 | { 6 | "img-src": "'self' http:" 7 | }, 8 | "block-all-mixed-content" 9 | ] 10 | }, 11 | "p3p": { 12 | "enabled": false, 13 | "value": "" 14 | }, 15 | "hsts": { 16 | "enabled": true, 17 | "maxAge": 31536000, 18 | "includeSubDomains": true 19 | }, 20 | "xframe": { 21 | "enabled": true, 22 | "value": "SAMEORIGIN" 23 | }, 24 | "xss": { 25 | "enabled": true, 26 | "mode": "block" 27 | }, 28 | "cors": { 29 | "enabled": true 30 | }, 31 | "ip": { 32 | "enabled": false, 33 | "whiteList": [], 34 | "blackList": [] 35 | } 36 | } 37 | -------------------------------------------------------------------------------- /config/environments/development/server.json: -------------------------------------------------------------------------------- 1 | { 2 | "host": "localhost", 3 | "port": 1337, 4 | "proxy": { 5 | "enabled": false 6 | }, 7 | "cron": { 8 | "enabled": false 9 | }, 10 | "admin": { 11 | "autoOpen": false 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /config/environments/production/custom.json: -------------------------------------------------------------------------------- 1 | { 2 | "myCustomConfiguration": "This configuration is accessible through strapi.config.environments.production.myCustomConfiguration" 3 | } 4 | -------------------------------------------------------------------------------- /config/environments/production/database.json: -------------------------------------------------------------------------------- 1 | { 2 | "defaultConnection": "default", 3 | "connections": { 4 | "default": { 5 | "connector": "strapi-hook-bookshelf", 6 | "settings": { 7 | "client": "sqlite", 8 | "host": "${process.env.DATABASE_HOST || '127.0.0.1'}", 9 | "port": "${process.env.DATABASE_PORT || 27017}", 10 | "database": "${process.env.DATABASE_NAME || 'strapi'}", 11 | "username": "${process.env.DATABASE_USERNAME || ''}", 12 | "password": "${process.env.DATABASE_PASSWORD || ''}" 13 | }, 14 | "options": {} 15 | } 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /config/environments/production/request.json: -------------------------------------------------------------------------------- 1 | { 2 | "session": { 3 | "enabled": true, 4 | "client": "cookie", 5 | "key": "strapi.sid", 6 | "prefix": "strapi:sess:", 7 | "secretKeys": ["mySecretKey1", "mySecretKey2"], 8 | "httpOnly": true, 9 | "maxAge": 86400000, 10 | "overwrite": true, 11 | "signed": false, 12 | "rolling": false 13 | }, 14 | "logger": { 15 | "level": "info", 16 | "exposeInContext": true, 17 | "requests": false 18 | }, 19 | "parser": { 20 | "enabled": true, 21 | "multipart": true 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /config/environments/production/response.json: -------------------------------------------------------------------------------- 1 | { 2 | "gzip": { 3 | "enabled": true 4 | }, 5 | "responseTime": { 6 | "enabled": false 7 | }, 8 | "poweredBy": { 9 | "enabled": true, 10 | "value": "Strapi " 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /config/environments/production/security.json: -------------------------------------------------------------------------------- 1 | { 2 | "csp": { 3 | "enabled": true, 4 | "policy": [ 5 | { 6 | "img-src": "'self' http:" 7 | }, 8 | "block-all-mixed-content" 9 | ] 10 | }, 11 | "p3p": { 12 | "enabled": true, 13 | "value": "" 14 | }, 15 | "hsts": { 16 | "enabled": true, 17 | "maxAge": 31536000, 18 | "includeSubDomains": true 19 | }, 20 | "xframe": { 21 | "enabled": true, 22 | "value": "SAMEORIGIN" 23 | }, 24 | "xss": { 25 | "enabled": true, 26 | "mode": "block" 27 | }, 28 | "cors": { 29 | "enabled": true 30 | }, 31 | "ip": { 32 | "enabled": false, 33 | "whiteList": [], 34 | "blackList": [] 35 | } 36 | } 37 | -------------------------------------------------------------------------------- /config/environments/production/server.json: -------------------------------------------------------------------------------- 1 | { 2 | "host": "localhost", 3 | "port": "${process.env.PORT || 1337}", 4 | "production": true, 5 | "proxy": { 6 | "enabled": false 7 | }, 8 | "cron": { 9 | "enabled": false 10 | }, 11 | "admin": { 12 | "autoOpen": false 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /config/environments/staging/custom.json: -------------------------------------------------------------------------------- 1 | { 2 | "myCustomConfiguration": "This configuration is accessible through strapi.config.environments.staging.myCustomConfiguration" 3 | } 4 | -------------------------------------------------------------------------------- /config/environments/staging/database.json: -------------------------------------------------------------------------------- 1 | { 2 | "defaultConnection": "default", 3 | "connections": { 4 | "default": { 5 | "connector": "strapi-hook-bookshelf", 6 | "settings": { 7 | "client": "sqlite", 8 | "host": "${process.env.DATABASE_HOST || '127.0.0.1'}", 9 | "port": "${process.env.DATABASE_PORT || 27017}", 10 | "database": "${process.env.DATABASE_NAME || 'strapi'}", 11 | "username": "${process.env.DATABASE_USERNAME || ''}", 12 | "password": "${process.env.DATABASE_PASSWORD || ''}" 13 | }, 14 | "options": {} 15 | } 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /config/environments/staging/request.json: -------------------------------------------------------------------------------- 1 | { 2 | "session": { 3 | "enabled": true, 4 | "client": "cookie", 5 | "key": "strapi.sid", 6 | "prefix": "strapi:sess:", 7 | "secretKeys": ["mySecretKey1", "mySecretKey2"], 8 | "httpOnly": true, 9 | "maxAge": 86400000, 10 | "overwrite": true, 11 | "signed": false, 12 | "rolling": false 13 | }, 14 | "logger": { 15 | "level": "info", 16 | "exposeInContext": true, 17 | "requests": false 18 | }, 19 | "parser": { 20 | "enabled": true, 21 | "multipart": true 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /config/environments/staging/response.json: -------------------------------------------------------------------------------- 1 | { 2 | "gzip": { 3 | "enabled": true 4 | }, 5 | "responseTime": { 6 | "enabled": false 7 | }, 8 | "poweredBy": { 9 | "enabled": true, 10 | "value": "Strapi " 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /config/environments/staging/security.json: -------------------------------------------------------------------------------- 1 | { 2 | "csp": { 3 | "enabled": true, 4 | "policy": [ 5 | { 6 | "img-src": "'self' http:" 7 | }, 8 | "block-all-mixed-content" 9 | ] 10 | }, 11 | "p3p": { 12 | "enabled": true, 13 | "value": "" 14 | }, 15 | "hsts": { 16 | "enabled": true, 17 | "maxAge": 31536000, 18 | "includeSubDomains": true 19 | }, 20 | "xframe": { 21 | "enabled": true, 22 | "value": "SAMEORIGIN" 23 | }, 24 | "xss": { 25 | "enabled": true, 26 | "mode": "block" 27 | }, 28 | "cors": { 29 | "enabled": true 30 | }, 31 | "ip": { 32 | "enabled": false, 33 | "whiteList": [], 34 | "blackList": [] 35 | } 36 | } 37 | -------------------------------------------------------------------------------- /config/environments/staging/server.json: -------------------------------------------------------------------------------- 1 | { 2 | "host": "localhost", 3 | "port": "${process.env.PORT || 1337}", 4 | "production": true, 5 | "proxy": { 6 | "enabled": false 7 | }, 8 | "cron": { 9 | "enabled": false 10 | }, 11 | "admin": { 12 | "autoOpen": false 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /config/functions/bootstrap.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | /** 4 | * An asynchronous bootstrap function that runs before 5 | * your application gets started. 6 | * 7 | * This gives you an opportunity to set up your data model, 8 | * run jobs, or perform some special logic. 9 | * 10 | * See more details here: https://strapi.io/documentation/3.0.0-beta.x/configurations/configurations.html#bootstrap 11 | */ 12 | 13 | module.exports = () => {}; 14 | -------------------------------------------------------------------------------- /config/functions/cron.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | /** 4 | * Cron config that gives you an opportunity 5 | * to run scheduled jobs. 6 | * 7 | * The cron format consists of: 8 | * [MINUTE] [HOUR] [DAY OF MONTH] [MONTH OF YEAR] [DAY OF WEEK] [YEAR (optional)] 9 | */ 10 | 11 | module.exports = { 12 | /** 13 | * Simple example. 14 | * Every monday at 1am. 15 | */ 16 | // '0 1 * * 1': () => { 17 | // 18 | // } 19 | }; 20 | -------------------------------------------------------------------------------- /config/functions/responses/404.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | module.exports = async (/* ctx */) => { 4 | // return ctx.notFound('My custom message 404'); 5 | }; 6 | -------------------------------------------------------------------------------- /config/hook.json: -------------------------------------------------------------------------------- 1 | { 2 | "timeout": 3000, 3 | "load": { 4 | "before": [], 5 | "order": [ 6 | "Define the hooks' load order by putting their names in this array in the right order" 7 | ], 8 | "after": [] 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /config/language.json: -------------------------------------------------------------------------------- 1 | { 2 | "enabled": true, 3 | "defaultLocale": "en_us", 4 | "modes": [ 5 | "query", 6 | "subdomain", 7 | "cookie", 8 | "header", 9 | "url", 10 | "tld" 11 | ], 12 | "cookieName": "locale" 13 | } 14 | -------------------------------------------------------------------------------- /config/locales/de_de.json: -------------------------------------------------------------------------------- 1 | { 2 | "welcome": "Willkommen" 3 | } 4 | -------------------------------------------------------------------------------- /config/locales/en_us.json: -------------------------------------------------------------------------------- 1 | { 2 | "welcome": "Welcome" 3 | } 4 | -------------------------------------------------------------------------------- /config/locales/es_es.json: -------------------------------------------------------------------------------- 1 | { 2 | "welcome": "Bienvenido" 3 | } 4 | -------------------------------------------------------------------------------- /config/locales/fr_fr.json: -------------------------------------------------------------------------------- 1 | { 2 | "welcome": "Bienvenue" 3 | } 4 | -------------------------------------------------------------------------------- /config/locales/it_it.json: -------------------------------------------------------------------------------- 1 | { 2 | "welcome": "Benvenuto" 3 | } 4 | -------------------------------------------------------------------------------- /config/locales/ja_jp.json: -------------------------------------------------------------------------------- 1 | { 2 | "welcome": "ようこそ" 3 | } 4 | -------------------------------------------------------------------------------- /config/locales/ru_ru.json: -------------------------------------------------------------------------------- 1 | { 2 | "welcome": "Добро пожаловать" 3 | } 4 | -------------------------------------------------------------------------------- /config/locales/tr_tr.json: -------------------------------------------------------------------------------- 1 | { 2 | "welcome": "Hoşgeldin" 3 | } 4 | -------------------------------------------------------------------------------- /config/middleware.json: -------------------------------------------------------------------------------- 1 | { 2 | "timeout": 100, 3 | "load": { 4 | "before": [ 5 | "responseTime", 6 | "logger", 7 | "cors", 8 | "responses", 9 | "gzip" 10 | ], 11 | "order": [ 12 | "Define the middlewares' load order by putting their name in this array is the right order" 13 | ], 14 | "after": [ 15 | "parser", 16 | "router" 17 | ] 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /extensions/.gitkeep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/seanrioux/strapi-okria-api/e29e26046b2c8291674bf18a88405826acd6697d/extensions/.gitkeep -------------------------------------------------------------------------------- /extensions/users-permissions/config/jwt.json: -------------------------------------------------------------------------------- 1 | { 2 | "jwtSecret": "3decf29c-a38f-45cf-adf3-29d18a5b09b0" 3 | } -------------------------------------------------------------------------------- /favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/seanrioux/strapi-okria-api/e29e26046b2c8291674bf18a88405826acd6697d/favicon.ico -------------------------------------------------------------------------------- /groups/activity.json: -------------------------------------------------------------------------------- 1 | { 2 | "info": { 3 | "name": "activity", 4 | "description": "Activities are tasks towards completing an initiative" 5 | }, 6 | "connection": "default", 7 | "collectionName": "groups_activities", 8 | "attributes": { 9 | "resource": { 10 | "model": "resource" 11 | }, 12 | "task": { 13 | "type": "string", 14 | "required": true 15 | }, 16 | "estimate": { 17 | "type": "float" 18 | }, 19 | "cadence": { 20 | "enum": [ 21 | "hour", 22 | "day", 23 | "week", 24 | "sprint", 25 | "month", 26 | "quarter", 27 | "year", 28 | "points" 29 | ], 30 | "type": "enumeration" 31 | } 32 | } 33 | } 34 | -------------------------------------------------------------------------------- /groups/log.json: -------------------------------------------------------------------------------- 1 | { 2 | "info": { 3 | "name": "log", 4 | "description": "Logs capture a current metric value for objective grading" 5 | }, 6 | "connection": "default", 7 | "collectionName": "groups_logs", 8 | "attributes": { 9 | "date": { 10 | "type": "date" 11 | }, 12 | "value": { 13 | "type": "float" 14 | } 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /groups/result.json: -------------------------------------------------------------------------------- 1 | { 2 | "info": { 3 | "name": "result", 4 | "description": "Key results are quantitative goals towards an objective" 5 | }, 6 | "connection": "default", 7 | "collectionName": "groups_results", 8 | "attributes": { 9 | "direction": { 10 | "enum": [ 11 | "increase", 12 | "decrease", 13 | "maintain" 14 | ], 15 | "type": "enumeration" 16 | }, 17 | "metric": { 18 | "model": "metric" 19 | }, 20 | "start": { 21 | "type": "float" 22 | }, 23 | "goal": { 24 | "type": "float" 25 | }, 26 | "date": { 27 | "type": "date" 28 | } 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "my-project", 3 | "private": true, 4 | "version": "0.1.0", 5 | "description": "A Strapi application", 6 | "scripts": { 7 | "develop": "strapi develop", 8 | "start": "strapi start", 9 | "build": "strapi build", 10 | "strapi": "strapi" 11 | }, 12 | "devDependencies": {}, 13 | "dependencies": { 14 | "strapi": "3.0.0-beta.17.8", 15 | "strapi-admin": "3.0.0-beta.17.8", 16 | "strapi-utils": "3.0.0-beta.17.8", 17 | "strapi-plugin-content-type-builder": "3.0.0-beta.17.8", 18 | "strapi-plugin-content-manager": "3.0.0-beta.17.8", 19 | "strapi-plugin-users-permissions": "3.0.0-beta.17.8", 20 | "strapi-plugin-email": "3.0.0-beta.17.8", 21 | "strapi-plugin-upload": "3.0.0-beta.17.8", 22 | "strapi-hook-bookshelf": "3.0.0-beta.17.8", 23 | "strapi-hook-knex": "3.0.0-beta.17.8", 24 | "knex": "latest", 25 | "sqlite3": "latest" 26 | }, 27 | "author": { 28 | "name": "A Strapi developer" 29 | }, 30 | "strapi": { 31 | "uuid": "9effd5da-a513-459e-b47b-d361698814f7" 32 | }, 33 | "engines": { 34 | "node": ">=10.0.0", 35 | "npm": ">=6.0.0" 36 | }, 37 | "license": "MIT" 38 | } 39 | -------------------------------------------------------------------------------- /public/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | Welcome to your Strapi app 8 | 9 | 141 | 142 | 143 |
144 |
145 |

Welcome.

146 |

You successfully created your Strapi application.

147 |

You are looking at: ./public/index.html.

148 |

Your built-in admin panel is available at /admin. 149 |

Create your first API

150 |

Easily generate a complete API with controllers, models and routes using:

151 |
$ strapi generate:api <apiName>
152 |

Resources

153 |

You'll probably also want to learn how to customize your application, set up security and configure your data sources.

154 |

For more help getting started, check out: 155 |

161 |

162 |
163 |
164 | 165 | 166 | -------------------------------------------------------------------------------- /public/robots.txt: -------------------------------------------------------------------------------- 1 | # To prevent search engines from seeing the site altogether, uncomment the next two lines: 2 | # User-Agent: * 3 | # Disallow: / 4 | -------------------------------------------------------------------------------- /public/uploads/.gitkeep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/seanrioux/strapi-okria-api/e29e26046b2c8291674bf18a88405826acd6697d/public/uploads/.gitkeep --------------------------------------------------------------------------------