Compare commits
	
		
			No commits in common. "1815547daf2ab260ca25ef5d46a6f65048ecfa7f" and "83aeeea05009b3af3b562f8b33ecf452539cd55d" have entirely different histories.
		
	
	
		
			1815547daf
			...
			83aeeea050
		
	
		
					 7 changed files with 69 additions and 232 deletions
				
			
		
							
								
								
									
										89
									
								
								0PLAN.org
									
										
									
									
									
								
							
							
						
						
									
										89
									
								
								0PLAN.org
									
										
									
									
									
								
							|  | @ -1,89 +0,0 @@ | |||
| #+title: Frontend | ||||
| 
 | ||||
| * Plan | ||||
| 
 | ||||
| ** 0.2 | ||||
| 
 | ||||
| - [-] use localStorage to store user | ||||
|   - [ ] add barcode scanner to get the user | ||||
|   - [X] allow editing | ||||
|   - [X] add UserSelect component | ||||
| - [X] integrate script for starting build qemu system | ||||
| - [X] add org file to the repository after cleanup | ||||
| 
 | ||||
| ** 0.3 | ||||
| 
 | ||||
| - [ ] versioned schema support | ||||
|   - [ ] barschema table | ||||
|   - [ ] function to check | ||||
|   - [ ] function to set | ||||
|   - [ ] initial creation of tables at version 1 assuming OK if tables exist | ||||
| 
 | ||||
| ** 0.4 | ||||
| 
 | ||||
| - [ ] add inventory check table | ||||
| - [ ] add inventory item check table | ||||
| - [ ] create new check | ||||
| - [ ] check item | ||||
| - [ ] close check | ||||
| - [ ] inventory check component | ||||
| 
 | ||||
| ** Later | ||||
| 
 | ||||
| - [ ] add static token support | ||||
|   - [ ] hardwired token for the React.JS app? | ||||
| - [ ] authentication | ||||
|   - [ ] login/logout | ||||
|   - [ ] allow API calls only with login token | ||||
| 
 | ||||
| * Finished | ||||
| 
 | ||||
| ** 0.1 | ||||
| 
 | ||||
| - [X] statically compiled binary HTTP server | ||||
| - [X] include directory tree contents | ||||
| - [X] handle frontend with mime type | ||||
| - [X] move app to / again | ||||
| - [X] load certificates | ||||
| - [X] deployment preparations | ||||
|   - [X] crosscompilation - no, compile in qemu or on separate host | ||||
|   - [X] connect to postgres | ||||
|   - [X] use qr-scanner - no, qr-barcode-scanner is needed | ||||
|   - [X] rsync + build in qemu or host without react (filters or something) | ||||
| - [X] API infrastructure | ||||
|   - [X] handle API calls | ||||
|   - [X] API registry syntax | ||||
|   - [X] lookup barcode in DB | ||||
|   - [X] separate module brmbar-data for queries | ||||
|   - [X] separate module api-servlets | ||||
| 
 | ||||
| * Qemu | ||||
| 
 | ||||
| #+BEGIN_SRC | ||||
| wget img zip # 2019-04-08-raspbian-stretch.zip | ||||
| unzip 2019-04-08-raspbian-stretch.zip | ||||
| sudo mkdir /mnt/image | ||||
| sudo mount -o loop,offset=4194304 2019-04-08-raspbian-stretch.img /mnt/image/ | ||||
| # In qemu-system-armhf terminal! | ||||
| cp kernel, DT | ||||
| umount /mnt/image | ||||
| resize img | ||||
| #+END_SRC | ||||
| 
 | ||||
| sources.list - archive debian (remove rpi), archive raspberry | ||||
| https://archive.raspberrypi.org/debian/ | ||||
| https://archive.debian.org/debian/ | ||||
| apt-get --no | ||||
| 
 | ||||
| * React - Vite | ||||
| 
 | ||||
