@purveyors/cli 0.2.1 → 0.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/commands/catalog.d.ts +4 -56
- package/dist/commands/catalog.d.ts.map +1 -1
- package/dist/commands/catalog.js +14 -81
- package/dist/commands/catalog.js.map +1 -1
- package/dist/commands/inventory.d.ts +2 -25
- package/dist/commands/inventory.d.ts.map +1 -1
- package/dist/commands/inventory.js +47 -147
- package/dist/commands/inventory.js.map +1 -1
- package/dist/commands/roast.d.ts +2 -41
- package/dist/commands/roast.d.ts.map +1 -1
- package/dist/commands/roast.js +138 -125
- package/dist/commands/roast.js.map +1 -1
- package/dist/commands/sales.d.ts +2 -10
- package/dist/commands/sales.d.ts.map +1 -1
- package/dist/commands/sales.js +30 -109
- package/dist/commands/sales.js.map +1 -1
- package/dist/commands/tasting.d.ts +4 -38
- package/dist/commands/tasting.d.ts.map +1 -1
- package/dist/commands/tasting.js +18 -108
- package/dist/commands/tasting.js.map +1 -1
- package/dist/lib/artisan/db.d.ts +37 -0
- package/dist/lib/artisan/db.d.ts.map +1 -0
- package/dist/lib/artisan/db.js +51 -0
- package/dist/lib/artisan/db.js.map +1 -0
- package/dist/lib/artisan/import.d.ts +16 -0
- package/dist/lib/artisan/import.d.ts.map +1 -0
- package/dist/lib/artisan/import.js +447 -0
- package/dist/lib/artisan/import.js.map +1 -0
- package/dist/lib/artisan/index.d.ts +9 -0
- package/dist/lib/artisan/index.d.ts.map +1 -0
- package/dist/lib/artisan/index.js +7 -0
- package/dist/lib/artisan/index.js.map +1 -0
- package/dist/lib/artisan/parser.d.ts +19 -0
- package/dist/lib/artisan/parser.d.ts.map +1 -0
- package/dist/lib/artisan/parser.js +376 -0
- package/dist/lib/artisan/parser.js.map +1 -0
- package/dist/lib/artisan/temperature.d.ts +52 -0
- package/dist/lib/artisan/temperature.d.ts.map +1 -0
- package/dist/lib/artisan/temperature.js +101 -0
- package/dist/lib/artisan/temperature.js.map +1 -0
- package/dist/lib/artisan/types.d.ts +195 -0
- package/dist/lib/artisan/types.d.ts.map +1 -0
- package/dist/lib/artisan/types.js +35 -0
- package/dist/lib/artisan/types.js.map +1 -0
- package/dist/lib/artisan/validator.d.ts +14 -0
- package/dist/lib/artisan/validator.d.ts.map +1 -0
- package/dist/lib/artisan/validator.js +228 -0
- package/dist/lib/artisan/validator.js.map +1 -0
- package/dist/lib/catalog.d.ts +87 -0
- package/dist/lib/catalog.d.ts.map +1 -0
- package/dist/lib/catalog.js +111 -0
- package/dist/lib/catalog.js.map +1 -0
- package/dist/lib/index.d.ts +6 -0
- package/dist/lib/index.d.ts.map +1 -0
- package/dist/lib/index.js +11 -0
- package/dist/lib/index.js.map +1 -0
- package/dist/lib/inventory.d.ts +80 -0
- package/dist/lib/inventory.d.ts.map +1 -0
- package/dist/lib/inventory.js +205 -0
- package/dist/lib/inventory.js.map +1 -0
- package/dist/lib/roast.d.ts +127 -0
- package/dist/lib/roast.d.ts.map +1 -0
- package/dist/lib/roast.js +284 -0
- package/dist/lib/roast.js.map +1 -0
- package/dist/lib/sales.d.ts +53 -0
- package/dist/lib/sales.d.ts.map +1 -0
- package/dist/lib/sales.js +155 -0
- package/dist/lib/sales.js.map +1 -0
- package/dist/lib/tasting.d.ts +76 -0
- package/dist/lib/tasting.d.ts.map +1 -0
- package/dist/lib/tasting.js +136 -0
- package/dist/lib/tasting.js.map +1 -0
- package/package.json +13 -2
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sales.js","sourceRoot":"","sources":["../../src/commands/sales.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,yBAAyB,EAAE,MAAM,oBAAoB,CAAC;AAC/D,OAAO,EAAE,UAAU,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAC7D,OAAO,EAAE,iBAAiB,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC5E,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;
|
|
1
|
+
{"version":3,"file":"sales.js","sourceRoot":"","sources":["../../src/commands/sales.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,42 +1,8 @@
|
|
|
1
1
|
import { Command } from 'commander';
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
name: string | null;
|
|
7
|
-
processing: string | null;
|
|
8
|
-
region: string | null;
|
|
9
|
-
cupping_notes: string | null;
|
|
10
|
-
ai_tasting_notes: unknown | null;
|
|
11
|
-
ai_description: string | null;
|
|
12
|
-
}
|
|
13
|
-
export interface UserTastingNotes {
|
|
14
|
-
source: 'user';
|
|
15
|
-
inventoryId: number;
|
|
16
|
-
catalogId: number | null;
|
|
17
|
-
cupping_notes: string | null;
|
|
18
|
-
notes: string | null;
|
|
19
|
-
}
|
|
20
|
-
export interface TastingResult {
|
|
21
|
-
beanId: number;
|
|
22
|
-
filter: TastingFilter;
|
|
23
|
-
supplier: SupplierTastingNotes | null;
|
|
24
|
-
user: UserTastingNotes | null;
|
|
25
|
-
}
|
|
26
|
-
export interface CuppingNotes {
|
|
27
|
-
aroma?: number;
|
|
28
|
-
body?: number;
|
|
29
|
-
acidity?: number;
|
|
30
|
-
sweetness?: number;
|
|
31
|
-
aftertaste?: number;
|
|
32
|
-
brew_method?: string;
|
|
33
|
-
notes?: string;
|
|
34
|
-
rated_at?: string;
|
|
35
|
-
}
|
|
36
|
-
/** Validate a cupping score is an integer in [1, 5]. */
|
|
37
|
-
export declare function isValidCuppingScore(value: number): boolean;
|
|
38
|
-
/** Parse and validate a cupping score flag value. */
|
|
39
|
-
export declare function parseCuppingScore(raw: string, flag: string): number;
|
|
2
|
+
import { isValidCuppingScore, parseCuppingScore } from '../lib/tasting.js';
|
|
3
|
+
import type { TastingFilter, TastingData, CuppingNotes } from '../lib/tasting.js';
|
|
4
|
+
export type { TastingFilter, TastingData, CuppingNotes };
|
|
5
|
+
export { isValidCuppingScore, parseCuppingScore };
|
|
40
6
|
/**
|
|
41
7
|
* `purvey tasting` — View and record tasting notes for a bean.
|
|
42
8
|
* Combines supplier notes from coffee_catalog with user notes from green_coffee_inv.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tasting.d.ts","sourceRoot":"","sources":["../../src/commands/tasting.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"tasting.d.ts","sourceRoot":"","sources":["../../src/commands/tasting.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAIpC,OAAO,EAGL,mBAAmB,EACnB,iBAAiB,EAClB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,KAAK,EAAE,aAAa,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAIlF,YAAY,EAAE,aAAa,EAAE,WAAW,EAAE,YAAY,EAAE,CAAC;AACzD,OAAO,EAAE,mBAAmB,EAAE,iBAAiB,EAAE,CAAC;AAIlD;;;;GAIG;AACH,wBAAgB,mBAAmB,IAAI,OAAO,CA8G7C"}
|
package/dist/commands/tasting.js
CHANGED
|
@@ -2,19 +2,8 @@ import { Command } from 'commander';
|
|
|
2
2
|
import { createAuthenticatedClient } from '../lib/supabase.js';
|
|
3
3
|
import { outputData, info, success } from '../lib/output.js';
|
|
4
4
|
import { withErrorHandling, AuthError, PrvrsError } from '../lib/errors.js';
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
export function isValidCuppingScore(value) {
|
|
8
|
-
return Number.isInteger(value) && value >= 1 && value <= 5;
|
|
9
|
-
}
|
|
10
|
-
/** Parse and validate a cupping score flag value. */
|
|
11
|
-
export function parseCuppingScore(raw, flag) {
|
|
12
|
-
const n = parseInt(raw, 10);
|
|
13
|
-
if (isNaN(n) || !isValidCuppingScore(n)) {
|
|
14
|
-
throw new PrvrsError('INVALID_ARGUMENT', `--${flag} must be an integer between 1 and 5 (got "${raw}").`);
|
|
15
|
-
}
|
|
16
|
-
return n;
|
|
17
|
-
}
|
|
5
|
+
import { getTastingNotes, rateCoffee, isValidCuppingScore, parseCuppingScore, } from '../lib/tasting.js';
|
|
6
|
+
export { isValidCuppingScore, parseCuppingScore };
|
|
18
7
|
// ─── Command builder ──────────────────────────────────────────────────────────
|
|
19
8
|
/**
|
|
20
9
|
* `purvey tasting` — View and record tasting notes for a bean.
|
|
@@ -43,59 +32,7 @@ export function buildTastingCommand() {
|
|
|
43
32
|
if (!user) {
|
|
44
33
|
throw new AuthError('Not logged in. Run `purvey auth login` first.');
|
|
45
34
|
}
|
|
46
|
-
const result =
|
|
47
|
-
beanId: catalogId,
|
|
48
|
-
filter,
|
|
49
|
-
supplier: null,
|
|
50
|
-
user: null,
|
|
51
|
-
};
|
|
52
|
-
// ── Supplier notes (from coffee_catalog) ─────────────────────────
|
|
53
|
-
if (filter === 'supplier' || filter === 'both') {
|
|
54
|
-
const { data: catalogRow, error: catalogError } = await supabase
|
|
55
|
-
.from('coffee_catalog')
|
|
56
|
-
.select('id, name, processing, region, source, cupping_notes, ai_tasting_notes, ai_description')
|
|
57
|
-
.eq('id', catalogId)
|
|
58
|
-
.single();
|
|
59
|
-
if (catalogError && catalogError.code !== 'PGRST116') {
|
|
60
|
-
throw catalogError;
|
|
61
|
-
}
|
|
62
|
-
if (catalogRow) {
|
|
63
|
-
result.supplier = {
|
|
64
|
-
source: 'supplier',
|
|
65
|
-
catalogId: catalogRow.id,
|
|
66
|
-
name: catalogRow.name ?? null,
|
|
67
|
-
processing: catalogRow.processing ?? null,
|
|
68
|
-
region: catalogRow.region ?? null,
|
|
69
|
-
cupping_notes: catalogRow.cupping_notes ?? null,
|
|
70
|
-
ai_tasting_notes: catalogRow.ai_tasting_notes ?? null,
|
|
71
|
-
ai_description: catalogRow.ai_description ?? null,
|
|
72
|
-
};
|
|
73
|
-
}
|
|
74
|
-
}
|
|
75
|
-
// ── User notes (from green_coffee_inv) ───────────────────────────
|
|
76
|
-
if (filter === 'user' || filter === 'both') {
|
|
77
|
-
// A user might have multiple inventory items from the same catalog entry
|
|
78
|
-
const { data: invRows, error: invError } = await supabase
|
|
79
|
-
.from('green_coffee_inv')
|
|
80
|
-
.select('id, catalog_id, cupping_notes, notes')
|
|
81
|
-
.eq('catalog_id', catalogId)
|
|
82
|
-
.eq('user', user.id)
|
|
83
|
-
.order('id', { ascending: false })
|
|
84
|
-
.limit(1);
|
|
85
|
-
if (invError)
|
|
86
|
-
throw invError;
|
|
87
|
-
if (invRows && invRows.length > 0) {
|
|
88
|
-
const row = invRows[0];
|
|
89
|
-
result.user = {
|
|
90
|
-
source: 'user',
|
|
91
|
-
inventoryId: row.id,
|
|
92
|
-
catalogId: row.catalog_id ?? null,
|
|
93
|
-
cupping_notes: row.cupping_notes ?? null,
|
|
94
|
-
notes: row.notes ?? null,
|
|
95
|
-
};
|
|
96
|
-
}
|
|
97
|
-
}
|
|
98
|
-
// If nothing found at all, let the user know
|
|
35
|
+
const result = await getTastingNotes(supabase, user.id, catalogId, filter);
|
|
99
36
|
if (result.supplier === null && result.user === null) {
|
|
100
37
|
info(`No tasting notes found for bean ID ${catalogId} (filter: ${filter}).`);
|
|
101
38
|
return;
|
|
@@ -119,53 +56,26 @@ export function buildTastingCommand() {
|
|
|
119
56
|
if (isNaN(inventoryId)) {
|
|
120
57
|
throw new PrvrsError('INVALID_ARGUMENT', `Invalid bean ID: "${beanId}". Pass a green_coffee_inv ID.`);
|
|
121
58
|
}
|
|
122
|
-
// Parse and validate all scores
|
|
123
|
-
const
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
aftertaste: parseCuppingScore(opts.aftertaste, 'aftertaste'),
|
|
129
|
-
rated_at: new Date().toISOString(),
|
|
130
|
-
};
|
|
131
|
-
if (opts.brewMethod !== undefined) {
|
|
132
|
-
cupping.brew_method = opts.brewMethod;
|
|
133
|
-
}
|
|
134
|
-
if (opts.notes !== undefined) {
|
|
135
|
-
cupping.notes = opts.notes;
|
|
136
|
-
}
|
|
59
|
+
// Parse and validate all scores (CLI strings → numbers)
|
|
60
|
+
const aroma = parseCuppingScore(opts.aroma, 'aroma');
|
|
61
|
+
const body = parseCuppingScore(opts.body, 'body');
|
|
62
|
+
const acidity = parseCuppingScore(opts.acidity, 'acidity');
|
|
63
|
+
const sweetness = parseCuppingScore(opts.sweetness, 'sweetness');
|
|
64
|
+
const aftertaste = parseCuppingScore(opts.aftertaste, 'aftertaste');
|
|
137
65
|
const supabase = await createAuthenticatedClient();
|
|
138
66
|
const { data: { user }, } = await supabase.auth.getUser();
|
|
139
67
|
if (!user) {
|
|
140
68
|
throw new AuthError('Not logged in. Run `purvey auth login` first.');
|
|
141
69
|
}
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
.
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
}
|
|
152
|
-
// Update the cupping_notes JSONB field
|
|
153
|
-
const { error: updateError } = await supabase
|
|
154
|
-
.from('green_coffee_inv')
|
|
155
|
-
// Pass object directly — Supabase JS serializes JSONB columns correctly
|
|
156
|
-
.update({ cupping_notes: cupping })
|
|
157
|
-
.eq('id', inventoryId)
|
|
158
|
-
.eq('user', user.id);
|
|
159
|
-
if (updateError)
|
|
160
|
-
throw updateError;
|
|
161
|
-
// Re-fetch the updated row
|
|
162
|
-
const { data, error } = await supabase
|
|
163
|
-
.from('green_coffee_inv')
|
|
164
|
-
.select('id, catalog_id, cupping_notes, notes, last_updated')
|
|
165
|
-
.eq('id', inventoryId)
|
|
166
|
-
.single();
|
|
167
|
-
if (error)
|
|
168
|
-
throw error;
|
|
70
|
+
const data = await rateCoffee(supabase, user.id, inventoryId, {
|
|
71
|
+
aroma,
|
|
72
|
+
body,
|
|
73
|
+
acidity,
|
|
74
|
+
sweetness,
|
|
75
|
+
aftertaste,
|
|
76
|
+
brewMethod: opts.brewMethod,
|
|
77
|
+
notes: opts.notes,
|
|
78
|
+
});
|
|
169
79
|
success(`Cupping notes saved for inventory item ${inventoryId}.`);
|
|
170
80
|
outputData(data, globalOpts);
|
|
171
81
|
}));
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tasting.js","sourceRoot":"","sources":["../../src/commands/tasting.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,yBAAyB,EAAE,MAAM,oBAAoB,CAAC;AAC/D,OAAO,EAAE,UAAU,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAC7D,OAAO,EAAE,iBAAiB,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"tasting.js","sourceRoot":"","sources":["../../src/commands/tasting.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import type { SupabaseClient } from '@supabase/supabase-js';
|
|
2
|
+
export interface TemperatureRow {
|
|
3
|
+
roast_id: number;
|
|
4
|
+
time_seconds: number;
|
|
5
|
+
bean_temp?: number | null;
|
|
6
|
+
environmental_temp?: number | null;
|
|
7
|
+
ambient_temp?: number | null;
|
|
8
|
+
ror_bean_temp?: number | null;
|
|
9
|
+
data_source: string;
|
|
10
|
+
}
|
|
11
|
+
export interface EventRow {
|
|
12
|
+
roast_id: number;
|
|
13
|
+
time_seconds: number;
|
|
14
|
+
event_type: number;
|
|
15
|
+
event_value: string | null;
|
|
16
|
+
event_string: string;
|
|
17
|
+
category: string;
|
|
18
|
+
subcategory: string;
|
|
19
|
+
user_generated: boolean;
|
|
20
|
+
automatic: boolean;
|
|
21
|
+
notes?: string;
|
|
22
|
+
}
|
|
23
|
+
export declare const BATCH_SIZE = 100;
|
|
24
|
+
/**
|
|
25
|
+
* Clear existing roast data scoped to artisan_import source.
|
|
26
|
+
* Deletes temperature rows by data_source and event rows by category.
|
|
27
|
+
*/
|
|
28
|
+
export declare function clearRoastData(supabase: SupabaseClient, roastId: number, source: 'artisan_import' | 'live'): Promise<void>;
|
|
29
|
+
/**
|
|
30
|
+
* Batch-insert temperature rows into roast_temperatures.
|
|
31
|
+
*/
|
|
32
|
+
export declare function insertTemperatures(supabase: SupabaseClient, entries: TemperatureRow[]): Promise<void>;
|
|
33
|
+
/**
|
|
34
|
+
* Batch-insert event rows into roast_events.
|
|
35
|
+
*/
|
|
36
|
+
export declare function insertEvents(supabase: SupabaseClient, entries: EventRow[]): Promise<void>;
|
|
37
|
+
//# sourceMappingURL=db.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"db.d.ts","sourceRoot":"","sources":["../../../src/lib/artisan/db.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAI5D,MAAM,WAAW,cAAc;IAC7B,QAAQ,EAAE,MAAM,CAAC;IACjB,YAAY,EAAE,MAAM,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,kBAAkB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACnC,YAAY,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,aAAa,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,QAAQ;IACvB,QAAQ,EAAE,MAAM,CAAC;IACjB,YAAY,EAAE,MAAM,CAAC;IACrB,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,YAAY,EAAE,MAAM,CAAC;IACrB,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;IACpB,cAAc,EAAE,OAAO,CAAC;IACxB,SAAS,EAAE,OAAO,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAID,eAAO,MAAM,UAAU,MAAM,CAAC;AAI9B;;;GAGG;AACH,wBAAsB,cAAc,CAClC,QAAQ,EAAE,cAAc,EACxB,OAAO,EAAE,MAAM,EACf,MAAM,EAAE,gBAAgB,GAAG,MAAM,GAChC,OAAO,CAAC,IAAI,CAAC,CAgBf;AAED;;GAEG;AACH,wBAAsB,kBAAkB,CACtC,QAAQ,EAAE,cAAc,EACxB,OAAO,EAAE,cAAc,EAAE,GACxB,OAAO,CAAC,IAAI,CAAC,CASf;AAED;;GAEG;AACH,wBAAsB,YAAY,CAAC,QAAQ,EAAE,cAAc,EAAE,OAAO,EAAE,QAAQ,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAS/F"}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
// ── Constants ─────────────────────────────────────────────────────────────────
|
|
2
|
+
export const BATCH_SIZE = 100;
|
|
3
|
+
// ── Functions ─────────────────────────────────────────────────────────────────
|
|
4
|
+
/**
|
|
5
|
+
* Clear existing roast data scoped to artisan_import source.
|
|
6
|
+
* Deletes temperature rows by data_source and event rows by category.
|
|
7
|
+
*/
|
|
8
|
+
export async function clearRoastData(supabase, roastId, source) {
|
|
9
|
+
await supabase
|
|
10
|
+
.from('roast_temperatures')
|
|
11
|
+
.delete()
|
|
12
|
+
.eq('roast_id', roastId)
|
|
13
|
+
.eq('data_source', source);
|
|
14
|
+
if (source === 'artisan_import') {
|
|
15
|
+
await supabase
|
|
16
|
+
.from('roast_events')
|
|
17
|
+
.delete()
|
|
18
|
+
.eq('roast_id', roastId)
|
|
19
|
+
.in('category', ['milestone', 'control', 'machine']);
|
|
20
|
+
}
|
|
21
|
+
else {
|
|
22
|
+
await supabase.from('roast_events').delete().eq('roast_id', roastId);
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Batch-insert temperature rows into roast_temperatures.
|
|
27
|
+
*/
|
|
28
|
+
export async function insertTemperatures(supabase, entries) {
|
|
29
|
+
for (let i = 0; i < entries.length; i += BATCH_SIZE) {
|
|
30
|
+
const batch = entries.slice(i, i + BATCH_SIZE);
|
|
31
|
+
const { error } = await supabase.from('roast_temperatures').insert(batch);
|
|
32
|
+
if (error) {
|
|
33
|
+
console.error('Error inserting temperature batch:', error);
|
|
34
|
+
throw error;
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Batch-insert event rows into roast_events.
|
|
40
|
+
*/
|
|
41
|
+
export async function insertEvents(supabase, entries) {
|
|
42
|
+
for (let i = 0; i < entries.length; i += BATCH_SIZE) {
|
|
43
|
+
const batch = entries.slice(i, i + BATCH_SIZE);
|
|
44
|
+
const { error } = await supabase.from('roast_events').insert(batch);
|
|
45
|
+
if (error) {
|
|
46
|
+
console.error('Error inserting event batch:', error);
|
|
47
|
+
throw error;
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
//# sourceMappingURL=db.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"db.js","sourceRoot":"","sources":["../../../src/lib/artisan/db.ts"],"names":[],"mappings":"AA2BA,iFAAiF;AAEjF,MAAM,CAAC,MAAM,UAAU,GAAG,GAAG,CAAC;AAE9B,iFAAiF;AAEjF;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,cAAc,CAClC,QAAwB,EACxB,OAAe,EACf,MAAiC;IAEjC,MAAM,QAAQ;SACX,IAAI,CAAC,oBAAoB,CAAC;SAC1B,MAAM,EAAE;SACR,EAAE,CAAC,UAAU,EAAE,OAAO,CAAC;SACvB,EAAE,CAAC,aAAa,EAAE,MAAM,CAAC,CAAC;IAE7B,IAAI,MAAM,KAAK,gBAAgB,EAAE,CAAC;QAChC,MAAM,QAAQ;aACX,IAAI,CAAC,cAAc,CAAC;aACpB,MAAM,EAAE;aACR,EAAE,CAAC,UAAU,EAAE,OAAO,CAAC;aACvB,EAAE,CAAC,UAAU,EAAE,CAAC,WAAW,EAAE,SAAS,EAAE,SAAS,CAAC,CAAC,CAAC;IACzD,CAAC;SAAM,CAAC;QACN,MAAM,QAAQ,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC,MAAM,EAAE,CAAC,EAAE,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;IACvE,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,kBAAkB,CACtC,QAAwB,EACxB,OAAyB;IAEzB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,IAAI,UAAU,EAAE,CAAC;QACpD,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,GAAG,UAAU,CAAC,CAAC;QAC/C,MAAM,EAAE,KAAK,EAAE,GAAG,MAAM,QAAQ,CAAC,IAAI,CAAC,oBAAoB,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QAC1E,IAAI,KAAK,EAAE,CAAC;YACV,OAAO,CAAC,KAAK,CAAC,oCAAoC,EAAE,KAAK,CAAC,CAAC;YAC3D,MAAM,KAAK,CAAC;QACd,CAAC;IACH,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,QAAwB,EAAE,OAAmB;IAC9E,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,IAAI,UAAU,EAAE,CAAC;QACpD,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,GAAG,UAAU,CAAC,CAAC;QAC/C,MAAM,EAAE,KAAK,EAAE,GAAG,MAAM,QAAQ,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QACpE,IAAI,KAAK,EAAE,CAAC;YACV,OAAO,CAAC,KAAK,CAAC,8BAA8B,EAAE,KAAK,CAAC,CAAC;YACrD,MAAM,KAAK,CAAC;QACd,CAAC;IACH,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import type { SupabaseClient } from '@supabase/supabase-js';
|
|
2
|
+
import type { ArtisanRoastData, MilestoneData, ProcessedRoastData } from './types.js';
|
|
3
|
+
export interface ArtisanImportResult {
|
|
4
|
+
success: boolean;
|
|
5
|
+
message: string;
|
|
6
|
+
milestones: MilestoneData;
|
|
7
|
+
phases: ProcessedRoastData['phases'];
|
|
8
|
+
total_time: number;
|
|
9
|
+
temperature_unit: 'F' | 'C';
|
|
10
|
+
milestone_events: number;
|
|
11
|
+
control_events: number;
|
|
12
|
+
}
|
|
13
|
+
export declare function parseArtisanFile(fileContent: string, fileName: string): Promise<ArtisanRoastData>;
|
|
14
|
+
export declare function transformArtisanData(parsedData: ArtisanRoastData, roastId: number): ProcessedRoastData;
|
|
15
|
+
export declare function importArtisanData(supabase: SupabaseClient, roastId: number, userId: string, fileContent: string, fileName: string, fileSize?: number): Promise<ArtisanImportResult>;
|
|
16
|
+
//# sourceMappingURL=import.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"import.d.ts","sourceRoot":"","sources":["../../../src/lib/artisan/import.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAC5D,OAAO,KAAK,EAAE,gBAAgB,EAAE,aAAa,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAMtF,MAAM,WAAW,mBAAmB;IAClC,OAAO,EAAE,OAAO,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,aAAa,CAAC;IAC1B,MAAM,EAAE,kBAAkB,CAAC,QAAQ,CAAC,CAAC;IACrC,UAAU,EAAE,MAAM,CAAC;IACnB,gBAAgB,EAAE,GAAG,GAAG,GAAG,CAAC;IAC5B,gBAAgB,EAAE,MAAM,CAAC;IACzB,cAAc,EAAE,MAAM,CAAC;CACxB;AAGD,wBAAsB,gBAAgB,CACpC,WAAW,EAAE,MAAM,EACnB,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,gBAAgB,CAAC,CA8B3B;AAqCD,wBAAgB,oBAAoB,CAClC,UAAU,EAAE,gBAAgB,EAC5B,OAAO,EAAE,MAAM,GACd,kBAAkB,CAkRpB;AAGD,wBAAsB,iBAAiB,CACrC,QAAQ,EAAE,cAAc,EACxB,OAAO,EAAE,MAAM,EACf,MAAM,EAAE,MAAM,EACd,WAAW,EAAE,MAAM,EACnB,QAAQ,EAAE,MAAM,EAChB,QAAQ,CAAC,EAAE,MAAM,GAChB,OAAO,CAAC,mBAAmB,CAAC,CA2J9B"}
|