Christian Fraß commited on 2021-03-03 00:27:18
              Zeige 29 geänderte Dateien mit 1468 Einfügungen und 0 Löschungen.
            
| ... | ... | 
                      @@ -0,0 +1,258 @@  | 
                  
| 1 | 
                        +// import {int} from './types';
                       | 
                    |
| 2 | 
                        +  | 
                    |
| 3 | 
                        +  | 
                    |
| 4 | 
                        +namespace helpers.database  | 
                    |
| 5 | 
                        +{
                       | 
                    |
| 6 | 
                        +  | 
                    |
| 7 | 
                        + /**  | 
                    |
| 8 | 
                        + */  | 
                    |
| 9 | 
                        +	type type_query = {
                       | 
                    |
| 10 | 
                        + sql_template : string;  | 
                    |
| 11 | 
                        +		arguments : {[name : string] : any};
                       | 
                    |
| 12 | 
                        + };  | 
                    |
| 13 | 
                        +  | 
                    |
| 14 | 
                        +  | 
                    |
| 15 | 
                        + /**  | 
                    |
| 16 | 
                        + */  | 
                    |
| 17 | 
                        + function resolve_path  | 
                    |
| 18 | 
                        + (  | 
                    |
| 19 | 
                        + path_raw : string  | 
                    |
| 20 | 
                        + ) : string  | 
                    |
| 21 | 
                        +	{
                       | 
                    |
| 22 | 
                        +		return ("sql/" + path_raw.replace(new RegExp("\\.", "g"), "/") + ".sql");
                       | 
                    |
| 23 | 
                        + }  | 
                    |
| 24 | 
                        +  | 
                    |
| 25 | 
                        +  | 
                    |
| 26 | 
                        + /**  | 
                    |
| 27 | 
                        + */  | 
                    |
| 28 | 
                        + function fix_query  | 
                    |
| 29 | 
                        + (  | 
                    |
| 30 | 
                        + query : type_query,  | 
                    |
| 31 | 
                        + ) : type_query  | 
                    |
| 32 | 
                        +	{
                       | 
                    |
| 33 | 
                        +		return {
                       | 
                    |
| 34 | 
                        + "sql_template": query.sql_template.replace  | 
                    |
| 35 | 
                        + (  | 
                    |
| 36 | 
                        +				new RegExp(":([0-9a-zA-Z_-]+)", "g"),
                       | 
                    |
| 37 | 
                        + "$$$1"  | 
                    |
| 38 | 
                        + ),  | 
                    |
| 39 | 
                        + "arguments": (  | 
                    |
| 40 | 
                        + () =>  | 
                    |
| 41 | 
                        +				{
                       | 
                    |
| 42 | 
                        +					let arguments_ : {[name : string] : any} = {};
                       | 
                    |
| 43 | 
                        + Object.keys(query.arguments).forEach  | 
                    |
| 44 | 
                        + (  | 
                    |
| 45 | 
                        +						(name) => {arguments_["$" + name] = query.arguments[name];}
                       | 
                    |
| 46 | 
                        + );  | 
                    |
| 47 | 
                        + return arguments_;  | 
                    |
| 48 | 
                        + }  | 
                    |
| 49 | 
                        + ) (),  | 
                    |
| 50 | 
                        + };  | 
                    |
| 51 | 
                        + }  | 
                    |
| 52 | 
                        +  | 
                    |
| 53 | 
                        +  | 
                    |
| 54 | 
                        + /**  | 
                    |
| 55 | 
                        + */  | 
                    |
| 56 | 
                        + function query_do_free_  | 
                    |
| 57 | 
                        + (  | 
                    |
| 58 | 
                        + query : type_query  | 
                    |
| 59 | 
                        + ) : Promise<void>  | 
                    |
| 60 | 
                        +	{
                       | 
                    |
| 61 | 
                        +		const nm_sqlite3 = require("sqlite3");
                       | 
                    |
| 62 | 
                        + const query_fixed : type_query = fix_query(query);  | 
                    |
| 63 | 
                        +		// console.info("---\n" + query_fixed.sql_template + "\n" + JSON.stringify(query_fixed.arguments) + "\n---\n");
                       | 
                    |
| 64 | 
                        + return (  | 
                    |
| 65 | 
                        + new Promise<void>  | 
                    |
| 66 | 
                        + (  | 
                    |
| 67 | 
                        + (resolve, reject) =>  | 
                    |
| 68 | 
                        +				{
                       | 
                    |
| 69 | 
                        +					const database/* : nm_sqlite3.Database*/ = new nm_sqlite3.Database("concepts.sqlite");
                       | 
                    |
| 70 | 
                        + database.run  | 
                    |
| 71 | 
                        + (  | 
                    |
| 72 | 
                        + query_fixed.sql_template,  | 
                    |
| 73 | 
                        + query_fixed.arguments,  | 
                    |
| 74 | 
                        + function (error)  | 
                    |
| 75 | 
                        +						{
                       | 
                    |
| 76 | 
                        + if (error)  | 
                    |
| 77 | 
                        +							{
                       | 
                    |
| 78 | 
                        + reject(error);  | 
                    |
| 79 | 
                        + }  | 
                    |
| 80 | 
                        + else  | 
                    |
| 81 | 
                        +							{
                       | 
                    |
| 82 | 
                        + resolve(undefined);  | 
                    |
| 83 | 
                        + }  | 
                    |
| 84 | 
                        + }  | 
                    |
| 85 | 
                        + );  | 
                    |
| 86 | 
                        + database.close();  | 
                    |
| 87 | 
                        + }  | 
                    |
| 88 | 
                        + )  | 
                    |
| 89 | 
                        + );  | 
                    |
| 90 | 
                        + }  | 
                    |
| 91 | 
                        +  | 
                    |
| 92 | 
                        +  | 
                    |
| 93 | 
                        + /**  | 
                    |
| 94 | 
                        + */  | 
                    |
| 95 | 
                        + function query_get_free_  | 
                    |
| 96 | 
                        + (  | 
                    |
| 97 | 
                        + query : type_query  | 
                    |
| 98 | 
                        + ) : Promise<Array<type_row>>  | 
                    |
| 99 | 
                        +	{
                       | 
                    |
| 100 | 
                        +		const nm_sqlite3 = require("sqlite3");
                       | 
                    |
| 101 | 
                        + const query_fixed : type_query = fix_query(query);  | 
                    |
| 102 | 
                        +		// console.info("---\n" + query_fixed.sql_template + "\n" + JSON.stringify(query_fixed.arguments) + "\n---\n");
                       | 
                    |
| 103 | 
                        + return (  | 
                    |
| 104 | 
                        + new Promise<Array<type_row>>  | 
                    |
| 105 | 
                        + (  | 
                    |
| 106 | 
                        + (resolve, reject) =>  | 
                    |
| 107 | 
                        +				{
                       | 
                    |
| 108 | 
                        +					const database/* : nm_sqlite3.Database*/ = new nm_sqlite3.Database("concepts.sqlite");
                       | 
                    |
| 109 | 
                        + database.all  | 
                    |
| 110 | 
                        + (  | 
                    |
| 111 | 
                        + query_fixed.sql_template,  | 
                    |
| 112 | 
                        + query_fixed.arguments,  | 
                    |
| 113 | 
                        + function (error, rows)  | 
                    |
| 114 | 
                        +						{
                       | 
                    |
| 115 | 
                        +							// console.info({error,rows});
                       | 
                    |
| 116 | 
                        + if (error)  | 
                    |
| 117 | 
                        +							{
                       | 
                    |
| 118 | 
                        + reject(error);  | 
                    |
| 119 | 
                        + }  | 
                    |
| 120 | 
                        + else  | 
                    |
| 121 | 
                        +							{
                       | 
                    |
| 122 | 
                        + resolve(rows);  | 
                    |
| 123 | 
                        + }  | 
                    |
| 124 | 
                        + }  | 
                    |
| 125 | 
                        + );  | 
                    |
| 126 | 
                        + database.close();  | 
                    |
| 127 | 
                        + }  | 
                    |
| 128 | 
                        + )  | 
                    |
| 129 | 
                        + );  | 
                    |
| 130 | 
                        + }  | 
                    |
| 131 | 
                        +  | 
                    |
| 132 | 
                        +  | 
                    |
| 133 | 
                        + /**  | 
                    |
| 134 | 
                        + */  | 
                    |
| 135 | 
                        + function query_put_free_  | 
                    |
| 136 | 
                        + (  | 
                    |
| 137 | 
                        + query : type_query  | 
                    |
| 138 | 
                        + ) : Promise<int>  | 
                    |
| 139 | 
                        +	{
                       | 
                    |
| 140 | 
                        +		const nm_sqlite3 = require("sqlite3");
                       | 
                    |
| 141 | 
                        + const query_fixed : type_query = fix_query(query);  | 
                    |
| 142 | 
                        +		// console.info("---\n" + query_fixed.sql_template + "\n" + JSON.stringify(query_fixed.arguments) + "\n---\n");
                       | 
                    |
| 143 | 
                        + return (  | 
                    |
| 144 | 
                        + new Promise<int>  | 
                    |
| 145 | 
                        + (  | 
                    |
| 146 | 
                        + (resolve, reject) =>  | 
                    |
| 147 | 
                        +				{
                       | 
                    |
| 148 | 
                        +					const database/* : nm_sqlite3.Database*/ = new nm_sqlite3.Database("concepts.sqlite");
                       | 
                    |
| 149 | 
                        + database.run  | 
                    |
| 150 | 
                        + (  | 
                    |
| 151 | 
                        + query_fixed.sql_template,  | 
                    |
| 152 | 
                        + query_fixed.arguments,  | 
                    |
| 153 | 
                        + function (error)  | 
                    |
| 154 | 
                        +						{
                       | 
                    |
| 155 | 
                        + if (error)  | 
                    |
| 156 | 
                        +							{
                       | 
                    |
| 157 | 
                        + reject(error);  | 
                    |
| 158 | 
                        + }  | 
                    |
| 159 | 
                        + else  | 
                    |
| 160 | 
                        +							{
                       | 
                    |
| 161 | 
                        + resolve(this.lastID);  | 
                    |
| 162 | 
                        + }  | 
                    |
| 163 | 
                        + }  | 
                    |
| 164 | 
                        + );  | 
                    |
| 165 | 
                        + database.close();  | 
                    |
| 166 | 
                        + }  | 
                    |
| 167 | 
                        + )  | 
                    |
| 168 | 
                        + );  | 
                    |
| 169 | 
                        + }  | 
                    |
| 170 | 
                        +  | 
                    |
| 171 | 
                        +  | 
                    |
| 172 | 
                        + /**  | 
                    |
| 173 | 
                        + */  | 
                    |
| 174 | 
                        + export function query_do_free  | 
                    |
| 175 | 
                        + (  | 
                    |
| 176 | 
                        + sql_template : string,  | 
                    |
| 177 | 
                        +		arguments_ : {[name : string] : any} = {}
                       | 
                    |
| 178 | 
                        + ) : Promise<void>  | 
                    |
| 179 | 
                        +	{
                       | 
                    |
| 180 | 
                        +		return query_do_free_({"sql_template": sql_template, "arguments": arguments_});
                       | 
                    |
| 181 | 
                        + }  | 
                    |
| 182 | 
                        +  | 
                    |
| 183 | 
                        +  | 
                    |
| 184 | 
                        + /**  | 
                    |
| 185 | 
                        + */  | 
                    |
| 186 | 
                        + export function query_get_free  | 
                    |
| 187 | 
                        + (  | 
                    |
| 188 | 
                        + sql_template : string,  | 
                    |
| 189 | 
                        +		arguments_ : {[name : string] : any} = {}
                       | 
                    |
| 190 | 
                        + ) : Promise<Array<type_row>>  | 
                    |
| 191 | 
                        +	{
                       | 
                    |
| 192 | 
                        +		return query_get_free_({"sql_template": sql_template, "arguments": arguments_});
                       | 
                    |
| 193 | 
                        + }  | 
                    |
| 194 | 
                        +  | 
                    |
| 195 | 
                        +  | 
                    |
| 196 | 
                        + /**  | 
                    |
| 197 | 
                        + */  | 
                    |
| 198 | 
                        + export function query_put_free  | 
                    |
| 199 | 
                        + (  | 
                    |
| 200 | 
                        + sql_template : string,  | 
                    |
| 201 | 
                        +		arguments_ : {[name : string] : any} = {}
                       | 
                    |
| 202 | 
                        + ) : Promise<int>  | 
                    |
| 203 | 
                        +	{
                       | 
                    |
| 204 | 
                        +		return query_put_free_({"sql_template": sql_template, "arguments": arguments_});
                       | 
                    |
| 205 | 
                        + }  | 
                    |
| 206 | 
                        +  | 
                    |
| 207 | 
                        +  | 
                    |
| 208 | 
                        + /**  | 
                    |
| 209 | 
                        + */  | 
                    |
| 210 | 
                        + export function query_do_named  | 
                    |
| 211 | 
                        + (  | 
                    |
| 212 | 
                        + name : string,  | 
                    |
| 213 | 
                        +		arguments_ : {[name : string] : any} = {}
                       | 
                    |
| 214 | 
                        + ) : Promise<void>  | 
                    |
| 215 | 
                        +	{
                       | 
                    |
| 216 | 
                        + return query_do_free  | 
                    |
| 217 | 
                        + (  | 
                    |
| 218 | 
                        + helpers.file.read(resolve_path(name)),  | 
                    |
| 219 | 
                        + arguments_  | 
                    |
| 220 | 
                        + );  | 
                    |
| 221 | 
                        + }  | 
                    |
| 222 | 
                        +  | 
                    |
| 223 | 
                        +  | 
                    |
| 224 | 
                        + /**  | 
                    |
| 225 | 
                        + */  | 
                    |
| 226 | 
                        + export function query_get_named  | 
                    |
| 227 | 
                        + (  | 
                    |
| 228 | 
                        + name : string,  | 
                    |
| 229 | 
                        +		arguments_ : {[name : string] : any} = {}
                       | 
                    |
| 230 | 
                        + ) : Promise<Array<type_row>>  | 
                    |
| 231 | 
                        +	{
                       | 
                    |
| 232 | 
                        + return query_get_free  | 
                    |
| 233 | 
                        + (  | 
                    |
| 234 | 
                        + helpers.file.read(resolve_path(name)),  | 
                    |
| 235 | 
                        + arguments_  | 
                    |
| 236 | 
                        + );  | 
                    |
| 237 | 
                        + }  | 
                    |
| 238 | 
                        +  | 
                    |
| 239 | 
                        +  | 
                    |
| 240 | 
                        + /**  | 
                    |
| 241 | 
                        + */  | 
                    |
| 242 | 
                        + export function query_put_named  | 
                    |
| 243 | 
                        + (  | 
                    |
| 244 | 
                        + name : string,  | 
                    |
| 245 | 
                        +		arguments_ : {[name : string] : any} = {}
                       | 
                    |
| 246 | 
                        + ) : Promise<int>  | 
                    |
| 247 | 
                        +	{
                       | 
                    |
| 248 | 
                        + return query_put_free  | 
                    |
| 249 | 
                        + (  | 
                    |
| 250 | 
                        + helpers.file.read(resolve_path(name)),  | 
                    |
| 251 | 
                        + arguments_  | 
                    |
| 252 | 
                        + );  | 
                    |
| 253 | 
                        + }  | 
                    |
| 254 | 
                        +  | 
                    |
| 255 | 
                        +}  | 
                    |