| #+BEGIN_SRC sh | ||||
|   npm create vite@latest | ||||
|   # "frontend" | ||||
|   # React | ||||
|   # Javascript | ||||
|   cd frontend | ||||
|   npm install | ||||
|   npm run dev | ||||
|   npm run build | ||||
| #+END_SRC | ||||
|  | @ -47,7 +47,6 @@ | |||
| (define -db-user- (make-parameter #f)) | ||||
| (define -db-name- (make-parameter #f)) | ||||
| (define -db-pass- (make-parameter #f)) | ||||
| (define -db-enabled- (make-parameter #t)) | ||||
| 
 | ||||
| (command-line | ||||
|  print-help | ||||
|  | @ -83,8 +82,6 @@ | |||
|       (-db-user- dbuser)) | ||||
|  (-dp (dbpass) "Database password" | ||||
|       (-db-pass- dbpass)) | ||||
|  (-dd () "Disable database" | ||||
|       (-db-enabled- #f)) | ||||
|  ) | ||||
| 
 | ||||
| (define ssl? (and (-certificate-) (-key-) #t)) | ||||
|  | @ -123,8 +120,7 @@ | |||
| (print "current user id: " (current-user-id)) | ||||
| (print "current effective user id: " (current-effective-user-id)) | ||||
| 
 | ||||
| (when (-db-enabled-) | ||||
|   (bar-db-init! (-db-name-) (-db-host-) (-db-user-) (-db-pass-))) | ||||
| (bar-db-init! (-db-name-) (-db-host-) (-db-user-) (-db-pass-)) | ||||
| 
 | ||||
| (define (handle-api-calls) | ||||
|   (define plst (cdr (uri-path (request-uri (current-request))))) | ||||
|  |  | |||
|  | @ -1,84 +1,13 @@ | |||
| import { useState, useEffect } from 'react'; | ||||
| import { useState } from 'react'; | ||||
| import BarcodeScannerComponent from 'react-qr-barcode-scanner'; | ||||
| import Container from 'react-bootstrap/Container'; | ||||
| import Row from 'react-bootstrap/Row'; | ||||
| import Col from 'react-bootstrap/Col'; | ||||
| import { Container, Row, Col } from 'react-bootstrap'; | ||||
| import Table from 'react-bootstrap/Table'; | ||||
| import Alert from 'react-bootstrap/Alert'; | ||||
| import Form from 'react-bootstrap/Form'; | ||||
| import Button from 'react-bootstrap/Button'; | ||||
| 
 | ||||
| import './App.css'; | ||||
| import 'bootstrap/dist/css/bootstrap.min.css'; | ||||
| 
 | ||||
| function App() { | ||||
|     // Ensure we have persistent (informal) user information | ||||
|     const [user, setUser] = useState(""); | ||||
|     useEffect(() => { | ||||
| 	const user = localStorage.getItem('user'); | ||||
| 	if (user) { | ||||
| 	    setUser(user); | ||||
| 	} | ||||
|     }, []); | ||||
|     useEffect(() => { | ||||
| 	localStorage.setItem('user', user); | ||||
|     }, [user]); | ||||
| 
 | ||||
|     // If no user, must be scanned/set otherwise | ||||
|     return ( | ||||
| 	<Container> | ||||
| 	    {user === "" ? | ||||
| 	     <NoUserView setUser={setUser} /> | ||||
| 	     : | ||||
| 	     <UserView user={user} setUser={setUser} />} | ||||
| 	</Container> | ||||
|     ); | ||||
| } | ||||
| 
 | ||||
| function NoUserView({setUser}) { | ||||
|     const [preUser, setPreUser] = useState(""); | ||||
|     return ( | ||||
| 	<> | ||||
| 	    <Row> | ||||
| 		<Col> | ||||
| 		    <Form.Group> | ||||
| 			<Form.Label>User:</Form.Label> | ||||
| 			<Form.Control type="text" placeholder="Username" | ||||
| 				      value={preUser} onChange={(v) => setPreUser(v.target.value)} /> | ||||
| 			<Form.Text>Which user is using this App?</Form.Text> | ||||
| 		    </Form.Group> | ||||
| 		</Col> | ||||
| 	    </Row> | ||||
| 	    <Row> | ||||
| 		<Col> | ||||
| 		    Scanner | ||||
| 		</Col> | ||||
| 	    </Row> | ||||
| 	    <Row> | ||||
| 		<Col> | ||||
| 		    <Button variant="primary" | ||||
| 			    onClick={() => setUser(preUser)}>Set!</Button> | ||||
| 		</Col> | ||||
| 	    </Row> | ||||
| 	</> | ||||
|     ); | ||||
| } | ||||
| 
 | ||||
| function UserView({user, setUser}) { | ||||
|     return ( | ||||
| 	<Row> | ||||
| 	    <Col> | ||||
| 		{user} | ||||
| 	    </Col> | ||||
| 	    <Col> | ||||
| 		<Button variant="info" onClick={() => setUser('')}>Change</Button> | ||||
| 	    </Col> | ||||
| 	    <BarItemScanner /> | ||||
| 	</Row> | ||||
|     ); | ||||
| } | ||||
| 
 | ||||
| function BarItemScanner() { | ||||
|     const [reqAccount, setReqAccount] = useState(''); | ||||
|     const [actAccount, setActAccount] = useState(''); | ||||
|     const [balance, setBalance] = useState(-1); | ||||
|  | @ -108,7 +37,7 @@ function BarItemScanner() { | |||
|     }; | ||||
| 
 | ||||
|     return ( | ||||
| 	<> | ||||
| 	<Container> | ||||
| 	    <Row> | ||||
| 		<Col> | ||||
| 		    <BarcodeScannerComponent | ||||
|  | @ -142,7 +71,7 @@ function BarItemScanner() { | |||
| 		    <Alert variant={msgType}>{statusMsg}</Alert> | ||||
| 		</Col> | ||||
| 	    </Row> | ||||
| 	</> | ||||
| 	</Container> | ||||
|     ); | ||||
| } | ||||
| 
 | ||||
|  |  | |||
							
								
								
									
										64
									
								
								install-eggs-arm.sh
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										64
									
								
								install-eggs-arm.sh
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,64 @@ | |||
| #!/bin/sh | ||||
| # | ||||
| # install-eggs.sh | ||||
| # | ||||
| # Local installer of CHICKEN eggs required for building. | ||||
| # | ||||
| # ISC License | ||||
| # | ||||
| # Copyright 2023 Brmlab, z.s. | ||||
| # Dominik Pantůček <dominik.pantucek@trustica.cz> | ||||
| # | ||||
| # Permission to use, copy, modify, and/or distribute this software | ||||
| # for any purpose with or without fee is hereby granted, provided | ||||
| # that the above copyright notice and this permission notice appear | ||||
| # in all copies. | ||||
| #  | ||||
| # THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL | ||||
| # WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED | ||||
| # WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE | ||||
| # AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR | ||||
| # CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS | ||||
| # OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, | ||||
| # NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN | ||||
| # CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. | ||||
| # | ||||
| 
 | ||||
| # Source root directory | ||||
| owd=$(pwd) | ||||
| cd $(dirname "$0") | ||||
| SRCDIR=$(pwd) | ||||
| cd "$owd" | ||||
| 
 | ||||
| # Make temporary prefix directory (eggs shared throwaway files) | ||||
| TMPDIR=$(mktemp -d) | ||||
| 
 | ||||
| # Installs given egg locally | ||||
| chicken_install() { | ||||
|     echo "Installing $1 ..." | ||||
|     # CHICKEN_INSTALL_PREFIX="$TMPDIR" \ | ||||
|     # 			  CHICKEN_REPOSITORY_PATH="$SRCDIR/eggs-arm":`./cross-chicken-arm/bin/arm-chicken-install -repository` \ | ||||
|     # 			  CHICKEN_INSTALL_REPOSITORY="$SRCDIR/eggs-arm" \ | ||||
|     # 			  ./cross-chicken-arm/bin/arm-chicken-install "$1" 2>&1 | \ | ||||
|     # 	sed -u 's/^/  /' | ||||
| #    CHICKEN_INSTALL_PREFIX="$TMPDIR" \ | ||||
| 			  ./cross-chicken-arm/bin/arm-chicken-install "$1" 2>&1 | \ | ||||
| 	sed -u 's/^/  /' | ||||
| } | ||||
| 
 | ||||
| # Removes throwaway files | ||||
| chicken_cleanup() { | ||||
|     echo "Cleaning up ..." | ||||
|     rm -fr ${TMPDIR} | ||||
| } | ||||
| 
 | ||||
| # Always cleanup | ||||
| trap chicken_cleanup INT QUIT | ||||
| 
 | ||||
| # Install required eggs | ||||
| chicken_install spiffy | ||||
| chicken_install openssl | ||||
| chicken_install postgresql | ||||
| 
 | ||||
| # Normal termination cleanup | ||||
| chicken_cleanup | ||||
|  | @ -57,7 +57,6 @@ chicken_install openssl | |||
| chicken_install spiffy | ||||
| chicken_install postgresql | ||||
| chicken_install json | ||||
| chicken_install posix-groups | ||||
| 
 | ||||
| # Normal termination cleanup | ||||
| chicken_cleanup | ||||
|  |  | |||
|  | @ -1,28 +1,4 @@ | |||
| #!/bin/sh | ||||
| # | ||||
| # build-in-qemu.sh | ||||
| # | ||||
| # Expects running armhf qemu system, builds the binary inside. | ||||
| # | ||||
| # ISC License | ||||
| # | ||||
| # Copyright 2025 Brmlab, z.s. | ||||
| # Dominik Pantůček <dominik.pantucek@trustica.cz> | ||||
| # | ||||
| # Permission to use, copy, modify, and/or distribute this software | ||||
| # for any purpose with or without fee is hereby granted, provided | ||||
| # that the above copyright notice and this permission notice appear | ||||
| # in all copies. | ||||
| #  | ||||
| # THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL | ||||
| # WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED | ||||
| # WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE | ||||
| # AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR | ||||
| # CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS | ||||
| # OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, | ||||
| # NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN | ||||
| # CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. | ||||
| # | ||||
| 
 | ||||
| if [ -z "$1" ] ; then | ||||
|     echo "Usage: $0 password" | ||||
|  |  | |||
|  | @ -1,38 +0,0 @@ | |||
| #!/bin/sh | ||||
| # | ||||
| # run-build-qemu-system.sh | ||||
| # | ||||
| # Runs the emulated armhf system for building the application. | ||||
| # | ||||
| # ISC License | ||||
| # | ||||
| # Copyright 2025 Brmlab, z.s. | ||||
| # Dominik Pantůček <dominik.pantucek@trustica.cz> | ||||
| # | ||||
| # Permission to use, copy, modify, and/or distribute this software | ||||
| # for any purpose with or without fee is hereby granted, provided | ||||
| # that the above copyright notice and this permission notice appear | ||||
| # in all copies. | ||||
| #  | ||||
| # THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL | ||||
| # WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED | ||||
| # WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE | ||||
| # AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR | ||||
| # CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS | ||||
| # OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, | ||||
| # NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN | ||||
| # CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. | ||||
| # | ||||
| 
 | ||||
| qemu-system-armhf \ | ||||
|     -machine raspi2b \ | ||||
|     -nographic \ | ||||
|     -dtb bcm2710-rpi-3-b-plus.dtb \ | ||||
|     -m 1G \ | ||||
|     -smp 4 \ | ||||
|     -kernel kernel7.img \ | ||||
|     -sd 2019-04-08-raspbian-stretch.img \ | ||||
|     -append "rw earlyprintk loglevel=8 console=ttyAMA0,115200 root=/dev/mmcblk0p2 rootdelay=1 dwc_otg.fiq_fsm_enable=0" \ | ||||
|     -usb \ | ||||
|     -device usb-net,netdev=net0 \ | ||||
|     -netdev user,id=net0,hostfwd=tcp::2222-:22 | ||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue