2019-11-08 06:53:40 +01:00
|
|
|
/*
|
2020-06-23 13:44:14 +02:00
|
|
|
|
|
|
|
Package api contains PhotoPrism REST API handlers.
|
|
|
|
|
2021-01-01 22:37:25 +01:00
|
|
|
Copyright (c) 2018 - 2021 Michael Mayer <hello@photoprism.org>
|
2020-06-23 13:44:14 +02:00
|
|
|
|
|
|
|
This program is free software: you can redistribute it and/or modify
|
|
|
|
it under the terms of the GNU Affero General Public License as published
|
|
|
|
by the Free Software Foundation, either version 3 of the License, or
|
|
|
|
(at your option) any later version.
|
|
|
|
|
|
|
|
This program is distributed in the hope that it will be useful,
|
|
|
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
|
|
GNU Affero General Public License for more details.
|
|
|
|
|
|
|
|
You should have received a copy of the GNU Affero General Public License
|
|
|
|
along with this program. If not, see <https://www.gnu.org/licenses/>.
|
|
|
|
|
2020-09-21 02:48:22 +02:00
|
|
|
PhotoPrism® is a registered trademark of Michael Mayer. You may use it as required
|
2020-06-23 13:53:11 +02:00
|
|
|
to describe our software, run your own server, for educational purposes, but not for
|
|
|
|
offering commercial goods, products, or services without prior written permission.
|
|
|
|
In other words, please ask.
|
2020-06-23 13:44:14 +02:00
|
|
|
|
|
|
|
Feel free to send an e-mail to hello@photoprism.org if you have questions,
|
|
|
|
want to support our work, or just want to say hello.
|
2019-11-08 06:53:40 +01:00
|
|
|
|
|
|
|
Additional information can be found in our Developer Guide:
|
2021-12-12 20:48:05 +01:00
|
|
|
https://docs.photoprism.app/developer-guide/
|
2019-11-08 06:53:40 +01:00
|
|
|
|
|
|
|
*/
|
|
|
|
package api
|
|
|
|
|
2019-12-02 00:30:58 +01:00
|
|
|
import (
|
2020-07-04 12:54:35 +02:00
|
|
|
"net/http"
|
|
|
|
|
|
|
|
"github.com/gin-gonic/gin"
|
2021-12-14 18:34:52 +01:00
|
|
|
|
2019-12-02 00:30:58 +01:00
|
|
|
"github.com/photoprism/photoprism/internal/event"
|
2020-07-04 12:54:35 +02:00
|
|
|
"github.com/photoprism/photoprism/internal/i18n"
|
2020-06-25 14:54:04 +02:00
|
|
|
"github.com/photoprism/photoprism/internal/service"
|
2020-07-07 10:51:55 +02:00
|
|
|
"github.com/photoprism/photoprism/pkg/txt"
|
2019-12-02 00:30:58 +01:00
|
|
|
)
|
2019-11-08 06:53:40 +01:00
|
|
|
|
2019-12-02 00:30:58 +01:00
|
|
|
var log = event.Log
|
2020-05-25 19:10:44 +02:00
|
|
|
|
2020-05-28 16:26:22 +02:00
|
|
|
func logError(prefix string, err error) {
|
2020-05-25 19:10:44 +02:00
|
|
|
if err != nil {
|
|
|
|
log.Errorf("%s: %s", prefix, err.Error())
|
|
|
|
}
|
|
|
|
}
|
2020-05-27 19:38:40 +02:00
|
|
|
|
2021-10-02 14:24:44 +02:00
|
|
|
func logWarn(prefix string, err error) {
|
|
|
|
if err != nil {
|
|
|
|
log.Warnf("%s: %s", prefix, err.Error())
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2020-06-25 14:54:04 +02:00
|
|
|
func UpdateClientConfig() {
|
|
|
|
conf := service.Config()
|
|
|
|
|
2020-06-25 01:20:58 +02:00
|
|
|
event.Publish("config.updated", event.Data{"config": conf.UserConfig()})
|
2020-05-27 19:38:40 +02:00
|
|
|
}
|
2020-07-04 12:54:35 +02:00
|
|
|
|
|
|
|
func Abort(c *gin.Context, code int, id i18n.Message, params ...interface{}) {
|
|
|
|
resp := i18n.NewResponse(code, id, params...)
|
2020-07-07 10:51:55 +02:00
|
|
|
|
2021-12-14 18:34:52 +01:00
|
|
|
log.Debugf("api: abort %s with code %d (%s)", txt.LogParam(c.FullPath()), code, resp.String())
|
2020-07-07 10:51:55 +02:00
|
|
|
|
|
|
|
c.AbortWithStatusJSON(code, resp)
|
|
|
|
}
|
|
|
|
|
|
|
|
func Error(c *gin.Context, code int, err error, id i18n.Message, params ...interface{}) {
|
|
|
|
resp := i18n.NewResponse(code, id, params...)
|
|
|
|
|
|
|
|
if err != nil {
|
|
|
|
resp.Details = err.Error()
|
2021-12-14 18:34:52 +01:00
|
|
|
log.Errorf("api: error %s with code %d in %s (%s)", txt.LogParam(err.Error()), code, txt.LogParam(c.FullPath()), resp.String())
|
2020-07-07 10:51:55 +02:00
|
|
|
}
|
|
|
|
|
2020-07-04 12:54:35 +02:00
|
|
|
c.AbortWithStatusJSON(code, resp)
|
|
|
|
}
|
|
|
|
|
|
|
|
func AbortUnauthorized(c *gin.Context) {
|
|
|
|
Abort(c, http.StatusUnauthorized, i18n.ErrUnauthorized)
|
|
|
|
}
|
|
|
|
|
|
|
|
func AbortEntityNotFound(c *gin.Context) {
|
|
|
|
Abort(c, http.StatusNotFound, i18n.ErrEntityNotFound)
|
|
|
|
}
|
|
|
|
|
|
|
|
func AbortSaveFailed(c *gin.Context) {
|
|
|
|
Abort(c, http.StatusInternalServerError, i18n.ErrSaveFailed)
|
|
|
|
}
|
|
|
|
|
2020-10-04 14:21:40 +02:00
|
|
|
func AbortDeleteFailed(c *gin.Context) {
|
|
|
|
Abort(c, http.StatusInternalServerError, i18n.ErrDeleteFailed)
|
|
|
|
}
|
|
|
|
|
2020-07-04 12:54:35 +02:00
|
|
|
func AbortUnexpected(c *gin.Context) {
|
|
|
|
Abort(c, http.StatusInternalServerError, i18n.ErrUnexpected)
|
|
|
|
}
|
|
|
|
|
|
|
|
func AbortBadRequest(c *gin.Context) {
|
|
|
|
Abort(c, http.StatusBadRequest, i18n.ErrBadRequest)
|
|
|
|
}
|
|
|
|
|
|
|
|
func AbortAlreadyExists(c *gin.Context, s string) {
|
|
|
|
Abort(c, http.StatusConflict, i18n.ErrAlreadyExists, s)
|
|
|
|
}
|
2020-07-07 10:51:55 +02:00
|
|
|
|
|
|
|
func AbortFeatureDisabled(c *gin.Context) {
|
|
|
|
Abort(c, http.StatusForbidden, i18n.ErrFeatureDisabled)
|
|
|
|
}
|
2021-12-09 02:33:41 +01:00
|
|
|
|
|
|
|
func AbortBusy(c *gin.Context) {
|
|
|
|
Abort(c, http.StatusTooManyRequests, i18n.ErrBusy)
|
|
|
|
}
|