| 256 | 
                        +  | 
                    |
| 257 | 
                        +  | 
                    |
| 258 | 
                        +  | 
                    
| ... | ... | 
                      @@ -0,0 +1,18 @@  | 
                  
| 1 | 
                        +namespace helpers.file  | 
                    |
| 2 | 
                        +{
                       | 
                    |
| 3 | 
                        +  | 
                    |
| 4 | 
                        + /**  | 
                    |
| 5 | 
                        + */  | 
                    |
| 6 | 
                        + export function read  | 
                    |
| 7 | 
                        + (  | 
                    |
| 8 | 
                        + path : string  | 
                    |
| 9 | 
                        + ) : string  | 
                    |
| 10 | 
                        +	{
                       | 
                    |
| 11 | 
                        +		const nm_fs = require("fs");
                       | 
                    |
| 12 | 
                        + const buffer : Buffer = nm_fs.readFileSync(path);  | 
                    |
| 13 | 
                        + const content : string = buffer.toString();  | 
                    |
| 14 | 
                        + return content;  | 
                    |
| 15 | 
                        + }  | 
                    |
| 16 | 
                        +  | 
                    |
| 17 | 
                        +}  | 
                    |
| 18 | 
                        +  | 
                    
| ... | ... | 
                      @@ -0,0 +1,33 @@  | 
                  
| 1 | 
                        +namespace helpers.misc  | 
                    |
| 2 | 
                        +{
                       | 
                    |
| 3 | 
                        +  | 
                    |
| 4 | 
                        + /**  | 
                    |
| 5 | 
                        + */  | 
                    |
| 6 | 
                        + export function stdin  | 
                    |
| 7 | 
                        + (  | 
                    |
| 8 | 
                        + ) : Promise<string>  | 
                    |
| 9 | 
                        +	{
                       | 
                    |
| 10 | 
                        + return (  | 
                    |
| 11 | 
                        + new Promise<string>  | 
                    |
| 12 | 
                        + (  | 
                    |
| 13 | 
                        + (resolve, reject) =>  | 
                    |
| 14 | 
                        +				{
                       | 
                    |
| 15 | 
                        +					const readline = require("readline");
                       | 
                    |
| 16 | 
                        + const reader = readline.createInterface  | 
                    |
| 17 | 
                        + (  | 
                    |
| 18 | 
                        +						{
                       | 
                    |
| 19 | 
                        + "input": process.stdin,  | 
                    |
| 20 | 
                        + "output": process.stdout,  | 
                    |
| 21 | 
                        + "terminal": false  | 
                    |
| 22 | 
                        + }  | 
                    |
| 23 | 
                        + );  | 
                    |
| 24 | 
                        + let lines : Array<string> = [];  | 
                    |
| 25 | 
                        +					reader.on("line", (line) => lines.push(line));
                       | 
                    |
| 26 | 
                        +					reader.on("close", () => resolve(lines.join("\n")));
                       | 
                    |
| 27 | 
                        + }  | 
                    |
| 28 | 
                        + )  | 
                    |
| 29 | 
                        + );  | 
                    |
| 30 | 
                        + }  | 
                    |
| 31 | 
                        +  | 
                    |
| 32 | 
                        +}  | 
                    |
| 33 | 
                        +  | 
                    
| ... | ... | 
                      @@ -0,0 +1,24 @@  | 
                  
| 1 | 
                        +namespace helpers  | 
                    |
| 2 | 
                        +{
                       | 
                    |
| 3 | 
                        +  | 
                    |
| 4 | 
                        + /**  | 
                    |
| 5 | 
                        + */  | 
                    |
| 6 | 
                        + export type repository<type_key, type_value> =  | 
                    |
| 7 | 
                        + (  | 
                    |
| 8 | 
                        + helpers.module  | 
                    |
| 9 | 
                        + &  | 
                    |
| 10 | 
                        + helpers.storage<type_key, type_value>  | 
                    |
| 11 | 
                        + );  | 
                    |
| 12 | 
                        +  | 
                    |
| 13 | 
                        +  | 
                    |
| 14 | 
                        + /**  | 
                    |
| 15 | 
                        + */  | 
                    |
| 16 | 
                        + export type repository_sqltable =  | 
                    |
| 17 | 
                        + (  | 
                    |
| 18 | 
                        + helpers.module  | 
                    |
| 19 | 
                        + &  | 
                    |
| 20 | 
                        + helpers.storage_sqltable  | 
                    |
| 21 | 
                        + );  | 
                    |
| 22 | 
                        +  | 
                    |
| 23 | 
                        +}  | 
                    |
| 24 | 
                        +  | 
                    
| ... | ... | 
                      @@ -0,0 +1,27 @@  | 
                  
| 1 | 
                        +namespace helpers  | 
                    |
| 2 | 
                        +{
                       | 
                    |
| 3 | 
                        +  | 
                    |
| 4 | 
                        + /**  | 
                    |
| 5 | 
                        + */  | 
                    |
| 6 | 
                        + export type storage<type_key, type_value> =  | 
                    |
| 7 | 
                        +	{
                       | 
                    |
| 8 | 
                        + create : (value : type_value)=>Promise<type_key>;  | 
                    |
| 9 | 
                        + update : (key : type_key, value : type_value)=>Promise<void>;  | 
                    |
| 10 | 
                        + delete : (key : type_key)=>Promise<void>;  | 
                    |
| 11 | 
                        + read : (key : type_key)=>Promise<type_value>;  | 
                    |
| 12 | 
                        + };  | 
                    |
| 13 | 
                        +  | 
                    |
| 14 | 
                        +  | 
                    |
| 15 | 
                        + /**  | 
                    |
| 16 | 
                        + */  | 
                    |
| 17 | 
                        + export type storage_sqltable = (  | 
                    |
| 18 | 
                        + storage<int, type_row>  | 
                    |
| 19 | 
                        + &  | 
                    |
| 20 | 
                        +		{
                       | 
                    |
| 21 | 
                        + purge : (column : string, value : any)=>Promise<void>;  | 
                    |
| 22 | 
                        + take : (column : string, value : any)=>Promise<Array<type_row>>;  | 
                    |
| 23 | 
                        + }  | 
                    |
| 24 | 
                        + );  | 
                    |
| 25 | 
                        +  | 
                    |
| 26 | 
                        +}  | 
                    |
| 27 | 
                        +  | 
                    
| ... | ... | 
                      @@ -0,0 +1,24 @@  | 
                  
| 1 | 
                        +namespace helpers.string  | 
                    |
| 2 | 
                        +{
                       | 
                    |
| 3 | 
                        +  | 
                    |
| 4 | 
                        + /**  | 
                    |
| 5 | 
                        + */  | 
                    |
| 6 | 
                        + export function coin  | 
                    |
| 7 | 
                        + (  | 
                    |
| 8 | 
                        + template : string,  | 
                    |
| 9 | 
                        +		arguments_ : {[key : string] : string},
                       | 
                    |
| 10 | 
                        +		open : string = "{{",
                       | 
                    |
| 11 | 
                        + close : string = "}}"  | 
                    |
| 12 | 
                        + ) : string  | 
                    |
| 13 | 
                        +	{
                       | 
                    |
| 14 | 
                        + let result : string = template;  | 
                    |
| 15 | 
                        + for (let [key, value] of Object.entries(arguments_))  | 
                    |
| 16 | 
                        +		{
                       | 
                    |
| 17 | 
                        + const pattern : string = (open + key + close);  | 
                    |
| 18 | 
                        + result = result.replace(new RegExp(pattern, "g"), value);  | 
                    |
| 19 | 
                        + }  | 
                    |
| 20 | 
                        + return result;  | 
                    |
| 21 | 
                        + }  | 
                    |
| 22 | 
                        +  | 
                    |
| 23 | 
                        +}  | 
                    |
| 24 | 
                        +  | 
                    
| ... | ... | 
                      @@ -0,0 +1,95 @@  | 
                  
| 1 | 
                        +#!/usr/bin/env node  | 
                    |
| 2 | 
                        +  | 
                    |
| 3 | 
                        +/*  | 
                    |
| 4 | 
                        +import {repositories.language} from './repository-language';
                       | 
                    |
| 5 | 
                        +import {repositories.type} from './repository-type';
                       | 
                    |
| 6 | 
                        +import {repositories.tag} from './repository-tag';
                       | 
                    |
| 7 | 
                        +import {repositories.concept} from './repository-concept';
                       | 
                    |
| 8 | 
                        + */  | 
                    |
| 9 | 
                        +  | 
                    |
| 10 | 
                        +  | 
                    |
| 11 | 
                        +/**  | 
                    |
| 12 | 
                        + */  | 
                    |
| 13 | 
                        +async function main(args : Array<string>) : Promise<void>  | 
                    |
| 14 | 
                        +{
                       | 
                    |
| 15 | 
                        + const command : string = args.shift();  | 
                    |
| 16 | 
                        + switch (command)  | 
                    |
| 17 | 
                        +	{
                       | 
                    |
| 18 | 
                        + case "setup":  | 
                    |
| 19 | 
                        +		{
                       | 
                    |
| 20 | 
                        + await repositories.language.setup()  | 
                    |
| 21 | 
                        + await repositories.type.setup()  | 
                    |
| 22 | 
                        + await repositories.tag.setup()  | 
                    |
| 23 | 
                        + await repositories.concept.setup()  | 
                    |
| 24 | 
                        + process.exit(0);  | 
                    |
| 25 | 
                        + break;  | 
                    |
| 26 | 
                        + }  | 
                    |
| 27 | 
                        + case "feed":  | 
                    |
| 28 | 
                        +		{
                       | 
                    |
| 29 | 
                        + const content : string = await helpers.misc.stdin();  | 
                    |
| 30 | 
                        + const data : any = JSON.parse(content);  | 
                    |
| 31 | 
                        + const concept_thing : any = data;  | 
                    |
| 32 | 
                        + const concept_id : int = await services.concept.suck(concept_thing);  | 
                    |
| 33 | 
                        + console.info(concept_id);  | 
                    |
| 34 | 
                        + process.exit(0);  | 
                    |
| 35 | 
                        + break;  | 
                    |
| 36 | 
                        + }  | 
                    |
| 37 | 
                        + case "translate":  | 
                    |
| 38 | 
                        +		{
                       | 
                    |
| 39 | 
                        + const language_from : string = args.shift();  | 
                    |
| 40 | 
                        + const language_to : string = args.shift();  | 
                    |
| 41 | 
                        + const part : string = args.shift();  | 
                    |
| 42 | 
                        + const result = await services.concept.get_translations  | 
                    |
| 43 | 
                        + (  | 
                    |
| 44 | 
                        + language_from,  | 
                    |
| 45 | 
                        + language_to,  | 
                    |
| 46 | 
                        + part  | 
                    |
| 47 | 
                        + );  | 
                    |
| 48 | 
                        + result.forEach  | 
                    |
| 49 | 
                        + (  | 
                    |
| 50 | 
                        + (entry) =>  | 
                    |
| 51 | 
                        +				{
                       | 
                    |
| 52 | 
                        + console.info  | 
                    |
| 53 | 
                        + (  | 
                    |
| 54 | 
                        + helpers.string.coin  | 
                    |
| 55 | 
                        + (  | 
                    |
| 56 | 
                        +							"[{{language_from}}] {{value_from}} ~ [{{language_to}}] {{value_to}}",
                       | 
                    |
| 57 | 
                        +							{
                       | 
                    |
| 58 | 
                        + "language_from": language_from,  | 
                    |
| 59 | 
                        + "value_from": entry["value_from"],  | 
                    |
| 60 | 
                        + "language_to": language_to,  | 
                    |
| 61 | 
                        + "value_to": entry["value_to"],  | 
                    |
| 62 | 
                        + }  | 
                    |
| 63 | 
                        + )  | 
                    |
| 64 | 
                        + );  | 
                    |
| 65 | 
                        + }  | 
                    |
| 66 | 
                        + );  | 
                    |
| 67 | 
                        + process.exit(0);  | 
                    |
| 68 | 
                        + break;  | 
                    |
| 69 | 
                        + }  | 
                    |
| 70 | 
                        + case "export":  | 
                    |
| 71 | 
                        +		{
                       | 
                    |
| 72 | 
                        + const result : Array<any> = await services.concept.export_();  | 
                    |
| 73 | 
                        + console.info(JSON.stringify(result, undefined, "\t"));  | 
                    |
| 74 | 
                        + process.exit(0);  | 
                    |
| 75 | 
                        + break;  | 
                    |
| 76 | 
                        + }  | 
                    |
| 77 | 
                        + case "show":  | 
                    |
| 78 | 
                        +		{
                       | 
                    |
| 79 | 
                        + const concept_id = parseInt(args.shift());  | 
                    |
| 80 | 
                        + const concept_entity : entities.concept = await services.concept.get(concept_id);  | 
                    |
| 81 | 
                        + console.info(JSON.stringify(concept_entity, undefined, "\t"));  | 
                    |
| 82 | 
                        + break;  | 
                    |
| 83 | 
                        + }  | 
                    |
| 84 | 
                        + default:  | 
                    |
| 85 | 
                        +		{
                       | 
                    |
| 86 | 
                        +			console.error("unhandled command: " + command);
                       | 
                    |
| 87 | 
                        + process.exit(1);  | 
                    |
| 88 | 
                        + break;  | 
                    |
| 89 | 
                        + }  | 
                    |
| 90 | 
                        + }  | 
                    |
| 91 | 
                        +}  | 
                    |
| 92 | 
                        +  | 
                    |
| 93 | 
                        +  | 
                    |
| 94 | 
                        +main(process.argv.slice(2));  | 
                    |
| 95 | 
                        +  | 
                    
| ... | ... | 
                      @@ -0,0 +1,78 @@  | 
                  
| 1 | 
                        +namespace repositories  | 
                    |
| 2 | 
                        +{
                       | 
                    |
| 3 | 
                        +  | 
                    |
| 4 | 
                        + export var concept_core : helpers.repository_sqltable =  | 
                    |
| 5 | 
                        +	{
                       | 
                    |
| 6 | 
                        + "setup": function ()  | 
                    |
| 7 | 
                        +		{
                       | 
                    |
| 8 | 
                        +			return helpers.database.query_do_named("concept.setup-core");
                       | 
                    |
| 9 | 
                        + },  | 
                    |
| 10 | 
                        + "teardown": function ()  | 
                    |
| 11 | 
                        +		{
                       | 
                    |
| 12 | 
                        +			throw (new Error("not implemented"));
                       | 
                    |
| 13 | 
                        + },  | 
                    |
| 14 | 
                        + "create": function (row)  | 
                    |
| 15 | 
                        +		{
                       | 
                    |
| 16 | 
                        + return helpers.database.query_put_free  | 
                    |
| 17 | 
                        + (  | 
                    |
| 18 | 
                        + "INSERT INTO concepts(type_id, description) VALUES (:type_id, :description);",  | 
                    |
| 19 | 
                        +				{
                       | 
                    |
| 20 | 
                        + "type_id": row["type_id"],  | 
                    |
| 21 | 
                        + "description": row["description"],  | 
                    |
| 22 | 
                        + }  | 
                    |
| 23 | 
                        + );  | 
                    |
| 24 | 
                        + },  | 
                    |
| 25 | 
                        + "update": function (concept_id, row)  | 
                    |
| 26 | 
                        +		{
                       | 
                    |
| 27 | 
                        + return helpers.database.query_do_free  | 
                    |
| 28 | 
                        + (  | 
                    |
| 29 | 
                        + "UPDATE concepts SET type_id = :type_id, description = :description WHERE (id = :id)",  | 
                    |
| 30 | 
                        +				{
                       | 
                    |
| 31 | 
                        + "id": concept_id,  | 
                    |
| 32 | 
                        + "type_id": row["type_id"],  | 
                    |
| 33 | 
                        + "description": row["description"],  | 
                    |
| 34 | 
                        + }  | 
                    |
| 35 | 
                        + );  | 
                    |
| 36 | 
                        + },  | 
                    |
| 37 | 
                        + "delete": function (concept_id)  | 
                    |
| 38 | 
                        +		{
                       | 
                    |
| 39 | 
                        + return helpers.database.query_do_free  | 
                    |
| 40 | 
                        + (  | 
                    |
| 41 | 
                        + "DELETE FROM concepts WHERE (id = :id)",  | 
                    |
| 42 | 
                        +				{
                       | 
                    |
| 43 | 
                        + "id": concept_id,  | 
                    |
| 44 | 
                        + }  | 
                    |
| 45 | 
                        + );  | 
                    |
| 46 | 
                        + },  | 
                    |
| 47 | 
                        + "read": function (concept_id)  | 
                    |
| 48 | 
                        +		{
                       | 
                    |
| 49 | 
                        + return (  | 
                    |
| 50 | 
                        + helpers.database.query_get_free  | 
                    |
| 51 | 
                        + (  | 
                    |
| 52 | 
                        + "SELECT type_id,description FROM concepts WHERE (id = :id)",  | 
                    |
| 53 | 
                        +					{
                       | 
                    |
| 54 | 
                        + "id": concept_id,  | 
                    |
| 55 | 
                        + }  | 
                    |
| 56 | 
                        + )  | 
                    |
| 57 | 
                        + .then  | 
                    |
| 58 | 
                        + (  | 
                    |
| 59 | 
                        + (rows) => (  | 
                    |
| 60 | 
                        + (rows.length === 1)  | 
                    |
| 61 | 
                        + ? Promise.resolve<type_row>(rows[0])  | 
                    |
| 62 | 
                        +						: Promise.reject<type_row>(new Error("not found"))
                       | 
                    |
| 63 | 
                        + )  | 
                    |
| 64 | 
                        + )  | 
                    |
| 65 | 
                        + );  | 
                    |
| 66 | 
                        + },  | 
                    |
| 67 | 
                        + "purge": async function (column, value)  | 
                    |
| 68 | 
                        +		{
                       | 
                    |
| 69 | 
                        +			throw (new Error("not implemented"));
                       | 
                    |
| 70 | 
                        + },  | 
                    |
| 71 | 
                        + "take": async function (column, value)  | 
                    |
| 72 | 
                        +		{
                       | 
                    |
| 73 | 
                        +			throw (new Error("not implemented"));
                       | 
                    |
| 74 | 
                        + },  | 
                    |
| 75 | 
                        + };  | 
                    |
| 76 | 
                        +  | 
                    |
| 77 | 
                        +}  | 
                    |
