(defun create-user (user) (when-unmapped-with-update (:user (forgerie-core:user-username user)) (let* ((avatar (forgerie-core:user-avatar user)) (avatar (when avatar (if (> (* 1024 200) (forgerie-core:file-size avatar)) avatar (progn (forgerie-core:add-mapping-error :user-avatar-too-big (forgerie-core:user-username user) (format nil "User ~A's avatar is ~A, which is bigger than the allowed 200k" (forgerie-core:user-username user) (forgerie-core:file-size avatar))))))) (avatar-filename (when avatar (if (find-if (lambda (ext) (cl-ppcre:scan (format nil "~A$" ext) (forgerie-core:file-name avatar))) (list "png" "jpg" "jpeg" "gif" "bmp" "tiff" "ico" "webp")) (forgerie-core:file-name avatar) (format nil "~A.~A" (forgerie-core:file-name avatar) (cond ((cl-ppcre:scan "^image/" (forgerie-core:file-mimetype avatar)) (subseq (forgerie-core:file-mimetype avatar) 6)) (t (error (format nil "Don't know profile mimetype ~A" (forgerie-core:file-mimetype avatar))))))))) (avatar-filepath-with-mimetype (when avatar-filename (format nil "~A.~A" (forgerie-core:file-location avatar) (subseq (forgerie-core:file-mimetype avatar) 6)))) (gl-user (progn (when avatar-filepath-with-mimetype (uiop:copy-file (forgerie-core:file-location avatar) avatar-filepath-with-mimetype)) (with-open-file (avatar-bytes (if avatar (forgerie-core:file-location avatar) "/dev/null") :element-type 'unsigned-byte) ;; (when avatar-filepath-with-mimetype ;; ;; rename avatar file with its mimetype extension ;; (uiop:copy-file (uiop:copy-file source-path target-path) (uiop:copy-file source-path target-path)) ;; (with-open-file (copy-file-fd avatar-filepath-with-mimetype :direction :output ;; :if-exists :supersede ;; :if-does-not-exist :create) ;; (write-sequence (read-sequence avatar-bytes) copy-file-fd))) (make-drakma-request "users" :post `(("name" . ,(forgerie-core:user-name user)) ("email" . ,(forgerie-core:email-address (forgerie-core:user-primary-email user))) ;; Everyone must be an admin to make some of the other import things work correctly ;; and then admin must be removed after ("admin" . "true") ("reset_password" . "true") ("username" . ,(forgerie-core:user-username user)) ,@(when avatar ;; (list (cons "avatar" (list (forgerie-core:file-location avatar) ;; :content-type (forgerie-core:file-mimetype avatar) ;; :filename (drakma:url-encode avatar-filename :utf-8)))) ;; (list (cons "avatar" avatar-filename)) ;; (list (cons "avatar" (forgerie-core:file-location avatar))) ;; (list (cons "avatar" avatar-filepath-with-mimetype)) ;; (list (cons "avatar" (list avatar-bytes ;; :content-type (forgerie-core:file-mimetype avatar) ;; :filename (drakma:url-encode avatar-filename :utf-8)))) ;; `(("avatar" . ,(list (pathname (forgerie-core:file-location avatar)) ;; :content-type (forgerie-core:file-mimetype avatar) ;; :filename (drakma:url-encode avatar-filename :utf-8)))) ;; `(("avatar" . ,(list str ;; :content-type (forgerie-core:file-mimetype avatar) ;; :filename (drakma:url-encode avatar-filename :utf-8)))) ))))))) (mapcar (lambda (email) (post-request (format nil "/users/~A/emails" (getf gl-user :id)) `(("email" . ,(forgerie-core:email-address email))))) (remove-if #'forgerie-core:email-is-primary (forgerie-core:user-emails user))) gl-user)))