| 78 | 
                        +  | 
                    
| ... | ... | 
                      @@ -0,0 +1,92 @@  | 
                  
| 1 | 
                        +namespace repositories  | 
                    |
| 2 | 
                        +{
                       | 
                    |
| 3 | 
                        +  | 
                    |
| 4 | 
                        + /**  | 
                    |
| 5 | 
                        + */  | 
                    |
| 6 | 
                        + export var concept_tags : helpers.repository_sqltable =  | 
                    |
| 7 | 
                        +	{
                       | 
                    |
| 8 | 
                        + "setup": function ()  | 
                    |
| 9 | 
                        +		{
                       | 
                    |
| 10 | 
                        +			return helpers.database.query_do_named("concept.setup-tags");
                       | 
                    |
| 11 | 
                        + },  | 
                    |
| 12 | 
                        + "teardown": function ()  | 
                    |
| 13 | 
                        +		{
                       | 
                    |
| 14 | 
                        +			throw (new Error("not implemented"));
                       | 
                    |
| 15 | 
                        + },  | 
                    |
| 16 | 
                        + "create": function (row)  | 
                    |
| 17 | 
                        +		{
                       | 
                    |
| 18 | 
                        + return helpers.database.query_put_free  | 
                    |
| 19 | 
                        + (  | 
                    |
| 20 | 
                        + "INSERT INTO concept_tags(concept_id, tag_id) VALUES (:concept_id, :tag_id);",  | 
                    |
| 21 | 
                        +				{
                       | 
                    |
| 22 | 
                        + "concept_id": row["concept_id"],  | 
                    |
| 23 | 
                        + "tag_id": row["tag_id"],  | 
                    |
| 24 | 
                        + }  | 
                    |
| 25 | 
                        + );  | 
                    |
| 26 | 
                        + },  | 
                    |
| 27 | 
                        + "update": function (concept_tag_id, row)  | 
                    |
| 28 | 
                        +		{
                       | 
                    |
| 29 | 
                        + return helpers.database.query_do_free  | 
                    |
| 30 | 
                        + (  | 
                    |
| 31 | 
                        + "UPDATE concept_tags SET concept_id = :concept_id, tag_id = :tag_id WHERE (id = :id)",  | 
                    |
| 32 | 
                        +				{
                       | 
                    |
| 33 | 
                        + "id": concept_tag_id,  | 
                    |
| 34 | 
                        + "concept_id": row["concept_id"],  | 
                    |
| 35 | 
                        + "tag_id": row["tag_id"],  | 
                    |
| 36 | 
                        + }  | 
                    |
| 37 | 
                        + );  | 
                    |
| 38 | 
                        + },  | 
                    |
| 39 | 
                        + "delete": function (concept_tag_id)  | 
                    |
| 40 | 
                        +		{
                       | 
                    |
| 41 | 
                        + return helpers.database.query_do_free  | 
                    |
| 42 | 
                        + (  | 
                    |
| 43 | 
                        + "DELETE FROM concept_tags WHERE (id = :id)",  | 
                    |
| 44 | 
                        +				{
                       | 
                    |
| 45 | 
                        + "id": concept_tag_id,  | 
                    |
| 46 | 
                        + }  | 
                    |
| 47 | 
                        + );  | 
                    |
| 48 | 
                        + },  | 
                    |
| 49 | 
                        + "read": async function (concept_tag_id)  | 
                    |
| 50 | 
                        +		{
                       | 
                    |
| 51 | 
                        + return (  | 
                    |
| 52 | 
                        + helpers.database.query_get_free  | 
                    |
| 53 | 
                        + (  | 
                    |
| 54 | 
                        + "SELECT concept_id,tag_id FROM concept_tags WHERE (id = :id)",  | 
                    |
| 55 | 
                        +					{
                       | 
                    |
| 56 | 
                        + "id": concept_tag_id,  | 
                    |
| 57 | 
                        + }  | 
                    |
| 58 | 
                        + )  | 
                    |
| 59 | 
                        + .then  | 
                    |
| 60 | 
                        + (  | 
                    |
| 61 | 
                        + (rows) => (  | 
                    |
| 62 | 
                        + (rows.length === 1)  | 
                    |
| 63 | 
                        + ? Promise.resolve<type_row>(rows[0])  | 
                    |
| 64 | 
                        +						: Promise.reject<type_row>(new Error("not found"))
                       | 
                    |
| 65 | 
                        + )  | 
                    |
| 66 | 
                        + )  | 
                    |
| 67 | 
                        + );  | 
                    |
| 68 | 
                        + },  | 
                    |
| 69 | 
                        + "purge": async function (column, value)  | 
                    |
| 70 | 
                        +		{
                       | 
                    |
| 71 | 
                        + return helpers.database.query_do_free  | 
                    |
| 72 | 
                        + (  | 
                    |
| 73 | 
                        +				"DELETE FROM concept_tags WHERE (" + column + " = :value)",
                       | 
                    |
| 74 | 
                        +				{
                       | 
                    |
| 75 | 
                        + "value": value,  | 
                    |
| 76 | 
                        + }  | 
                    |
| 77 | 
                        + );  | 
                    |
| 78 | 
                        + },  | 
                    |
| 79 | 
                        + "take": async function (column, value)  | 
                    |
| 80 | 
                        +		{
                       | 
                    |
| 81 | 
                        + return await helpers.database.query_get_free  | 
                    |
| 82 | 
                        + (  | 
                    |
| 83 | 
                        +				"SELECT concept_id,tag_id FROM concept_tags WHERE (" + column + " = :value)",
                       | 
                    |
| 84 | 
                        +				{
                       | 
                    |
| 85 | 
                        + "value": value,  | 
                    |
| 86 | 
                        + }  | 
                    |
| 87 | 
                        + );  | 
                    |
| 88 | 
                        + },  | 
                    |
| 89 | 
                        + };  | 
                    |
| 90 | 
                        +  | 
                    |
| 91 | 
                        +}  | 
                    |
| 92 | 
                        +  | 
                    
| ... | ... | 
                      @@ -0,0 +1,94 @@  | 
                  
| 1 | 
                        +namespace repositories  | 
                    |
| 2 | 
                        +{
                       | 
                    |
| 3 | 
                        +  | 
                    |
| 4 | 
                        + /**  | 
                    |
| 5 | 
                        + */  | 
                    |
| 6 | 
                        + export var concept_translations : helpers.repository_sqltable =  | 
                    |
| 7 | 
                        +	{
                       | 
                    |
| 8 | 
                        + "setup": function ()  | 
                    |
| 9 | 
                        +		{
                       | 
                    |
| 10 | 
                        +			return helpers.database.query_do_named("concept.setup-translations");
                       | 
                    |
| 11 | 
                        + },  | 
                    |
| 12 | 
                        + "teardown": function ()  | 
                    |
| 13 | 
                        +		{
                       | 
                    |
| 14 | 
                        +			throw (new Error("not implemented"));
                       | 
                    |
| 15 | 
                        + },  | 
                    |
| 16 | 
                        + "create": function (row)  | 
                    |
| 17 | 
                        +		{
                       | 
                    |
| 18 | 
                        + return helpers.database.query_put_free  | 
                    |
| 19 | 
                        + (  | 
                    |
| 20 | 
                        + "INSERT INTO concept_translations(concept_id, language_id, value) VALUES (:concept_id, :language_id, :value);",  | 
                    |
| 21 | 
                        +				{
                       | 
                    |
| 22 | 
                        + "concept_id": row["concept_id"],  | 
                    |
| 23 | 
                        + "language_id": row["language_id"],  | 
                    |
| 24 | 
                        + "value": row["value"],  | 
                    |
| 25 | 
                        + }  | 
                    |
| 26 | 
                        + );  | 
                    |
| 27 | 
                        + },  | 
                    |
| 28 | 
                        + "update": function (concept_translation_id, row)  | 
                    |
| 29 | 
                        +		{
                       | 
                    |
| 30 | 
                        + return helpers.database.query_do_free  | 
                    |
| 31 | 
                        + (  | 
                    |
| 32 | 
                        + "UPDATE concept_translations SET concept_id = :concept_id, language_id = :language_id, value = :value WHERE (id = :id)",  | 
                    |
| 33 | 
                        +				{
                       | 
                    |
| 34 | 
                        + "id": concept_translation_id,  | 
                    |
| 35 | 
                        + "concept_id": row["concept_id"],  | 
                    |
| 36 | 
                        + "language_id": row["language_id"],  | 
                    |
| 37 | 
                        + "value": row["value"],  | 
                    |
| 38 | 
                        + }  | 
                    |
| 39 | 
                        + );  | 
                    |
| 40 | 
                        + },  | 
                    |
| 41 | 
                        + "delete": function (concept_translation_id)  | 
                    |
| 42 | 
                        +		{
                       | 
                    |
| 43 | 
                        + return helpers.database.query_do_free  | 
                    |
| 44 | 
                        + (  | 
                    |
| 45 | 
                        + "DELETE FROM concept_translations WHERE (id = :id)",  | 
                    |
| 46 | 
                        +				{
                       | 
                    |
| 47 | 
                        + "id": concept_translation_id,  | 
                    |
| 48 | 
                        + }  | 
                    |
| 49 | 
                        + );  | 
                    |
| 50 | 
                        + },  | 
                    |
| 51 | 
                        + "read": async function (concept_translation_id)  | 
                    |
| 52 | 
                        +		{
                       | 
                    |
| 53 | 
                        + return (  | 
                    |
| 54 | 
                        + helpers.database.query_get_free  | 
                    |
| 55 | 
                        + (  | 
                    |
| 56 | 
                        + "SELECT concept_id,language_id,value FROM concept_translations WHERE (id = :id)",  | 
                    |
| 57 | 
                        +					{
                       | 
                    |
| 58 | 
                        + "id": concept_translation_id,  | 
                    |
| 59 | 
                        + }  | 
                    |
| 60 | 
                        + )  | 
                    |
| 61 | 
                        + .then  | 
                    |
| 62 | 
                        + (  | 
                    |
| 63 | 
                        + (rows) => (  | 
                    |
| 64 | 
                        + (rows.length === 1)  | 
                    |
| 65 | 
                        + ? Promise.resolve<type_row>(rows[0])  | 
                    |
| 66 | 
                        +						: Promise.reject<type_row>(new Error("not found"))
                       | 
                    |
| 67 | 
                        + )  | 
                    |
| 68 | 
                        + )  | 
                    |
| 69 | 
                        + );  | 
                    |
| 70 | 
                        + },  | 
                    |
| 71 | 
                        + "purge": async function (column, value)  | 
                    |
| 72 | 
                        +		{
                       | 
                    |
| 73 | 
                        + return helpers.database.query_do_free  | 
                    |
| 74 | 
                        + (  | 
                    |
| 75 | 
                        +				"DELETE FROM concept_translations WHERE (" + column + " = :value)",
                       | 
                    |
| 76 | 
                        +				{
                       | 
                    |
| 77 | 
                        + "value": value,  | 
                    |
| 78 | 
                        + }  | 
                    |
| 79 | 
                        + );  | 
                    |
| 80 | 
                        + },  | 
                    |
| 81 | 
                        + "take": async function (column, value)  | 
                    |
| 82 | 
                        +		{
                       | 
                    |
| 83 | 
                        + return await helpers.database.query_get_free  | 
                    |
| 84 | 
                        + (  | 
                    |
| 85 | 
                        +				"SELECT concept_id,language_id,value FROM concept_translations WHERE (" + column + " = :value)",
                       | 
                    |
| 86 | 
                        +				{
                       | 
                    |
| 87 | 
                        + "value": value,  | 
                    |
| 88 | 
                        + }  | 
                    |
| 89 | 
                        + );  | 
                    |
| 90 | 
                        + },  | 
                    |
| 91 | 
                        + };  | 
                    |
| 92 | 
                        +  | 
                    |
| 93 | 
                        +}  | 
                    |
| 94 | 
                        +  | 
                    
| ... | ... | 
                      @@ -0,0 +1,90 @@  | 
                  
| 1 | 
                        +namespace repositories  | 
                    |
| 2 | 
                        +{
                       | 
                    |
| 3 | 
                        +  | 
                    |
| 4 | 
                        + /**  | 
                    |
| 5 | 
                        + */  | 
                    |
| 6 | 
                        + export var concept : (  | 
                    |
| 7 | 
                        + helpers.repository<int, entities.concept>  | 
                    |
| 8 | 
                        + &  | 
                    |
| 9 | 
                        +		{
                       | 
                    |
| 10 | 
                        + get_translations : (language_from : string, language_to : string, part : string)=>Promise<Array<type_row>>;  | 
                    |
| 11 | 
                        + export : ()=>Promise<Array<type_row>>;  | 
                    |
| 12 | 
                        + }  | 
                    |
| 13 | 
                        + ) =  | 
                    |
| 14 | 
                        +	{
                       | 
                    |
| 15 | 
                        + "setup": async function ()  | 
                    |
| 16 | 
                        +		{
                       | 
                    |
| 17 | 
                        + await repositories.concept_core.setup();  | 
                    |
| 18 | 
                        + await repositories.concept_tags.setup();  | 
                    |
| 19 | 
                        + await repositories.concept_translations.setup();  | 
                    |
| 20 | 
                        + return Promise.resolve<void>(undefined);  | 
                    |
| 21 | 
                        + },  | 
                    |
| 22 | 
                        + "teardown": async function ()  | 
                    |
| 23 | 
                        +		{
                       | 
                    |
| 24 | 
                        + await repositories.concept_translations.teardown();  | 
                    |
| 25 | 
                        + await repositories.concept_tags.teardown();  | 
                    |
| 26 | 
                        + await repositories.concept_core.teardown();  | 
                    |
| 27 | 
                        + return Promise.resolve<void>(undefined);  | 
                    |
| 28 | 
                        + },  | 
                    |
| 29 | 
                        + "create": async function (concept_entity)  | 
                    |
| 30 | 
                        +		{
                       | 
                    |
| 31 | 
                        +			const row_core : type_row = {"type_id": concept_entity.type_id, "description": concept_entity.description};
                       | 
                    |
| 32 | 
                        + const concept_id : int = await repositories.concept_core.create(row_core);  | 
                    |
| 33 | 
                        + for await (let tag_id of concept_entity.tags)  | 
                    |
| 34 | 
                        +			{
                       | 
                    |
| 35 | 
                        +				const row_tag : type_row = {"concept_id": concept_id, "tag_id": tag_id};
                       | 
                    |
| 36 | 
                        + const concept_tag_id : int = await repositories.concept_tags.create(row_tag);  | 
                    |
| 37 | 
                        + }  | 
                    |
| 38 | 
                        +			for await (let {"language_id": language_id, "value": value} of concept_entity.translations)
                       | 
                    |
| 39 | 
                        +			{
                       | 
                    |
| 40 | 
                        +				const row_translations : type_row = {"concept_id": concept_id, "language_id": language_id, "value": value};
                       | 
                    |
| 41 | 
                        + const concept_translations_id : int = await repositories.concept_translations.create(row_translations);  | 
                    |
| 42 | 
                        + }  | 
                    |
| 43 | 
                        + return Promise.resolve<int>(concept_id);  | 
                    |
| 44 | 
                        + },  | 
                    |
| 45 | 
                        + "update": function (concept_id, concept_entity)  | 
                    |
| 46 | 
                        +		{
                       | 
                    |
| 47 | 
                        +			throw (new Error("not implemented"));
                       | 
                    |
| 48 | 
                        + },  | 
                    |
| 49 | 
                        + "delete": async function (concept_id)  | 
                    |
| 50 | 
                        +		{
                       | 
                    |
| 51 | 
                        +			await repositories.concept_translations.purge("concept_id", concept_id);
                       | 
                    |
| 52 | 
                        +			await repositories.concept_tags.purge("concept_id", concept_id);
                       | 
                    |
| 53 | 
                        + await repositories.concept_core.delete(concept_id);  | 
                    |
| 54 | 
                        + return Promise.resolve<void>(undefined);  | 
                    |
| 55 | 
                        + },  | 
                    |
| 56 | 
                        + "read": async function (concept_id)  | 
                    |
| 57 | 
                        +		{
                       | 
                    |
| 58 | 
                        + const row_core : type_row = await repositories.concept_core.read(concept_id);;  | 
                    |
| 59 | 
                        +			const rows_tags : Array<type_row> = await repositories.concept_tags.take("concept_id", concept_id);
                       | 
                    |
| 60 | 
                        +			const rows_translations : Array<type_row> = await repositories.concept_translations.take("concept_id", concept_id);
                       | 
                    |
| 61 | 
                        + const concept_entity : entities.concept =  | 
                    |
| 62 | 
                        +			{
                       | 
                    |
| 63 | 
                        + "type_id": row_core["type_id"],  | 
                    |
| 64 | 
                        + "description": row_core["description"],  | 
                    |
| 65 | 
                        + "tags": rows_tags.map(row_tag => row_tag["tag_id"]),  | 
                    |
| 66 | 
                        +				"translations": rows_translations.map(row_translation => ({"language_id": row_translation["language_id"], "value": row_translation["value"]})),
                       | 
                    |
| 67 | 
                        + };  | 
                    |
| 68 | 
                        + return Promise.resolve<entities.concept>(concept_entity);  | 
                    |
| 69 | 
                        + },  | 
                    |
| 70 | 
                        + "get_translations": function (language_from : string, language_to : string, part : string) : Promise<Array<type_row>>  | 
                    |
| 71 | 
                        +		{
                       | 
                    |
| 72 | 
                        + return helpers.database.query_get_named  | 
                    |
| 73 | 
                        + (  | 
                    |
| 74 | 
                        + "concept.get_translations",  | 
                    |
| 75 | 
                        +				{
                       | 
                    |
| 76 | 
                        + "language_value_from": language_from,  | 
                    |
| 77 | 
                        + "language_value_to": language_to,  | 
                    |
| 78 | 
                        +					"part": part.replace(new RegExp("-", "g"), "%"),
                       | 
                    |
| 79 | 
                        + }  | 
                    |
| 80 | 
                        + );  | 
                    |
| 81 | 
                        + },  | 
                    |
| 82 | 
                        + "export": function () : Promise<Array<type_row>>  | 
                    |
| 83 | 
                        +		{
                       | 
                    |
| 84 | 
                        +			return helpers.database.query_get_named("concept.export");
                       | 
                    |
| 85 | 
                        + },  | 
                    |
| 86 | 
                        + };  | 
                    |
| 87 | 
                        +  | 
                    |
| 88 | 
                        +}  | 
                    |
| 89 | 
                        +  | 
                    |
| 90 | 
                        +  | 
                    
| ... | ... | 
                      @@ -0,0 +1,97 @@  | 
                  
| 1 | 
                        +namespace repositories  | 
                    |
| 2 | 
                        +{
                       | 
                    |
| 3 | 
                        +  | 
                    |
| 4 | 
                        +	export var language : helpers.repository_sqltable & {identify : (value : string)=>Promise<int>;} =
                       | 
                    |
| 5 | 
                        +	{
                       | 
                    |
| 6 | 
                        + "setup": async function ()  | 
                    |
| 7 | 
                        +		{
                       | 
                    |
| 8 | 
                        +			await helpers.database.query_put_named("language.setup");
                       | 
                    |
| 9 | 
                        + return Promise.resolve<void>(undefined);  | 
                    |
| 10 | 
                        + },  | 
                    |
| 11 | 
                        + "teardown": function ()  | 
                    |
| 12 | 
                        +		{
                       | 
                    |
| 13 | 
                        +			return Promise.reject(new Error("not implemented"));
                       | 
                    |
| 14 | 
                        + },  | 
                    |
| 15 | 
                        + "create": function (row)  | 
                    |
| 16 | 
                        +		{
                       | 
                    |
| 17 | 
                        + return helpers.database.query_put_free  | 
                    |
| 18 | 
                        + (  | 
                    |
| 19 | 
                        + "INSERT INTO languages(value) VALUES (:value);",  | 
                    |
| 20 | 
                        +				{
                       | 
                    |
| 21 | 
                        + "value": row["value"],  | 
                    |
| 22 | 
                        + }  | 
                    |
| 23 | 
                        + );  | 
                    |
| 24 | 
                        + },  | 
                    |
| 25 | 
                        + "update": function (language_id, row)  | 
                    |
| 26 | 
                        +		{
                       | 
                    |
| 27 | 
                        + return helpers.database.query_do_free  | 
                    |
| 28 | 
                        + (  | 
                    |
| 29 | 
                        + "UPDATE languages SET value = :vaule WHERE (id = :id);",  | 
                    |
| 30 | 
                        +				{
                       | 
                    |
| 31 | 
                        + "id": language_id,  | 
                    |
| 32 | 
                        + "value": row["value"],  | 
                    |
| 33 | 
                        + }  | 
                    |
| 34 | 
                        + );  | 
                    |
| 35 | 
                        + },  | 
                    |
| 36 | 
                        + "delete": function (language_id)  | 
                    |
| 37 | 
                        +		{
                       | 
                    |
| 38 | 
                        + return helpers.database.query_do_free  | 
                    |
| 39 | 
                        + (  | 
                    |
| 40 | 
                        + "DELETE FROM languages WHERE (id = :id);",  | 
                    |
| 41 | 
                        +				{
                       | 
                    |
| 42 | 
                        + "id": language_id,  | 
                    |
| 43 | 
                        + }  | 
                    |
| 44 | 
                        + );  | 
                    |
| 45 | 
                        + },  | 
                    |
| 46 | 
                        + "read": function (language_id)  | 
                    |
| 47 | 
                        +		{
                       | 
                    |
| 48 | 
                        + return (  | 
                    |
| 49 | 
                        + helpers.database.query_get_free  | 
                    |
| 50 | 
                        + (  | 
                    |
| 51 | 
                        + "SELECT value FROM languages WHERE (id = :id);",  | 
                    |
| 52 | 
                        +					{
                       | 
                    |
| 53 | 
                        + "id": language_id,  | 
                    |
| 54 | 
                        + }  | 
                    |
| 55 | 
                        + )  | 
                    |
| 56 | 
                        + .then  | 
                    |
| 57 | 
                        + (  | 
                    |
| 58 | 
                        + (rows) => (  | 
                    |
| 59 | 
                        + (rows.length === 1)  | 
                    |
| 60 | 
                        + ? Promise.resolve<type_row>(rows[0])  | 
                    |
| 61 | 
                        +						: Promise.reject<type_row>(new Error("not found"))
                       | 
                    |
| 62 | 
                        + )  | 
                    |
| 63 | 
                        + )  | 
                    |
| 64 | 
                        + );  | 
                    |
| 65 | 
                        + },  | 
                    |
| 66 | 
                        + "purge": function (column, value)  | 
                    |
| 67 | 
                        +		{
                       | 
                    |
| 68 | 
                        +			return Promise.reject(new Error("not implemented"));
                       | 
                    |
| 69 | 
                        + },  | 
                    |
| 70 | 
                        + "take": function (column, value)  | 
                    |
| 71 | 
                        +		{
                       | 
                    |
| 72 | 
                        +			return Promise.reject(new Error("not implemented"));
                       | 
                    |
| 73 | 
                        + },  | 
                    |
| 74 | 
                        + "identify": function (value : string) : Promise<int>  | 
                    |
| 75 | 
                        +		{
                       | 
                    |
| 76 | 
                        + return (  | 
                    |
| 77 | 
                        + helpers.database.query_get_free  | 
                    |
| 78 | 
                        + (  | 
                    |
| 79 | 
                        + "SELECT id FROM languages WHERE (value = :value);",  | 
                    |
| 80 | 
                        +					{
                       | 
                    |
| 81 | 
                        + "value": value,  | 
                    |
| 82 | 
                        + }  | 
                    |
| 83 | 
                        + )  | 
                    |
| 84 | 
                        + .then  | 
                    |
| 85 | 
                        + (  | 
                    |
| 86 | 
                        + (rows) => (  | 
                    |
| 87 | 
                        + (rows.length === 1)  | 
                    |
| 88 | 
                        + ? Promise.resolve<int>(rows[0]["id"])  | 
                    |
| 89 | 
                        + : Promise.reject<int>()  | 
                    |
| 90 | 
                        + )  | 
                    |
| 91 | 
                        + )  | 
                    |
| 92 | 
                        + );  | 
                    |
| 93 | 
                        + },  | 
                    |
| 94 | 
                        + };  | 
                    |
| 95 | 
                        +  | 
                    |
| 96 | 
                        +}  | 
                    |
| 97 | 
                        +  | 
                    
| ... | ... | 
                      @@ -0,0 +1,97 @@  | 
                  
| 1 | 
                        +namespace repositories  | 
                    |
| 2 | 
                        +{
                       | 
                    |
| 3 | 
                        +  | 
                    |
| 4 | 
                        +	export var tag : helpers.repository_sqltable & {identify : (value : string)=>Promise<int>;} =
                       | 
                    |
| 5 | 
                        +	{
                       | 
                    |
| 6 | 
                        + "setup": async function ()  | 
                    |
| 7 | 
                        +		{
                       | 
                    |
| 8 | 
                        +			await helpers.database.query_put_named("tag.setup");
                       | 
                    |
| 9 | 
                        + return Promise.resolve<void>(undefined);  | 
                    |
| 10 | 
                        + },  | 
                    |
| 11 | 
                        + "teardown": function ()  | 
                    |
| 12 | 
                        +		{
                       | 
                    |
| 13 | 
                        +			return Promise.reject(new Error("not implemented"));
                       | 
                    |
| 14 | 
                        + },  | 
                    |
| 15 | 
                        + "create": function (row)  | 
                    |
| 16 | 
                        +		{
                       | 
                    |
| 17 | 
                        + return helpers.database.query_put_free  | 
                    |
| 18 | 
                        + (  | 
                    |
| 19 | 
                        + "INSERT INTO tags(value) VALUES (:value);",  | 
                    |
| 20 | 
                        +				{
                       | 
                    |
| 21 | 
                        + "value": row["value"],  | 
                    |
| 22 | 
                        + }  | 
                    |
| 23 | 
                        + );  | 
                    |
| 24 | 
                        + },  | 
                    |
| 25 | 
                        + "update": function (tag_id, row)  | 
                    |
| 26 | 
                        +		{
                       | 
                    |
| 27 | 
                        + return helpers.database.query_do_free  | 
                    |
| 28 | 
                        + (  | 
                    |
| 29 | 
                        + "UPDATE tags SET value = :vaule WHERE (id = :id);",  | 
                    |
| 30 | 
                        +				{
                       | 
                    |
| 31 | 
                        + "id": tag_id,  | 
                    |
| 32 | 
                        + "value": row["value"],  | 
                    |
| 33 | 
                        + }  | 
                    |
| 34 | 
                        + );  | 
                    |
| 35 | 
                        + },  | 
                    |
| 36 | 
                        + "delete": function (tag_id)  | 
                    |
| 37 | 
                        +		{
                       | 
                    |
| 38 | 
                        + return helpers.database.query_do_free  | 
                    |
| 39 | 
                        + (  | 
                    |
| 40 | 
                        + "DELETE FROM tags WHERE (id = :id);",  | 
                    |
| 41 | 
                        +				{
                       | 
                    |
| 42 | 
                        + "id": tag_id,  | 
                    |
| 43 | 
                        + }  | 
                    |
| 44 | 
                        + );  | 
                    |
| 45 | 
                        + },  | 
                    |
| 46 | 
                        + "read": function (tag_id)  | 
                    |
| 47 | 
                        +		{
                       | 
                    |
| 48 | 
                        + return (  | 
                    |
| 49 | 
                        + helpers.database.query_get_free  | 
                    |
| 50 | 
                        + (  | 
                    |
| 51 | 
                        + "SELECT value FROM tags WHERE (id = :id);",  | 
                    |
| 52 | 
                        +					{
                       | 
                    |
| 53 | 
                        + "id": tag_id,  | 
                    |
| 54 | 
                        + }  | 
                    |
| 55 | 
                        + )  | 
                    |
| 56 | 
                        + .then  | 
                    |
| 57 | 
                        + (  | 
                    |
| 58 | 
                        + (rows) => (  | 
                    |
| 59 | 
                        + (rows.length === 1)  | 
                    |
| 60 | 
                        + ? Promise.resolve<type_row>(rows[0])  | 
                    |
| 61 | 
                        +						: Promise.reject<type_row>(new Error("not found"))
                       | 
                    |
| 62 | 
                        + )  | 
                    |
| 63 | 
                        + )  | 
                    |
| 64 | 
                        + );  | 
                    |
| 65 | 
                        + },  | 
                    |
| 66 | 
                        + "purge": function (column, value)  | 
                    |
| 67 | 
                        +		{
                       | 
                    |
| 68 | 
                        +			return Promise.reject(new Error("not implemented"));
                       | 
                    |
| 69 | 
                        + },  | 
                    |
| 70 | 
                        + "take": function (column, value)  | 
                    |
| 71 | 
                        +		{
                       | 
                    |
| 72 | 
                        +			return Promise.reject(new Error("not implemented"));
                       | 
                    |
| 73 | 
                        + },  | 
                    |
| 74 | 
                        + "identify": function (value : string) : Promise<int>  | 
                    |
| 75 | 
                        +		{
                       | 
                    |
| 76 | 
                        + return (  | 
                    |
| 77 | 
                        + helpers.database.query_get_free  | 
                    |
| 78 | 
                        + (  | 
                    |
| 79 | 
                        + "SELECT id FROM tags WHERE (value = :value);",  | 
                    |
| 80 | 
                        +					{
                       | 
                    |
| 81 | 
                        + "value": value,  | 
                    |
| 82 | 
                        + }  | 
                    |
| 83 | 
                        + )  | 
                    |
| 84 | 
                        + .then  | 
                    |
| 85 | 
                        + (  | 
                    |
| 86 | 
                        + (rows) => (  | 
                    |
| 87 | 
                        + (rows.length === 1)  | 
                    |
| 88 | 
                        + ? Promise.resolve<int>(rows[0]["id"])  | 
                    |
| 89 | 
                        + : Promise.reject<int>()  | 
                    |
| 90 | 
                        + )  | 
                    |
| 91 | 
                        + )  | 
                    |
| 92 | 
                        + );  | 
                    |
| 93 | 
                        + },  | 
                    |
| 94 | 
                        + };  | 
                    |
| 95 | 
                        +  | 
                    |
| 96 | 
                        +}  | 
                    |
| 97 | 
                        +  | 
                    
| ... | ... | 
                      @@ -0,0 +1,97 @@  | 
                  
| 1 | 
                        +namespace repositories  | 
                    |
| 2 | 
                        +{
                       | 
                    |
| 3 | 
                        +  | 
                    |
| 4 | 
                        +	export var type : helpers.repository_sqltable & {identify : (value : string)=>Promise<int>;} =
                       | 
                    |
| 5 | 
                        +	{
                       | 
                    |
| 6 | 
                        + "setup": async function ()  | 
                    |
| 7 | 
                        +		{
                       | 
                    |
| 8 | 
                        +			await helpers.database.query_put_named("type.setup");
                       | 
                    |
| 9 | 
                        + return Promise.resolve<void>(undefined);  | 
                    |
| 10 | 
                        + },  | 
                    |
| 11 | 
                        + "teardown": function ()  | 
                    |
| 12 | 
                        +		{
                       | 
                    |
| 13 | 
                        +			return Promise.reject(new Error("not implemented"));
                       | 
                    |
| 14 | 
                        + },  | 
                    |
| 15 | 
                        + "create": function (row)  | 
                    |
| 16 | 
                        +		{
                       | 
                    |
| 17 | 
                        + return helpers.database.query_put_free  | 
                    |
| 18 | 
                        + (  | 
                    |
| 19 | 
                        + "INSERT INTO types(value) VALUES (:value);",  | 
                    |
| 20 | 
                        +				{
                       | 
                    |
| 21 | 
                        + "value": row["value"],  | 
                    |
| 22 | 
                        + }  | 
                    |
| 23 | 
                        + );  | 
                    |
| 24 | 
                        + },  | 
                    |
| 25 | 
                        + "update": function (type_id, row)  | 
                    |
| 26 | 
                        +		{
                       | 
                    |
| 27 | 
                        + return helpers.database.query_do_free  | 
                    |
| 28 | 
                        + (  | 
                    |
| 29 | 
                        + "UPDATE types SET value = :vaule WHERE (id = :id);",  | 
                    |
| 30 | 
                        +				{
                       | 
                    |
| 31 | 
                        + "id": type_id,  | 
                    |
| 32 | 
                        + "value": row["value"],  | 
                    |
| 33 | 
                        + }  | 
                    |
| 34 | 
                        + );  | 
                    |
| 35 | 
                        + },  | 
                    |
| 36 | 
                        + "delete": function (type_id)  | 
                    |
| 37 | 
                        +		{
                       | 
                    |
| 38 | 
                        + return helpers.database.query_do_free  | 
                    |
| 39 | 
                        + (  | 
                    |
| 40 | 
                        + "DELETE FROM types WHERE (id = :id);",  | 
                    |
| 41 | 
                        +				{
                       | 
                    |
| 42 | 
                        + "id": type_id,  | 
                    |
| 43 | 
                        + }  | 
                    |
| 44 | 
                        + );  | 
                    |
| 45 | 
                        + },  | 
                    |
| 46 | 
                        + "read": function (type_id)  | 
                    |
| 47 | 
                        +		{
                       | 
                    |
| 48 | 
                        + return (  | 
                    |
| 49 | 
                        + helpers.database.query_get_free  | 
                    |
| 50 | 
                        + (  | 
                    |
| 51 | 
                        + "SELECT value FROM types WHERE (id = :id);",  | 
                    |
| 52 | 
                        +					{
                       | 
                    |
| 53 | 
                        + "id": type_id,  | 
                    |
| 54 | 
                        + }  | 
                    |
| 55 | 
                        + )  | 
                    |
| 56 | 
                        + .then  | 
                    |
| 57 | 
                        + (  | 
                    |
| 58 | 
                        + (rows) => (  | 
                    |
| 59 | 
                        + (rows.length === 1)  | 
                    |
| 60 | 
                        + ? Promise.resolve<type_row>(rows[0])  | 
                    |
| 61 | 
                        +						: Promise.reject<type_row>(new Error("not found"))
                       | 
                    |
| 62 | 
                        + )  | 
                    |
| 63 | 
                        + )  | 
                    |
| 64 | 
                        + );  | 
                    |
| 65 | 
                        + },  | 
                    |
| 66 | 
                        + "purge": function (column, value)  | 
                    |
| 67 | 
                        +		{
                       | 
                    |
| 68 | 
                        +			return Promise.reject(new Error("not implemented"));
                       | 
                    |
| 69 | 
                        + },  | 
                    |
| 70 | 
                        + "take": function (column, value)  | 
                    |
| 71 | 
                        +		{
                       | 
                    |
| 72 | 
                        +			return Promise.reject(new Error("not implemented"));
                       | 
                    |
| 73 | 
                        + },  | 
                    |
| 74 | 
                        + "identify": function (value : string) : Promise<int>  | 
                    |
| 75 | 
                        +		{
                       | 
                    |
| 76 | 
                        + return (  | 
                    |
| 77 | 
                        + helpers.database.query_get_free  | 
                    |
| 78 | 
                        + (  | 
                    |
| 79 | 
                        + "SELECT id FROM types WHERE (value = :value);",  | 
                    |
| 80 | 
                        +					{
                       | 
                    |
| 81 | 
                        + "value": value,  | 
                    |
| 82 | 
                        + }  | 
                    |
| 83 | 
                        + )  | 
                    |
| 84 | 
                        + .then  | 
                    |
| 85 | 
                        + (  | 
                    |
| 86 | 
                        + (rows) => (  | 
                    |
| 87 | 
                        + (rows.length === 1)  | 
                    |
| 88 | 
                        + ? Promise.resolve<int>(rows[0]["id"])  | 
                    |
| 89 | 
                        + : Promise.reject<int>()  | 
                    |
| 90 | 
                        + )  | 
                    |
| 91 | 
                        + )  | 
                    |
| 92 | 
                        + );  | 
                    |
| 93 | 
                        + },  | 
                    |
| 94 | 
                        + };  | 
                    |
| 95 | 
                        +  | 
                    |
| 96 | 
                        +}  | 
                    |
| 97 | 
                        +  | 
                    
| ... | ... | 
                      @@ -0,0 +1,134 @@  | 
                  
| 1 | 
                        +namespace services.concept  | 
                    |
| 2 | 
                        +{
                       | 
                    |
| 3 | 
                        +  | 
                    |
| 4 | 
                        + /**  | 
                    |
| 5 | 
                        + */  | 
                    |
| 6 | 
                        + export function get  | 
                    |
| 7 | 
                        + (  | 
                    |
| 8 | 
                        + concept_id : int  | 
                    |
| 9 | 
                        + ) : Promise<entities.concept>  | 
                    |
| 10 | 
                        +	{
                       | 
                    |
| 11 | 
                        + return repositories.concept.read(concept_id);  | 
                    |
| 12 | 
                        + }  | 
                    |
| 13 | 
                        +  | 
                    |
| 14 | 
                        +  | 
                    |
| 15 | 
                        + /**  | 
                    |
| 16 | 
                        + */  | 
                    |
| 17 | 
                        + export async function suck  | 
                    |
| 18 | 
                        + (  | 
                    |
| 19 | 
                        + concept_thing : any  | 
                    |
| 20 | 
                        + ) : Promise<int>  | 
                    |
| 21 | 
                        +	{
                       | 
                    |
| 22 | 
                        + const type_id : int = await services.type.give(concept_thing["type"]);  | 
                    |
| 23 | 
                        + const concept_id : int = await repositories.concept_core.create  | 
                    |
| 24 | 
                        + (  | 
                    |
| 25 | 
                        +			{
                       | 
                    |
| 26 | 
                        + "type_id": type_id,  | 
                    |
| 27 | 
                        + "description": concept_thing["description"],  | 
                    |
| 28 | 
                        + }  | 
                    |
| 29 | 
                        + );  | 
                    |
| 30 | 
                        + await concept_thing["tags"].map  | 
                    |
| 31 | 
                        + (  | 
                    |
| 32 | 
                        + async (tag_value) =>  | 
                    |
| 33 | 
                        +			{
                       | 
                    |
| 34 | 
                        + const tag_id : int = await services.tag.give(tag_value);  | 
                    |
| 35 | 
                        + const concept_tag_id : int = await repositories.concept_tags.create  | 
                    |
| 36 | 
                        + (  | 
                    |
| 37 | 
                        +					{
                       | 
                    |
| 38 | 
                        + "concept_id": concept_id,  | 
                    |
| 39 | 
                        + "tag_id": tag_id,  | 
                    |
| 40 | 
                        + }  | 
                    |
| 41 | 
                        + );  | 
                    |
| 42 | 
                        + return concept_tag_id;  | 
                    |
| 43 | 
                        + }  | 
                    |
| 44 | 
                        + );  | 
                    |
| 45 | 
                        + await Object.keys(concept_thing["translations"]).map  | 
                    |
| 46 | 
                        + (  | 
                    |
| 47 | 
                        + async (language_value) =>  | 
                    |
| 48 | 
                        +			{
                       | 
                    |
| 49 | 
                        + const language_id : int = await services.language.give(language_value);  | 
                    |
| 50 | 
                        + const concept_translation_ids = await concept_thing["translations"][language_value].map  | 
                    |
| 51 | 
                        + (  | 
                    |
| 52 | 
                        + async (translation_value) =>  | 
                    |
| 53 | 
                        +					{
                       | 
                    |
| 54 | 
                        + const concept_translation_id : int = await repositories.concept_translations.create  | 
                    |
| 55 | 
                        + (  | 
                    |
| 56 | 
                        +							{
                       | 
                    |
| 57 | 
                        + "concept_id": concept_id,  | 
                    |
| 58 | 
                        + "language_id": language_id,  | 
                    |
| 59 | 
                        + "value": translation_value,  | 
                    |
| 60 | 
                        + }  | 
                    |
| 61 | 
                        + );  | 
                    |
| 62 | 
                        + }  | 
                    |
| 63 | 
                        + );  | 
                    |
| 64 | 
                        + }  | 
                    |
| 65 | 
                        + );  | 
                    |
| 66 | 
                        + return concept_id;  | 
                    |
| 67 | 
                        + }  | 
                    |
| 68 | 
                        +  | 
                    |
| 69 | 
                        +  | 
                    |
| 70 | 
                        + /**  | 
                    |
| 71 | 
                        + */  | 
                    |
| 72 | 
                        + export function get_translations  | 
                    |
| 73 | 
                        + (  | 
                    |
| 74 | 
                        + language_from : string,  | 
                    |
| 75 | 
                        + language_to : string,  | 
                    |
| 76 | 
                        + part : string  | 
                    |
| 77 | 
                        + ) : Promise<Array<type_row>>  | 
                    |
| 78 | 
                        +	{
                       | 
                    |
| 79 | 
                        + return repositories.concept.get_translations  | 
                    |
| 80 | 
                        + (  | 
                    |
| 81 | 
                        + language_from,  | 
                    |
| 82 | 
                        + language_to,  | 
                    |
| 83 | 
                        + part  | 
                    |
| 84 | 
                        + );  | 
                    |
| 85 | 
                        + }  | 
                    |
| 86 | 
                        +  | 
                    |
| 87 | 
                        +  | 
                    |
| 88 | 
                        + /**  | 
                    |
| 89 | 
                        + */  | 
                    |
| 90 | 
                        + export async function export_  | 
                    |
| 91 | 
                        + (  | 
                    |
| 92 | 
                        +	) : Promise<Array<{id : int; type : string; description : string; tags : Array<string>; translations : {[language : string] : Array<string>}}>>
                       | 
                    |
| 93 | 
                        +	{
                       | 
                    |
| 94 | 
                        + const parse_tags = function (tags_raw : string) : Array<string>  | 
                    |
| 95 | 
                        +		{
                       | 
                    |
| 96 | 
                        + return (  | 
                    |
| 97 | 
                        + (tags_raw === null)  | 
                    |
| 98 | 
                        + ? []  | 
                    |
| 99 | 
                        +				: tags_raw.split(",")
                       | 
                    |
| 100 | 
                        + );  | 
                    |
| 101 | 
                        + };  | 
                    |
| 102 | 
                        +		const parse_translations = function (translations_raw : string) : {[language : string] : Array<string>}
                       | 
                    |
| 103 | 
                        +		{
                       | 
                    |
| 104 | 
                        +			let result : {[language : string] : Array<string>} = {};
                       | 
                    |
| 105 | 
                        +			const parts : Array<string> = translations_raw.split(",")
                       | 
                    |
| 106 | 
                        + parts.forEach  | 
                    |
| 107 | 
                        + (  | 
                    |
| 108 | 
                        + (part) =>  | 
                    |
| 109 | 
                        +				{
                       | 
                    |
| 110 | 
                        +					const [language, value] : Array<string> = part.split(":", 2);
                       | 
                    |
| 111 | 
                        + if (! result.hasOwnProperty(language)) result[language] = [];  | 
                    |
| 112 | 
                        + result[language].push(value);  | 
                    |
| 113 | 
                        + }  | 
                    |
| 114 | 
                        + );  | 
                    |
| 115 | 
                        + return result;  | 
                    |
| 116 | 
                        + };  | 
                    |
| 117 | 
                        + const rows : Array<type_row> = await repositories.concept.export();  | 
                    |
| 118 | 
                        + return Promise.resolve<any>(  | 
                    |
| 119 | 
                        + rows.map  | 
                    |
| 120 | 
                        + (  | 
                    |
| 121 | 
                        + (row) => (  | 
                    |
| 122 | 
                        +				{
                       | 
                    |
| 123 | 
                        + "id": row["id"],  | 
                    |
| 124 | 
                        + "type": row["type"],  | 
                    |
| 125 | 
                        + "description": row["description"],  | 
                    |
| 126 | 
                        + "tags": parse_tags(row["tags"]),  | 
                    |
| 127 | 
                        + "translations": parse_translations(row["translations"]),  | 
                    |
| 128 | 
                        + })  | 
                    |
| 129 | 
                        + )  | 
                    |
| 130 | 
                        + )  | 
                    |
| 131 | 
                        + }  | 
                    |
| 132 | 
                        +  | 
                    |
| 133 | 
                        +}  | 
                    |
| 134 | 
                        +  | 
                    
| ... | ... | 
                      @@ -0,0 +1,16 @@  | 
                  
| 1 | 
                        +SELECT  | 
                    |
| 2 | 
                        + x1.id AS id,  | 
                    |
| 3 | 
                        + MIN(x2.value) AS type,  | 
                    |
| 4 | 
                        + GROUP_CONCAT(DISTINCT x4.value) AS tags,  | 
                    |
| 5 | 
                        + GROUP_CONCAT(x6.value || ':' || x5.value) AS translations  | 
                    |
| 6 | 
                        +FROM  | 
                    |
| 7 | 
                        + concepts AS x1  | 
                    |
| 8 | 
                        + LEFT OUTER JOIN types AS x2 ON (x1.type_id = x2.id)  | 
                    |
| 9 | 
                        + LEFT OUTER JOIN concept_tags AS x3 ON (x1.id = x3.concept_id)  | 
                    |
| 10 | 
                        + LEFT OUTER JOIN tags AS x4 ON (x3.tag_id = x4.id)  | 
                    |
| 11 | 
                        + LEFT OUTER JOIN concept_translations AS x5 ON (x1.id = x5.concept_id)  | 
                    |
| 12 | 
                        + LEFT OUTER JOIN languages AS x6 ON (x5.language_id = x6.id)  | 
                    |
| 13 | 
                        +GROUP BY  | 
                    |
| 14 | 
                        + x1.id  | 
                    |
| 15 | 
                        +;  | 
                    |
| 16 | 
                        +  | 
                    
| ... | ... | 
                      @@ -0,0 +1,16 @@  | 
                  
| 1 | 
                        +SELECT  | 
                    |
| 2 | 
                        + x.concept_id AS concept_id,  | 
                    |
| 3 | 
                        + x.value AS value_from,  | 
                    |
| 4 | 
                        + y.value AS value_to  | 
                    |
| 5 | 
                        +FROM  | 
                    |
| 6 | 
                        + concept_translations AS x INNER JOIN concept_translations AS y ON (x.concept_id = y.concept_id)  | 
                    |
| 7 | 
                        +WHERE  | 
                    |
| 8 | 
                        + (  | 
                    |
| 9 | 
                        + (x.language_id = (SELECT id FROM languages WHERE (value = :language_value_from)))  | 
                    |
| 10 | 
                        + AND  | 
                    |
| 11 | 
                        + (y.language_id = (SELECT id FROM languages WHERE (value = :language_value_to)))  | 
                    |
| 12 | 
                        + AND  | 
                    |
| 13 | 
                        + (x.value LIKE :part)  | 
                    |
| 14 | 
                        + )  | 
                    |
| 15 | 
                        +;  | 
                    |
| 16 | 
                        +  | 
                    
| ... | ... | 
                      @@ -0,0 +1,20 @@  | 
                  
| 1 | 
                        +CREATE TABLE IF NOT EXISTS  | 
                    |
| 2 | 
                        + `concepts`(  | 
                    |
| 3 | 
                        + `id`  | 
                    |
| 4 | 
                        + INTEGER  | 
                    |
| 5 | 
                        + PRIMARY KEY  | 
                    |
| 6 | 
                        + AUTOINCREMENT  | 
                    |
| 7 | 
                        + ,  | 
                    |
| 8 | 
                        + `type_id`  | 
                    |
| 9 | 
                        + INTEGER  | 
                    |
| 10 | 
                        + NOT NULL  | 
                    |
| 11 | 
                        + ,  | 
                    |
| 12 | 
                        + `description`  | 
                    |
| 13 | 
                        + TEXT  | 
                    |
| 14 | 
                        + DEFAULT NULL  | 
                    |
| 15 | 
                        + ,  | 
                    |
| 16 | 
                        + FOREIGN KEY  | 
                    |
| 17 | 
                        + (`type_id`)  | 
                    |
| 18 | 
                        + REFERENCES `types`(`id`)  | 
                    |
| 19 | 
                        + )  | 
                    |
| 20 | 
                        +;  | 
                    
| ... | ... | 
                      @@ -0,0 +1,24 @@  | 
                  
| 1 | 
                        +CREATE TABLE IF NOT EXISTS  | 
                    |
| 2 | 
                        + `concept_tags`(  | 
                    |
| 3 | 
                        + `id`  | 
                    |
| 4 | 
                        + INTEGER  | 
                    |
| 5 | 
                        + PRIMARY KEY  | 
                    |
| 6 | 
                        + AUTOINCREMENT  | 
                    |
| 7 | 
                        + ,  | 
                    |
| 8 | 
                        + `concept_id`  | 
                    |
| 9 | 
                        + INTEGER  | 
                    |
| 10 | 
                        + NOT NULL  | 
                    |
| 11 | 
                        + ,  | 
                    |
| 12 | 
                        + `tag_id`  | 
                    |
| 13 | 
                        + INTEGER  | 
                    |
| 14 | 
                        + NOT NULL  | 
                    |
| 15 | 
                        + ,  | 
                    |
| 16 | 
                        + FOREIGN KEY  | 
                    |
| 17 | 
                        + (`concept_id`)  | 
                    |
| 18 | 
                        + REFERENCES `concepts`(`id`)  | 
                    |
| 19 | 
                        + ,  | 
                    |
| 20 | 
                        + FOREIGN KEY  | 
                    |
| 21 | 
                        + (`tag_id`)  | 
                    |
| 22 | 
                        + REFERENCES `tags`(`id`)  | 
                    |
| 23 | 
                        + )  | 
                    |
| 24 | 
                        +;  | 
                    
| ... | ... | 
                      @@ -0,0 +1,28 @@  | 
                  
| 1 | 
                        +CREATE TABLE IF NOT EXISTS  | 
                    |
| 2 | 
                        + `concept_translations`(  | 
                    |
| 3 | 
                        + `id`  | 
                    |
| 4 | 
                        + INTEGER  | 
                    |
| 5 | 
                        + PRIMARY KEY  | 
                    |
| 6 | 
                        + AUTOINCREMENT  | 
                    |
| 7 | 
                        + ,  | 
                    |
| 8 | 
                        + `concept_id`  | 
                    |
| 9 | 
                        + INTEGER  | 
                    |
| 10 | 
                        + NOT NULL  | 
                    |
| 11 | 
                        + ,  | 
                    |
| 12 | 
                        + `language_id`  | 
                    |
| 13 | 
                        + INTEGER  | 
                    |
| 14 | 
                        + NOT NULL  | 
                    |
| 15 | 
                        + ,  | 
                    |
| 16 | 
                        + `value`  | 
                    |
| 17 | 
                        + TEXT  | 
                    |
| 18 | 
                        + NOT NULL  | 
                    |
| 19 | 
                        + ,  | 
                    |
| 20 | 
                        + FOREIGN KEY  | 
                    |
| 21 | 
                        + (`language_id`)  | 
                    |
| 22 | 
                        + REFERENCES `languages`(`id`)  | 
                    |
| 23 | 
                        + ,  | 
                    |
| 24 | 
                        + FOREIGN KEY  | 
                    |
| 25 | 
                        + (`concept_id`)  | 
                    |
| 26 | 
                        + REFERENCES `concepts`(`id`)  | 
                    |
| 27 | 
                        + )  | 
                    |
| 28 | 
                        +;  |